Forum: FPGA, VHDL & Co. INOUT Port miteinander verknüpfen


von André (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem.

Ich habe drei entity, mit je einem INOUT Port u.a.
1
entity Entity1 is
2
port (
3
     Port1 : INOUT std_logic;
4
     );
5
end entity Entity1;
6
-------------------------------
7
entity Entity2 is
8
port (
9
     Port2 : INOUT std_logic;
10
     );
11
end entity Entity1;
12
-------------------------------
13
entity Entity3 is
14
port (
15
     Port3 : INOUT std_logic;
16
     );
17
end entity Entity1;

Nun möchte ich im Topfile diese drei Entity instanziieren und mit Hilfe 
eines Signals immer zwei miteinander verknüpfen. Dazu erstelle ich mir 
einen Mux, der ebenfalls im Topfile instanziiert wird und die 
Umschaltung regelt.
1
entity Mux is
2
port (
3
     signal: IN std_logic;
4
     Port1 : INOUT std_logic;
5
     Port2 : INOUT std_logic;
6
     Port3 : INOUT std_logic;
7
     );
8
end entity Mux ;
9
architecture rtl of Mux is
10
begin
11
  if signal = '1' then
12
    Port2 <= Port1;
13
  else
14
    Port3 <= Port1;
15
  end if;
16
end architecture rtl;
Da nun alle Signale bidirektional sind, gewinne ich ja durch die 
Zuweisung in der if-Abfrage nichts, denn das dürfte ja immer nur in eine 
Richtung funktionieren.

Wie kann ich diese bidirektionalen Signale verknüpfen, so dass sie in 
beide Richtungen verknüpft sind?
Vielleicht so?
1
  if signal = '1' then
2
    Port2 <= Port1;
3
    Port1 <= Port2;
4
  else
5
    Port3 <= Port1;
6
    Port1 <= Port3;
7
  end if;

Oder anders gefragt:
Wie beschreibe ich eine bidirektionale 1zu1 Verbindung in VHDL?

Vielen Dank!
André

von thomas s. (Gast)


Lesenswert?

gibt es in vhdl nicht!!!!
es gibt nur in und out tristate sind verpönt verboten .. schäm dich!

von André (Gast)


Lesenswert?

Spätestens, wenn man einen I2C Bus und damit das SDA Signal zwischen 
zwei Entity umschalten will, steht man doch vor diesem Problem, oder?
Und nein, ich kann den Bus nicht parallel anschließen, weil beide Entity 
quasi die ID haben...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

thomas s. schrieb:
> gibt es in vhdl nicht!!!!
Es ist kein VHDL Problem.

André schrieb:
> Wie kann ich diese bidirektionalen Signale verknüpfen, so dass sie in
> beide Richtungen verknüpft sind?
Welche Komponente in einem CPLD/FPGA kann das?
Sowas gibt es in einer realen Hardware nicht, das ist das eigentliche 
Problem...

von André (Gast)


Lesenswert?

Hallo,

Lothar Miller schrieb:
> Sowas gibt es in einer realen Hardware nicht
Naja, ein einfaches Stück Draht bzw. ein Relais kann sowas...

Aber na gut, dann muss ich mir wohl etwas anderes einfallen lassen :(

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

André schrieb:
>> Sowas gibt es in einer realen Hardware nicht
> Naja, ein einfaches Stück Draht bzw. ein Relais kann sowas...
Naja, dann hast du da oben in VHDL ein Relais beschrieben. Das sollte 
dir der Synthesizer dann auch einbauen in dein CPLD...

von André (Gast)


Lesenswert?

Hallo,

mir fällt gerade ein, dass ich diese Umschaltung ja nicht in Hardware 
brauche. Die Umschaltung geschieht in einer Testbench, in der ich zwei 
DUT habe und meinen I2C Master entsprechend umschalten muss... es muss 
also gar nicht synthetisierbar sein ;)

Gibt es dann eine Beschreibung für ein Stück Draht?

Vielen Dank!
André

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hänge einfach beide I2C Devices parallel. So wie in der realen Hardware 
auch...   ;-)

Ein Stück Draht ist einfach eine Verbindung in der Port Map.

von Pille (Gast)


Lesenswert?

Lothar Miller schrieb:
> Ein Stück Draht ist einfach eine Verbindung in der Port Map.

Und genau das ist die Einschränkung, die es in VHDL gibt: Es gibt 
"Drahtstücke" nur in der Port map. Es ist nicht möglich, 2 Signale 
bidirektional mit einer Zuweisung zu verbinden.

Deswegen gibts bei uns in den Designregeln den Punkt, bidirektionale 
Verbindungen immer in jeweils einen in- und einen out-port 
aufzutrennen, und inouts nur auf Toplevelebene zu verwenden.

von André (Gast)


Lesenswert?

Hallo,

Pille schrieb:
> Deswegen gibts bei uns in den Designregeln den Punkt, bidirektionale
> Verbindungen immer in jeweils einen in- und einen out-port
> aufzutrennen, und inouts nur auf Toplevelebene zu verwenden.
Genau das mache ich. INOUT sind nur im Topfile verwendet, alles was 
darunter ist, hat getrennte INs und OUTs und vielleicht noch ein 
Umschaltsignal für die Buffer.

Nun habe ich in meiner Testbench aber drei Topfiles eingebunden, die ich 
entsprechend verschalten möchte. Genau da liegt das Problem.
Ich möchte auch mein Topfile nicht ändern, weil sich dadurch ja das 
reale Abbild verändert und ich keine stimmige Simulation mehr habe.

Mhm...

von Duke Scarring (Gast)


Lesenswert?

Such mal nach "VHDL zero ohm". Vielleicht hilft das an dieser Stelle 
weiter.

Duke

