Kampis Elektroecke

Eine einfache State-Machine

Zynq FPGA

In diesem Artikel zeige ich, wie eine State-Machine in einem FPGA realisieren werden kann. 
Anschließend wird noch eine Testbench für die Schaltung entwickelt und anschließend wird die Schaltung im FPGA getestet.

Die Schaltung:

Als Schaltung möchte ich einen 2-Bit Zähler realisieren, der zusätzlich über zwei Eingänge verfügt. Für die Eingänge soll folgendes gelten:

E1E0Funktion
00+1
01+2
10-2
11-1

Den ganzen Ablauf habe ich dann noch mal in einem Übergangsdiagramm dargestellt:

Dieses Zustandsübergangsdiagramm vereinfacht den Schaltungsentwurf ein ganzes Stück. Man erkennt an den Pfeilen wunderbar, welche Bedingungen bei einem Takt, also einem Wechsel von dem einen Zustand in den anderen, erfüllt sein müssen.
Mit dieser Grundlage kann nun der VHDL-Code entworfen werden.

Der VHDL-Code:

Da ich für den Takt zum wechseln der Zustände einen Taster nehmen möchte, benötige ich meine Debounce-Schaltung inkl. Clock-Divider. Beide VHDL-Datei werden in das Projekt für die State-Machine importiert.
In dem Top-File der State Machine definiere ich nun einen Variablentypen namens State_Type und lege mit ihm fest wie viele Zustände meine State-Machine besitzt:

Da die State-Machine bis vier zählen soll, werden dem entsprechend vier Zustände benötigt, wobei jeder Zustand einen Wert anzeigt.
Anschließend erzeuge ich eine weitere Variable vom Typ State_Type, welche nachher den aktuellen Zustand der State-Machine beinhalten soll:

Diese Variable wird außerdem direkt mit dem Startwert S0, sprich dem ersten Zustand, initialisiert.
Mit Hilfe einer Select-Case Abfrage wird der Ausgang, abhängig vom aktuellen Zustand, geschaltet. Dieser Block bildet das Ausgangsnetzwerk der State-Machine:

Die Zustände werden in einem zweiten Prozess gesetzt. Innerhalb dieses Prozesses speichert die Variable NextState den neuen Zustand der State-Machine.
Bei jedem Tastendruck wird der Wert der Variable NextState abhängig von der Schalterstellung auf den nächsten Zustand gesetzt.
Abhängig von den Schalterstellungen springt die Schaltung dann in den entsprechenden anderen Zustand, woraufhin ein neuer Ausgabewert angezeigt wird:

Im letzten Schritt werden noch die Entprellschaltung und der Clock-Divider instantiiert:

Damit wäre die Schaltung fertig und kann getestet werden.

Erstellen einer Testbench:

Die Schaltung kann man am besten im Simulator testen. Bevor der Test aber losgeht, muss eine Testbench erstellt werden, die das Testszenario für die Schaltung festlegt.
Dazu wird als aller erstes dem Projekt eine neue Simulation Source hinzugefügt.

Das Schreiben der Testbench geschieht ebenfalls in VHDL.
Dazu wird als erstes mit der Zeile

die Taktperiode für die Simulation festgelegt. Im nächsten Schritt kann dann mit einem einzelnen Prozess der Systemtakt für die Simulationsschaltung generiert werden:

Anschließend wird die zu testende Schaltung instantiiert:

Damit wären die allgemeinen Vorbereitungen für die Testbench abgeschlossen und das eigentliche Testszenario kann entwickelt werden.
Als Testszenario habe ich einfach mal ein paar Pulse, welche die Tastendrücke simulieren, mit unterschiedlicher Länge und unterschiedlicher Pause definiert:

Dieser Prozess zur Pulserzeugung wird jetzt noch in die Architektur der Testbench eingefügt. Damit wäre die Testbench komplett und die Simulation kann gestartet werden. Als Simulationszeit habe ich 8 Sekunden gewählt.
Je nach Leistung des Rechners dauert die Simulation unterschiedlich lange (bei mir dauert sie z. B. gute 2 Minuten).
Am Ende erhält man dann dieses Bild:

Anhand dieser Simulation kann man auch schön sehen, dass die 20 ms Pulse alle von der Debounce Schaltung unterdruckt werden.
Wenn man sich jetzt die Zustände der Ausgänge anschaut und die Simulation Schritt für Schritt durch geht sieht man schnell, dass die Schaltung genau die Funktion besitzt, die sie besitzen soll.

→ Zurück zu FPGA + VHDL


Letzte Bearbeitung: 16.03.2018

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.