[[dtpr_versuch_4]]

This is an old revision of the document!


In diesem Versuch werden Zustandsautomaten als sequentielle Schaltungen eingeführt. Das Thema der sequentiellen Schaltungen wird vertieft.

Ziel des Versuchs

Das Ziel des Versuchs ist der systematische Entwurf von einfachen Zustandsautomaten auf Basis von Moore und Mealy, der Entwurf von gekoppelten Automaten und die Umsetzung in VHDL.

Die Flankenerkennung

Im letzten Versuch wurde eine Flankenerkennung vorgestellt. In diesem Versuch soll die Flankenerkennung systematisch als Moore Automat entworfen werden. Die Flankenerkennung hat einen Eingang “key_i” und einen Ausgang “edge_o”. Die Flankenerkennung wird an den Zähler mit Enable aus dem letzten Versuch angeschlossen. Die Flankenerkennung wird dazu verwendet, jedesmal wenn die Taste “KEY(0)” gedrückt wird, den Zähler um eins hochzuzählen.

Ein- und Ausgänge der Flankenerkennung

Die Flankenerkennung soll für die Dauer eines Taktes den Ausgang “edge_o” auf “1” setzen, wenn sich das Eingangssignal von “0” auf “1” ändert.

 Timingdiagramm der Flankenerkennung

Das Timingdiagramm zeigt die gewünschte Funktion der Schaltung zur Flankenerkennung. Das Zustandsdiagramm ist im folgenden Bild dargestellt.

Zustandsdiagramm der Flankenerkennung

Der Automat hat drei Zustände: “Start”, “Eins” und “Null”. Der Automat startet nach dem Reset im Zustand “Start”. Das Ausgangssignal “edge_o” ist mit einem Schrägstrich “/” getrennt nach dem Zustandsnamen dargestellt. Der Automat bleibt im Zustand “Null”, wenn am Eingang “key_i” nur Nullen auftreten. Der Automat wechselt in den Zustand “Eins”, wenn er im Zustand “Null” ist und am Eingang “key_i” eine “1” erscheint. Aus dem Zustand “Eins” wechselt der Automat unabhängig vom Eingang in den Zustand “Null”. Der Ausgang “edge_o” geht auf “1”, wenn der Automat im Zustand “Eins” ist.

Der Zähler mit Enable aus dem letzten Versuch soll jetzt mit dem Zustandsautomaten zur Flankenerkennung gesteuert werden. Der Code ist hier zu finden:

Code für die Flankenerkennung

Aufgaben Teil 1

  1. Legen Sie ein Verzeichnis “p1” an.
  2. Laden Sie den Code für die Flankenerkennung in das Verzeichnis “p1”.
  3. Kopieren Sie das Module “bin2seg.vhd” aus einem der vorherigen Versuche in dieses Verzeichnis.
  4. Simulieren Sie die Schaltung mit Modelsim
  5. Der VHDL Code in “edge.vhd” gibt das Zustandsdiagramm oben wieder. Erläutern Sie warum dieser Automat nicht wie gewünscht funktioniert und ändern Sie den Automaten so ab, dass er funktioniert. Zeichnen Sie das korrekte Zustandsdiagramm.
  6. Korrigieren Sie den Code in “edge.vhd” analog zu Ihrem neuen Zustandsdiagramm.
  7. Verifizieren Sie die Funktion im Simulator.
  8. Laden Sie das Design auf das FPGA und überprüfen Sie die Funktion auf dem FPGA.

Dekodieren eines Quadratur Encoders

Bei der nächsten Aufgabe geht es um das Dekodieren eines Quadratur Encoders. Eine solcher Encoder dient zur Auswertung von Drehbewegungen. Im folgenden Bild ist die Funktion eines solchen Encoders skizziert.

Funktion eines Quadrakturenkoders