von Lattice User (Gast)


Lesenswert?

Wir wäre es in der Testbench einfach ein Signal deklarieren und auf alle 
Entities verbinden?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Wir wäre es in der Testbench einfach ein Signal deklarieren und auf alle
> Entities verbinden?
Das geht eben nicht für ein Relais, also eine umschaltbare 
Verbindung...

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
> Lattice User schrieb:
>> Wir wäre es in der Testbench einfach ein Signal deklarieren und auf alle
>> Entities verbinden?
> Das geht eben nicht für ein Relais, also eine /umschaltbare/
> Verbindung...

Ich habe ehrlich gesagt nicht den Eindruck dass die eigentliche 
Aufgabenstellung einen Umschalter benötigt, das basiert IMO auf einem 
Misverständniss.

Falls ich unrecht habe:

http://objectmix.com/vhdl/505992-vhdl-switch-model.html
http://www.ralf-hildebrandt.de/publication/transfergate/transfergate.vhd

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Falls ich unrecht habe:
> http://objectmix.com/vhdl/505992-vhdl-switch-model.html
> http://www.ralf-hildebrandt.de/publication/transfe...
Geht alles irgendwie auf den erwähnten ZeroOhm Code von Ben Cohen 
zurück...

von Matthias (Gast)


Lesenswert?

Pille schrieb:
> Deswegen gibts bei uns in den Designregeln den Punkt, bidirektionale
> Verbindungen immer in jeweils einen in- und einen out-port
> aufzutrennen, und inouts nur auf Toplevelebene zu verwenden.

Das ist eine weltweit verwendete Designregeln ;-)

Lothar Miller schrieb:
> Das geht eben nicht für ein Relais, also eine umschaltbare
> Verbindung...

Du musst Du nur den Zugang des Treibers einer bidir Leitung per Code 
abhängen, um ein Modul "umzuschalten" = wegzuschalten".

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Matthias schrieb:
> Du musst Du nur den Zugang des Treibers einer bidir Leitung per Code
> abhängen, um ein Modul "umzuschalten" = wegzuschalten".
Zeig das doch mal an einem Dreizeiler...

von berndl (Gast)


Lesenswert?

André schrieb:
> Nun habe ich in meiner Testbench aber drei Topfiles eingebunden, die ich
> entsprechend verschalten möchte. Genau da liegt das Problem.
> Ich möchte auch mein Topfile nicht ändern, weil sich dadurch ja das
> reale Abbild verändert und ich keine stimmige Simulation mehr habe.

Deine TB enthaelt 3 Teile, in denen jeweils ein I2C liegt (1xMaster, 
2xSlave)?

Dann einfach jeweils Clk und Data der 3 Teile verbinden und in der TB 
das Signal mit 'H' vorbelegen (High, simuliert einen Pull-up).

Dass jeweils 2 der 3 Teile an den Leitungen dann 'Z' am INOUT sind wenn 
der dritte sendet ist dir ja klar?

von Holzauge (Gast)


Lesenswert?

berndl schrieb:
> Dann einfach jeweils Clk und Data der 3 Teile verbinden und in der TB
>
> das Signal mit 'H' vorbelegen (High, simuliert einen Pull-up).
Das löst nicht das Problem der Umschaltbarkeit, die weiter oben an 
gedacht wurde

von André (Gast)


Lesenswert?

Ich hatte gerade die Idee, die Umschaltung per GENERIC zu machen.

Mit diesem GENERIC kann ich dann mit einen GENERATE den I2C Bus zum 
entsprechenden Modul weiterleiten und alle anderen Signale entsprechend 
verbinden.

Die Umschaltung muss ja nicht dynamisch erfolgen... das erleichtert die 
Sache wohl ungemein.

Nun muss ich mir nur noch die Syntax vom GENERATE anschauen. Das habe 
ich nämlich bisher noch nie so richtig verwendet.

Ich müsste es wie folgt lösen:
GENERIC = FALSE
Instanz von Modul 1 und Modul 2.
Modul 1 und Modul 2 miteinander verbinden.

GENERIC = TRUE
Instanz von Modul 1, Modul 2 und Modul 3.
Modul 1 und Modul 3 miteinander verbinden.
Modul 2 und Modul 3 miteinander verbinden.

Kann ich ein solches Konstrukt mit einem GENERATE lösen?

Damit ich den GENERIC mit einem Wert belegen kann, muss ich meinen 
eigentlichen Toplevel Testbench nochmal instanziieren. Oder kann ich das 
auch einfach mit einer Konstanten lösen?

Vielen Dank!
André

von Duke Scarring (Gast)


Lesenswert?

André schrieb:
> Ich hatte gerade die Idee, die Umschaltung per GENERIC zu machen.
Gute Idee.

> Die Umschaltung muss ja nicht dynamisch erfolgen... das erleichtert die
> Sache wohl ungemein.
Ja.

> Nun muss ich mir nur noch die Syntax vom GENERATE anschauen. Das habe
> ich nämlich bisher noch nie so richtig verwendet.
Hier findest Du ein passendes Beispiel:
http://de.wikibooks.org/wiki/VHDL#generate

> Damit ich den GENERIC mit einem Wert belegen kann, muss ich meinen
> eigentlichen Toplevel Testbench nochmal instanziieren. Oder kann ich das
> auch einfach mit einer Konstanten lösen?
Sowohl als auch. Bei einer Konstante muß jedes mal neu kompiliert 
werden. Wenn Du einen generic verwendest, kannt Du einen Defaultwert 
vorgeben.
Bei ModelSim (vsim) kann man diesen mit dem Kommandozeilenparameter -G 
überschreiben. Bei anderen Simulatoren wird es ähnliche Möglichkeiten 
geben.

Duke

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.