INOUT Port miteinander verknüpfen

Gast #3123104
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é
Moderator (Firma: Titel) Persönliche Seite #3123138
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...
Gast #3123210
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é
Gast #3123972
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.
Gast #3124108
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...
Gast #3124323
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
Gast #3124472
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".
Gast #3124517
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?
Gast #3130375
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é
Gast #3131363
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren