Altifigence Academy

28 / 37 · Konzept

Zustandsautomaten: Zustand, Transition und Ausgabe trennen

FSM aus Tabellen entwerfen und Moore/Mealy, illegale Zustände und Anforderungsregeln vergleichen.

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.

Sk+1=F(Sk,Xk)S_{k+1}=F(S_k,X_k)

Betrachten wir einen Arbeitscontroller: IDLE wartet auf eine Anforderung, BUSY verarbeitet sie, DONE meldet einen Zyklus lang den Abschluss.

ZustandBedingungFolgezustandbusydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONEImmerIDLE01

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.

Moore-Ausgänge folgen dem aktuellen Zustand
Wellenformdaten anzeigen
Wellenformdaten: Jedes Zeichen steht für ein Intervall, ein Punkt hält den vorherigen Zustand und p ist ein Taktzyklus.
SignalWellenformBuswerte
edge2345E0 → E1 → E2 → E3
start10.1
work_done0.10
state after2.34BUSY → DONE → IDLE
busy after1.0.
done after0.10

RTL trennt Transition und Speicherung

SystemVerilog
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.

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.