Übergänge takten
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 81 von 90.
Aufgabe
In dieser Lektion fügst du die Zählerlogik hinzu, die steuert, wie lange jedes Licht eingeschaltet bleibt. Der Zähler zählt von einem voreingestellten Wert bis auf null herunter und löst dann den nächsten Zustandswechsel aus.
Zeitliche Anforderungen
| Zustand | Dauer | Zählerwert |
|---|---|---|
| Grün | 30 Sekunden | 30 |
| Gelb | 10 Sekunden | 10 |
| Rot | 40 Sekunden | 40 |
Funktionsweise des Zählers
- Wenn ein Zustand beginnt, wird der Zähler mit dem Dauerwert geladen
- Bei jedem Takt verringert sich der Zähler um 1
- Wenn der Zähler 0 erreicht, ist es Zeit, zum nächsten Zustand zu wechseln
Deine Aufgabe besteht darin, die fehlende Zählerlogik zur Zustandsmaschine hinzuzufügen. Der Eingang next aus dem vorherigen Schritt wird nicht mehr verwendet: Der Zähler entscheidet nun, wann sich der Zustand ändert, und die Testbench steuert next nicht mehr an.
Aufgabe:
- Entferne
input next,aus dem Modulheader und ersetze die Bedingungelse if (next)durch die untenstehende Zählerlogik - Füge eine Deklaration
reg [5:0] counterhinzu (behalte sie bei, falls du sie bereits im ersten Schritt deklariert hast) - Setze
counterbeim Zurücksetzen auf 0 - Wenn
counter == 0:- Lade die Dauer des nächsten Zustands in den Zähler
- Wechsle zum nächsten Zustand
- Verringere den Zähler andernfalls bei jedem Takt um 1
Probier es selbst
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// TODO: Zählerregister deklarieren (6 Bits)
// 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
// Zustandsmaschine mit Timing
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // Bei Rot starten
// TODO: Zähler auf 0 setzen
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
// TODO: Zähler für Gelb laden (10 Sekunden)
end
1: begin
state <= 2;
// TODO: Zähler für Rot laden (40 Sekunden)
end
2: begin
state <= 0;
// TODO: Zähler für Grün laden (30 Sekunden)
end
endcase
end else begin
// TODO: Zähler um 1 dekrementieren
end
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