www.mikrocontroller.net

Forum: FPGA, VHDL & Co. inout?


Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (Gast)
Datum:

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

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnsn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johnsn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.