mikrocontroller.net

Forum: FPGA, VHDL & Co. Bidirektional in_out


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

MFG
Falk

Autor: jorjo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Azrael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
  process (a,b,c,hilfe)begin
    if a = '0' then
      c <= b;
    else
      b <= c;
    end if;
  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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
   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:
process (a, b, c)
begin
  if a = '0' then
    b <= 'Z'
    c <= b;
  else
    b <= c;
    c <= 'Z';
  end if;
end process;
ohne jede Funktionsänderung auch so schreiben:
process (a, b, c)
begin
  if a = '0' then
    c <= b;   --+
    b <= 'Z'  --+ getauscht
  else
    c <= 'Z'; --+
    b <= c;   --+
  end if;
end process;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.