Bidirektional in_out

Gast #1156181
Lesenswert?

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.
Gast #1156437
Lesenswert?

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.
Gast #1156548
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #1156591
Lesenswert?

@ 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.
Gast #1156692
Lesenswert?

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.
#1156704
Lesenswert?

@ 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
Moderator (Firma: Titel) Persönliche Seite #1156738
Lesenswert?

>> 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;

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