Logik der Zustandsmaschine
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 80 von 90.
Aufgabe
In dieser Lektion fügst du die Logik für Zustandsübergänge zum Ampelsteuergerät hinzu. Die Zustandsmaschine bestimmt, wann von einem Zustand zum nächsten gewechselt wird.
Die Logik der Zustandsmaschine steuert, wann und wie die Ampel ihre Zustände ändert.
Zustandsfolge
Grün → Gelb → Rot → Grün → …
Deine Aufgabe ist es, die Logik der Zustandsmaschine zum Modul hinzuzufügen.
In diesem Schritt löst ein neues Eingangssignal, next, jede Änderung aus; der Zeitzähler kommt im nächsten Schritt hinzu. Behalte alles bei, was du im vorherigen Schritt geschrieben hast (das state-Register, die ungenutzte Deklaration von counter und den Ausgabe-Block always @(*)).
Was zu tun ist:
- Füge dem Modulheader nach
reseteinen 1-Bit-Eingangsport namensnexthinzu:input next,. Die Testbench pulst ihn, um den nächsten Zustand anzufordern. - Füge einen Block
always @(posedge clk or posedge reset)hinzu. - Setze
statebeim Zurücksetzen auf Rot (2). - Wenn
next1 ist, wechsle zum nächsten Zustand:- Wenn der Zustand Grün (0) ist: zu Gelb wechseln.
- Wenn der Zustand Gelb (1) ist: zu Rot wechseln.
- Wenn der Zustand Rot (2) ist: zu Grün wechseln.
Probier es selbst
module traffic_light (
input clk,
input reset,
input next, // Auslöser zum Zustandswechsel
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// Ausgabezuweisungen
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// TODO: Zustandsmaschinen-Logik hinzufügen (ohne Timing)
// always @(posedge clk or posedge reset) begin
// if (reset) begin
// state <= 2;
// end else if (next) begin
// case (state)
// 0: state <= 1;
// 1: state <= 2;
// 2: state <= 0;
// endcase
// end
// end
endmoduleAlle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellen9Prozedurale Blöcke
Always-BlockInitial-BlockSensitivitätslisteBlockierende ZuweisungNicht blockierende ZuweisungZusammenfassung – Always vs. Initial15Ampelsteuerung
Zustände definierenLogik der ZustandsmaschineÜbe selbstständig: Online-Verilog-Compiler