Menu
Coddy logo textTech

Timing der Übergänge

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 81 von 90.

challenge icon

Aufgabe

In dieser Lektion wirst du die counter logic hinzufügen, die steuert, wie lange jede Ampelphase dauert. Der Zähler zählt von einem voreingestellten Wert bis auf Null herunter und löst dann den nächsten Zustandswechsel aus.

Timing-Anforderungen

ZustandDauerZählerwert
Green30 Sekunden30
Yellow10 Sekunden10
Red40 Sekunden40

Wie der Zähler funktioniert

  1. Wenn ein Zustand beginnt, wird der Zähler mit dem Dauer-Wert geladen
  2. Bei jedem Taktschlag verringert sich der Zähler um 1
  3. Wenn der Zähler 0 erreicht, ist es Zeit, in den nächsten Zustand zu wechseln

Deine Aufgabe ist es, die fehlende Zählerlogik zur State Machine hinzuzufügen.

Was zu tun ist:

  1. Füge eine reg [5:0] counter Deklaration hinzu
  2. Setze counter bei einem Reset auf 0
  3. Wenn counter == 0:
    • Lade die Dauer des nächsten Zustands in den Zähler
    • Wechsle in den nächsten Zustand
  4. Andernfalls verringere den Zähler 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ähler-Register deklarieren (6 Bits)
  

  // Zuweisung der Ausgänge
  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

  // Zustandsautomat mit Zeitsteuerung
  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

endmodule

Alle Lektionen in Grundlagen