Forum: FPGA, VHDL & Co. Bidirektional in_out


von Gast (Gast)


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.

von Falk B. (falk)


Lesenswert?

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

von jorjo (Gast)


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.

von Azrael (Gast)


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

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


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.

von Gast (Gast)


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.

von Falk B. (falk)


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

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


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;

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.