In diesem Beispiel ist ein inkrementeller optischer Encoder dargestellt. Auf einer transparenten Scheibe sind im Abstand d lichtundurchlässige Flächen mit der Länge d aufgebracht. Oberhalb der Scheibe befindet sich eine Leuchte. Unterhalb der Scheibe sind zwei Sensoren S1 und S2 im Abstand 1,5 d angeordnet. Aus dem Verlauf der Signale der Sensoren S1 und S2 lässt sich die Drehrichtung und die Drehgeschwindigkeit bestimmen. Informationen über die Drehbewegung lassen sich nur ermitteln, wenn es zu einer Änderung des Ausgangssignals bei einem der Sensoren kommt.

An das FPGA soll ein solcher Quadraturenkoder angeschlossen werden. Je nach Drehrichtung soll ein Zähler hoch- oder runterzählen. Der Zählerstand soll wie bislang an der 7-Segment Anzeige angezeigt werden.

Übersicht über den Quadraturdekoder

In diesem Bild ist der Verschaltung der einzelnen Komponenten dargestellt.

Aufgabe Teil 2

Es wird ein Vorwärts-/Rückwärtszähler benötigt. Dieser Zähler soll in diesem Aufgabenteil entworfen werden. Verwenden Sie für den Test den folgende Code für Testbench und Toplevel für den Countertest

  1. Legen Sie ein neues Verzeichnis “p2” an.
  2. Modifizieren Sie den Counter derart, dass er hochzählt, wenn der Eingang “up_i = 1” ist und runterzählt, wenn “up_i” = “0” ist. Der Zähler soll weiterhin nur zählen, wenn enable_i = “1” ist.
  3. Verifizieren Sie die Schaltung mit dem Simulator
  4. Testen Sie den Code auf dem FPGA. Der Toplevel ist so aufgebaut, dass “up_i” mit KEY(2) verbunden ist.

Aufgabe Teil 3

Die Flankenerkennung “edge” muss erweitert werden und die fallende und steigende Flanke erkennen können. Die Flankenerkennung hat dann zwei Ausgänge. Der Ausgang “rising_edge_o” wird bei einem 01 Übergang von “key_i” aktiviert. Der Ausgang “falling_edge_o” wird bei einem 10 Übergang an “key_i” aktiviert. Verwenden Sie folgenden Code für Testbench und Toplevel für die Erweiterung von edge.

  1. Legen Sie ein Verzeichnis p3 an.
  2. Zeichnen Sie ein Zustandsdiagramm für einen Automaten mit dem dem Sie sowohl 01 also auch 10 Übergänge erkennen können.
  3. Modifizieren Sie den VHDL Code von edge gemäß dieses Zustandsdiagramms.
  4. Prüfen Sie die Funktion im VHDL Simulator

Aufgabe Teil 4

Benutzen Sie den folgenden Code für qdec. Die Beschreibung des Terasicboards ist hier:

https://www2.hs-augsburg.de/~haf/secure/prototypeboards/DE1_UserManual_v1018.pdf

  1. Legen Sie ein Verzeichnis p4 an.
  2. Entwerfen Sie das Zustandsdiagramm für den Automaten “qdec”. Die Eingänge des Automaten sind: s1, s2, rising_edge_s1, falling_edge_s1, rising_edge_s2 und falling_edge_s2.
  3. Implementieren Sie den Automaten in der VHDL Datei “qdec.vhd”
  4. Prüfen Sie die Funktion im VHDL Simulator.
  5. Schließen Sie den Encoder an den Stecker GPIO_1 an. Der Encoder benötigt eine 3,3V Spannungsversorgung, die auch auf dem GPIO_1 Steckerfeld verfügbar ist. Die Steckerbelegung ist im Handbuch zum Board zu finden.
  6. Laden Sie die Schaltung auf das FPGA und prüfen Sie die Funktion auf dem FPGA.
  • dtpr_versuch_4.1291584140.txt.gz
  • Last modified: 2010/12/05 22:22
  • by beckmanf