mikrocontroller.net

Forum: FPGA, VHDL & Co. Entprellung im Drehgeber-Beispiel


Autor: Michael Haberler (mah)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich krabble die VHDL-Lernkurve und sehe mir 
http://www.mikrocontroller.net/articles/Drehgeber#... 
an, da steht:

-- Abtastung und Verzoegerung der Quadratursignale

process(clk)
begin
  if rising_edge(clk) then
    a_in  <= A;
    a_old <= a_in;
    b_in  <= B;
    b_old <= b_in;
  end if;
end process;


wenn das sequentiell abläuft, dann ist a_old immer gleich a_in (b_in und 
b_old detto), was die Entprellung funktionslos macht (?)

sollte es nicht heissen:

process(clk)
begin
  if rising_edge(clk) then
    a_old <= a_in;
    a_in  <= A;
    b_old <= b_in;
    b_in  <= B;
  end if;
end process;

-Michael

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Signalen wird die Zuweisung erst am Ende des Prozesses ausgeführt, 
somit ist die Reihenfolge egal.

Autor: Kuckuck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wenn das sequentiell abläuft

So sollte man das formulieren. Aber was hat das mit VHDL zu tun?

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

Bewertung
0 lesenswert
nicht lesenswert
> ich krabble die VHDL-Lernkurve
Offenbar kommend aus der Software-Ecke ;-)

Ein paar kleine Worte zu Andreas kompakter Zusammenfassung:
Bei Signalen gibt es im Prozess ein vorher und nachher. Vorher ist 
alles rechts vom Zuweisungspfeil, nachher das Signal links davon. 
Wäahrend des Prozesses behalten alle Signale den Wert von vorher. Am 
Ende des Prozesses (oder beim nächsten wait) werden die berechneten 
Werte zugewiesen.
Sieh dir diesen Code an:
process(clk)
begin
  if rising_edge(clk) then
-- nachher   |  vorher
      a_in  <= B and A;
      b_in  <= B or A;
      a_old <= a_in;
      b_old <= b_in;
      b_in  <= B;
      a_in  <= A;
  end if;
end process;  --- erst hier erfolgt die Zuweisung
Auch mit diesem Code wird die Entprellung problemlos funktionieren, weil 
a_in und b_in immer nur den Wert von A und B zugewiesen wird.

BTW:
Mit Variablen hättest du dein erwartetes sequentielles Verhalten. Aber 
vor du dich jetzt vor Freude überschlägst: du wirst diverse unschöne 
andere Probleme bekommen  :-(

Autor: Selbständiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht sollte man sich mal von der abstrakten Prozessebene lösen und 
einfach mal darlegen, dass "vorher" vor dem FF bedeutet und "nachher" 
hinter dem FF, also ein neues Signal.

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

Bewertung
0 lesenswert
nicht lesenswert
> dass "vorher" vor dem FF bedeutet und "nachher" hinter dem FF
Richtig, ein
  if rising_edge(clk) then
beschreibt ein D-Flipflop, und die ganzen Zuweisungen "vorher" 
beschreiben irgendwelche Logik und/oder Verdrahtung am FF-Eingang. 
"Nachher" ist ganz einfach der FF-Ausgang.

Etwas schwieriger wirds dann schon bei einem kombinatorischen Prozess:
process(A,B)
begin
-- nachher   |  vorher
      a_in  <= B and A;
      b_in  <= B or A;
      b_in  <= B;
      a_in  <= A;
end process;  --- erst hier erfolgt die Zuweisung
hier ist b_in = B und a_in = A.
Allerdings ist dieses Beispiel ziemlich witzlos, weil keinerlei 
Verzögerung oder Speicherung modelliert wird. Dieser Prozess ist 
gleichbedeutend mit diesen Concurrent-Zuweisungen:
   b_in  <= B;
   a_in  <= A;

> Vielleicht sollte man sich mal von der abstrakten Prozessebene lösen
Ich denke schon ganz automatisch "in Hardware", und deshalb war mir 
schon beim Schreiben klar, war "vorher" und "nachher" ist. Aber du hast 
recht, die VHDL als Sprache für die Hardwaresynthese verleitet zu 
abstrakten Ansichten.
In der FPGA-Hardware gibt es (vereinfacht) nur Flipflops und LUTs 
(Logik). Und nur das kann aus einer VHDL-Beschreibung synthetisiert 
werden.

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.