28 / 37 · Konzept
Zustandsautomaten: Zustand, Transition und Ausgabe trennen
FSM aus Tabellen entwerfen und Moore/Mealy, illegale Zustände und Anforderungsregeln vergleichen.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Zustand fasst nur die nötige Vergangenheit zusammen
Wenn aktuelle Eingaben den Ausgang nicht vollständig bestimmen, definieren wir gespeicherten Zustand. Statt der ganzen Historie unterscheiden wir nur Informationen, die das zukünftige Verhalten beeinflussen.
Betrachten wir einen Arbeitscontroller: IDLE wartet auf eine Anforderung, BUSY verarbeitet sie, DONE meldet einen Zyklus lang den Abschluss.
| Zustand | Bedingung | Folgezustand | busy | done |
|---|---|---|---|---|
| IDLE | start=0 | IDLE | 0 | 0 |
| IDLE | start=1 | BUSY | 0 | 0 |
| BUSY | work_done=0 | BUSY | 1 | 0 |
| BUSY | work_done=1 | DONE | 1 | 0 |
| DONE | Immer | IDLE | 0 | 1 |
busy und done sind Ausgänge des aktuellen Zustands. Wird in BUSY Abschluss erkannt, wechselt der Zustand nach der Flanke nach DONE und done wird 1. Dies ist eine Moore-Ausgabe.
Jede Spalte dokumentiert eine steigende FlankeSteigende Flanke Übergang des Takts von 0 auf 1. Nicht zu verwechseln mit dem gesamten hohen Pegelintervall CLK=1. Mehr erfahren. Eingänge gelten unmittelbar davor, Zustände mit „after“ unmittelbar nach der Aktualisierung. Die Spalten zeigen die Reihenfolge der Abtastungen, keine physische LaufzeitLaufzeit Zeit nach einer Eingangsänderung, bis der Ausgang auf dem richtigen Wert stabil ist. Logische Äquivalenz und zeitliche Eigenschaften sind getrennte Aussagen. Mehr erfahren. Anfangs IDLE. Nach Annahme von work_done wird DONE erreicht und done=1. Auf DONE folgt unabhängig von start IDLE.
Wellenformdaten anzeigen
| Signal | Wellenform | Buswerte |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| state after | 2.34 | BUSY → DONE → IDLE |
| busy after | 1.0. | |
| done after | 0.10 |
RTL trennt Transition und Speicherung
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;
state_t state, next_state;
always_comb begin
next_state = state;
case (state)
IDLE: if (start) next_state = BUSY;
BUSY: if (work_done) next_state = DONE;
DONE: next_state = IDLE;
default: next_state = IDLE;
endcase
end
always_ff @(posedge clk)
if (rst) state <= IDLE;
else state <= next_state;
assign busy = (state == BUSY);
assign done = (state == DONE);Das SystemVerilog-Beispiel erläutert die Steuerstruktur. Die Erzeugung von work_done im angeschlossenen Verarbeiter und die Eingangssynchronisation sind gesondert zu implementieren.
Leicht übersehene Spezifikationsfragen
Diese Schaltung ignoriert start in BUSY und DONE. Soll gleichzeitig mit Abschluss eine neue Anforderung angenommen werden, muss zuerst die Tabelle geändert werden. Mealy-Ausgänge nutzen Zustand und aktuelle Eingabe und können schnell reagieren, benötigen aber Prüfung von Timing und Glitches. Binär- oder One-hot-CodierungOne-hot Darstellung mit genau einer 1 unter mehreren Bits. Die Variante, die auch nur Nullen erlaubt, heißt one-hot-or-zero. Mehr erfahren und Moore/Mealy sind unabhängige Entscheidungen.
Selbst ausprobieren
In DONE kommt start=1 für einen Zyklus. Beginnt sofort neue Arbeit? Was muss für aufeinanderfolgende Aufträge geändert werden?
Erklärung lesen
Die Tabelle führt DONE→IDLE und nimmt die Anforderung nicht an. Ändern Sie DONE bei start zu BUSY oder speichern Sie Anforderungen in einem Protokoll. Pulsdauer von done und Annahmezeit müssen zur neuen Spezifikation geprüft werden.