FSM für vordefinierten Prozess (Zeichnen des Zustandsdiagramms)

Lassen Sie mich zunächst sagen, dass dies einige Hausaufgaben beinhaltet. Wenn Sie mir also ein wenig helfen könnten, wäre ich Ihnen sehr dankbar.

Ich arbeite in meinem Kurs schon seit einiger Zeit mit endlichen Zustandsautomaten und habe mich immer mit Designs beschäftigt, die Benutzereingaben erforderten. In letzter Zeit haben wir uns mit einigen Entwürfen befasst, die vorgegebene Sprünge von einem Zustand zum anderen beinhalteten, wie in einer Reihenfolge von Lichtern, die eingeschaltet werden sollen.

Zum Beispiel ein Ampelszenario, bei dem nach einer bestimmten Anzahl von Taktzyklen Grün auf Gelb wechselt, nach mehr vordefinierten Taktzyklen auf Rot, nach weiteren Taktzyklen wieder auf Grün. Dieser Kreislauf wiederholt sich dann ewig.

Ein weiteres Beispiel betrifft ein Schieberegister mit Ausgängen, die mit 8 LEDs verdrahtet sind, beim Start LED 1 aufleuchten, beim nächsten Taktzyklus LED 2 usw. bis zum Erreichen der letzten LED (LED 8). An diesem Punkt leuchtet die 7. LED und die Reihenfolge wird umgekehrt bis zum Erreichen der ersten LED und die Sequenz dreht sich noch einmal und so weiter. Der Kreislauf wiederholt sich ewig.

Ich hatte in der Vergangenheit keine Probleme beim Entwerfen von endlichen Zustandsmaschinen, wenn sie auf Benutzereingaben basierten, aber jetzt fühle ich mich ein bisschen verloren, da sich die Zyklen in einem bekannten Zyklus ewig wiederholen werden. Alle Informationen oder Ressourcen würden sehr geschätzt.

Antworten (1)

Zustandsmaschinen, die eine Schleife von Zuständen durchlaufen, werden genauso implementiert wie Zustandsmaschinen, die Leerlaufzustände haben. Es gibt überhaupt keinen Unterschied.

Die Entscheidung darüber, in welchen Zustand als nächstes gewechselt werden soll (einschließlich der Option, im aktuellen Zustand zu bleiben), ist genau dieselbe; In Ihrem Ampelbeispiel ist es so einfach (in etwas unvollständigem Verilog) wie:

case (state)
 STATE_RED:   if (cnt > RED_CNT) nextstate = STATE_GREEN; else nextstate = STATE_RED;
 STATE_GREEN: if (cnt > GREEN_CNT) nextstate = STATE_YELLOW; else nextstate = STATE_GREEN;
 STATE_YELLOW: if (cnt > YELLOW_CNT) nextstate = STATE_RED; else nextstate = STATE_YELLOW;
endcase

und die synchrone Zustandszuweisung:

state <= nextstate;