Forum: FPGA, VHDL & Co. inout?


von mr.chip (Gast)


Lesenswert?

Hallo

Ich plage mich gerade mit einem als inout definierten Pin herum...

Eigentlich sollte doch diese Anweisung die Daten von data_in nach 
data_inout schreiben: data_inout <= data_in;

Tut sie auch, aber nur so lange data_inout als out definiert ist. Ist es 
ein inout, so funktioniert es nicht. Seltsam, oder habe ich irgend etwas 
vergessen? (Bzw. noch keine Kenntnisse davon.)

Gruss

Michael

von stephan (Gast)


Lesenswert?

Hallo, hast du denn alle drei Zustände von data_inout definiert??

Der dritte Zustand ist ja high Z!!

Die Zeile gibt Daten aus
data_inout <= data_in;

irgendwo in deinem Quelltext steht bestimmt auch eine Dateneingabe.....
aber hast du auch definiert wie data_inout sich verhalten soll wenn nix
ein- oder ausgeben werden soll???

In diesem Fall mußt du dieses Signal auf high_z setzten!!!

data_inout <= 'Z' ;

Dann sollte es funktionieren

Gruß Stephan

von Klaus Falser (Gast)


Lesenswert?

Was funktioniert nicht?
Funktioniert die Schaltung nicht, oder gibt es beim compilieren einen 
Fehler?

von mr.chip (Gast)


Lesenswert?

> Was funktioniert nicht?
> Funktioniert die Schaltung nicht, oder gibt es beim compilieren einen
> Fehler?

Es gab in der Simulation einen Fehler, jetzt allerdings geht es.


> aber hast du auch definiert wie data_inout sich verhalten soll wenn nix
> ein- oder ausgeben werden soll???

> In diesem Fall mußt du dieses Signal auf high_z setzten!!!

> data_inout <= 'Z' ;


Auf Z nur dann, wenn gar nix passiert? Bedarf es noch irgendwelchen 
Vorkehrungen, wenn ich von Eingabe auf Ausgabe bzw. umgekehrt umschalte?

von Klaus F. (kfalser)


Lesenswert?

Es ist wie bei richtiger Hardware.
Auf 'Z' (hochohmig) wird geschalten, wenn an den Pin von außen ein 
Signal gelegt wird, wenn also der FPGA/CPLD beschrieben wird.
Wenn der Chip gelesen wird, d.h. wenn das FPGA/CPLD das Signal auf dem 
externen Bus bestimmen soll, dann wird nicht 'Z', sondern eben das 
gewünschte Signal an den inout port geschalten.

von Johnsn (Gast)


Lesenswert?

@mr.chip:

Ich habe das gleiche Problem, dass ich einen inout-Port nicht zuweisen 
kann. Was hast du gemacht, dass es funktioniert hat?

@all:

Ich habe folgendes versucht (syntax könnte event. fehler enthalten, es 
geht nur um die funktionsweise. und bitte seht davon ab, dass read, 
write keine gültigen variablennamen sind):

--------------------------------------------------------------------
entity Modul_1 is
 port (iopin : inout std_logic);
end Modul_1;

architecture bhv of Modul_1 is
 signal read    : std_logic;
 signal write   : std_logic := '1';
 signal wenable : std_logic := '0';
begin

 read  <= iopin;
 iopin <= write when wenable = '1' else 'Z';

 process is
 begin
  wait for 10 ns;
  wenable <= '1';
  wait for 10 ns;
  wenable <= '0';
  wait until read = '0';
  report "module 2 done its job" severity note;
  wait;
 end process;

end bhv;


entity Modul_2 is
 port (iopin : inout std_logic);
end Modul_2;

architecture bhv of Modul_2 is
 signal read    : std_logic;
 signal write   : std_logic := '0';
 signal wenable : std_logic := '0';
begin

 read  <= iopin;
 iopin <= write when wenable = '1' else 'Z';

 process is
 begin
  wait until read = '1'
  report "module 1 done its job" severity note;
  wait for 50 ns;
  wenable <= '1';
  wait for 10 ns;
  wenable <= '0';
  wait;
 end process;

end bhv;

entity testbench is
end testbench;

architecture bhv of Modul_2 is
 signal iosignal : std_logic;
begin

 instance : module_1
  port map (iopin => iosignal);

 instance : module_2
  port map (iopin => iosignal);

end bhv;
--------------------------------------------------------------------

Eigentlich müsste ja jetzt zuerst Modul 1 den io-Port auf high ziehen 
und danach den Port wieder freigeben. Dann ist Modul 2 an der Reihe, 
zieht den io-Port auf Low und gibt in nach 10 ns wieder frei. Allerdings 
werden in der Simulation (mit Modelsim) die Portveränderungen in den 
betreffenden Modulen (entities) nicht verzeichnet. Kann mir jemand 
sagen, was ich da falsch gemacht habe?

mfg
Johnsn

von Johnsn (Gast)


Lesenswert?

Rückzug!

Ich ziehe den Beitrag zurück!

Der Code den ich gepostet habe, funktioniert "komischerweise" doch. Ich 
hatte einfach den komplexen VHDL-Code on-the-fly vereinfacht und dabei 
ist dann doch was richtiges rausgekommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.