Hallo, bin Anfänger in VHDL und arbeite mich gerade in das Thema ein. Wie kann ich einen Portpin bidirektional nutzen, so das er mal als Ausgang und mal als Eingang genutzt werden kann? z.b. A ist Eingang B ist Bidirektional C ist Bidirektional Wenn A 1 ist, dann soll B ein Eingang sein und das anliegende Signal nach Ausgang C schalten. Wenn A 0 ist, dann soll C ein Eingang sein und das anliegende Signal nach Ausgang B schalten. Also über A wird vorgegeben, welche Direktion B und C hat.
1 | entity Component is |
2 | |
3 | port ( |
4 | a: in std_logic; |
5 | b: inout std_logic; |
6 | c: inout std_logic |
7 | );
|
8 | |
9 | end Component; |
10 | |
11 | architecture behave of Component is |
12 | |
13 | b <= c when a=0 else 'Z'; |
14 | c <= b when a=1 else 'Z'; |
15 | |
16 | end behave |
MFG Falk
Eine andere Variante ist es ein Hilfssignal zu deklarieren und das dann dem Ein- oder Ausgang zuzuweisen. z.B: signal hilfe : std_logic; process (a) begin if a = '0' then hilfe <= b; c <= hilfe; else hilfe <= c; b <= hilfe; end if; end process; Probier mal aus, muss eigentlich gehen. Mfg Artem.
Hallo, dein code mit hilfs-signal scheint mir etwas falsch zu sein, so wirst du ungewollt irgend ein latch einbauen, weil hilfe und b nicht in der sensitivity-list stehen. Zudem hast du das problem das du nie den Wert 'Z' auf den Ausgang zuweist. 'Z' ist ja bekanntlich high-Impedanz process (a, b, c) begin if a = '0' then b <= 'Z' c <= b; else b <= c; c <= 'Z'; end if; end process; also so machen, wenns schon so sein soll. lg Azrael
@ Azrael
> so wirst du ungewollt irgend ein latch einbauen ...
... weil bei a='0' dem Signal b nichts zugewiesen wird,
und weil bei a='1' dem Signal c nichts zugewisen wird.
Man könnte ohne das unnötige Hilfs-Signal auch schreiben:
1 | process (a,b,c,hilfe)begin |
2 | if a = '0' then |
3 | c <= b; |
4 | else
|
5 | b <= c; |
6 | end if; |
7 | end process; |
Dann sieht man das Latch klar und deutlich.
Das Latch wird aber nicht eingebaut...
> ...weil hilfe und b nicht in der sensitivity-list stehen.
Die Sensitivity-List wird nur von der Simulation verwendet.
Falls die Synthese auf eine unvollständige Liste trifft, wird sie dir
lediglich ein paar Warnungen servieren.
Die Beschreibungen von Falk und Azrael sind genau die gleichen, nur
einmal Sequential und einmal Concurrent. Und die kompaktere Schreibweise
zusammen mit der geringeren Fehlerwahrscheinlichkeit (Sens-List) spricht
für die Lösung von Falk.
Hallo, danke für eure Beispiele. Habe da noch die ein oder andere Frage. Beispiel Falk Brunner ---------------------------------------------------------------------- entity Component is port ( a: in std_logic; b: inout std_logic; c: inout std_logic ); end Component; architecture behave of Component is b <= c when a=0 else 'Z'; c <= b when a=1 else 'Z'; end behave ---------------------------------------------------------------------- kann sich hinter a auch was anderes als ein Bit stehen? Wenn a 1Bit (ein Eingangspin) ist, dann kann dieser nur den logischen Zustand a=0 oder a=1 haben. a=2 kann nicht vorkommen. Kann man hier nicht den else 'Z' Zweig weglassen? Beispiel Lothar Miller --------------------------------------------------------------------- process (a,b,c,hilfe)begin if a = '0' then c <= b; else b <= c; end if; end process; ---------------------------------------------------------------------- Vermute das hier (process) ist sequential und das obige ist concurrent. Das habe ich noch nicht so verinnerlicht. Letzten Endes werden doch auf dem CPLD irgendwelche Logikgatter untereinander verbunden. Ein concurrentes ablaufen unter beachtung von Gatterlaufzeiten kann ich mir da gut vorstellen. Wie muß ich mir das sequentielle ablaufen ohne Takt vorstellen? Das kenne ich nur vom uC.
@ Gast (Gast) Keliner Fehler, es muss so heissen. b <= c when a='0' else 'Z'; c <= b when a='1' else 'Z'; >kann sich hinter a auch was anderes als ein Bit stehen? Es kann jede beliebige logische Bedingung ausgewertet werden. >Kann man hier nicht den else 'Z' Zweig weglassen? Nein. >Wie muß ich mir das sequentielle ablaufen ohne Takt vorstellen? Ist genauso wie concurrent, nur etwas andere Schreibweise. MFG Falk
>> c <= b when a='1' else 'Z'; > Kann man hier nicht den else 'Z' Zweig weglassen? Genau der else-Zweig sorgt dafür, dass die Richtung umgeschaltet wird und verhindert, dass ein Speicherelement eingebaut wird. Was ergäbe diese Zeile:
1 | c <= b when a='1'; |
Der letzte Zustand von b würde in c gespeichert, wenn a='0' wäre. Das ist ein klassisches Latch. > kann sich hinter a auch was anderes als ein Bit stehen? Der Vergleich a='1' kann auch ein Vektor-Vergleich (vekt="00110") sein, oder eine Zahl (int_zahl=10002) oder sonst irgendwas... Der Vergleich muß (genau wie bei einer if-Abfrage) true oder false zurückgeben. >Wie muß ich mir das sequentielle ablaufen ohne Takt vorstellen? Das ist im Prozess kein Ablaufen von oben nach unten. Der Prozess wird einmal komplett durch gemacht, und alle Werte gleichzeitig zugewiesen. Ich kann also:
1 | process (a, b, c) |
2 | begin
|
3 | if a = '0' then |
4 | b <= 'Z' |
5 | c <= b; |
6 | else
|
7 | b <= c; |
8 | c <= 'Z'; |
9 | end if; |
10 | end process; |
ohne jede Funktionsänderung auch so schreiben:
1 | process (a, b, c) |
2 | begin
|
3 | if a = '0' then |
4 | c <= b; --+ |
5 | b <= 'Z' --+ getauscht |
6 | else
|
7 | c <= 'Z'; --+ |
8 | b <= c; --+ |
9 | end if; |
10 | end process; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.