Eine einfache State-Machine

Zynq FPGA

In diesem Artikel zeige ich euch, wie ihr eine einfache State-Machine in einem FPGA realisieren könnt. Ich zeige euch wie ihr die State-Machine plant und sie anschließend in VHDL umsetzen könnt.
Danach 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:

State Machine(1)
Dieses Übergangsdiagramm vereinfacht den Schaltungsentwurf noch mal etwas. 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:

Die Zustände werden in einem zweiten Prozess gesetzt. Dieser Prozess wird durch eine steigende Flanke am Taster ausgelöst. Innerhalb dieses Prozesses wird geschaut in welchem Zustand sich die Schaltung gerade befindet und welche Schalter gerade umgelegt sind.
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 instanziiert:

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.

State Machine(2)
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:

Im nächsten Schritt wird die zu testende Schaltung instanziiert, worauf die Testbench bereits diese Form annimmt:

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 7 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:

State Machine(3)
Anhand dieser Simulation kann man auch schön sehen, dass die 20ms Pulse alle von der Debounce Schaltung geschluckt 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.
Zeit um die Schaltung auf die Hardware zu übertragen und im realen System zu testen…

 

Dokumentation:

 

-> Zurück zum FPGA + VHDL Tutorial

Schreibe einen Kommentar

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

Time limit is exhausted. Please reload CAPTCHA.