Menu
Coddy logo textTech

Übergänge takten

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

challenge icon

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

ZustandDauerZählerwert
Grün30 Sekunden30
Gelb10 Sekunden10
Rot40 Sekunden40

Funktionsweise des Zählers

  1. Wenn ein Zustand beginnt, wird der Zähler mit dem Dauerwert geladen
  2. Bei jedem Takt verringert sich der Zähler um 1
  3. 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:

  1. Entferne input next, aus dem Modulheader und ersetze die Bedingung else if (next) durch die untenstehende Zählerlogik
  2. Füge eine Deklaration reg [5:0] counter hinzu (behalte sie bei, falls du sie bereits im ersten Schritt deklariert hast)
  3. Setze counter beim Zurücksetzen auf 0
  4. Wenn counter == 0:
    • Lade die Dauer des nächsten Zustands in den Zähler
    • Wechsle zum nächsten Zustand
  5. 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

endmodule

Alle Lektionen in Grundlagen

Übe selbstständig: Online-Verilog-Compiler