Hallo zusammen,
ich habe folgendes Problem.
Ich habe drei entity, mit je einem INOUT Port u.a.
1
entityEntity1is
2
port(
3
Port1:INOUTstd_logic;
4
);
5
endentityEntity1;
6
-------------------------------
7
entityEntity2is
8
port(
9
Port2:INOUTstd_logic;
10
);
11
endentityEntity1;
12
-------------------------------
13
entityEntity3is
14
port(
15
Port3:INOUTstd_logic;
16
);
17
endentityEntity1;
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
entityMuxis
2
port(
3
signal:INstd_logic;
4
Port1:INOUTstd_logic;
5
Port2:INOUTstd_logic;
6
Port3:INOUTstd_logic;
7
);
8
endentityMux;
9
architecturertlofMuxis
10
begin
11
ifsignal='1'then
12
Port2<=Port1;
13
else
14
Port3<=Port1;
15
endif;
16
endarchitecturertl;
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
ifsignal='1'then
2
Port2<=Port1;
3
Port1<=Port2;
4
else
5
Port3<=Port1;
6
Port1<=Port3;
7
endif;
Oder anders gefragt:
Wie beschreibe ich eine bidirektionale 1zu1 Verbindung in VHDL?
Vielen Dank!
André
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...
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...
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 :(
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...
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é
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.
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...
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...
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".
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...
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?
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
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é
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