Menu
Coddy logo textTech

Ustalanie czasu przejść

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 81 z 90.

challenge icon

Wyzwanie

W tej lekcji dodasz logikę licznika, która kontroluje, jak długo każde światło pozostaje włączone. Licznik odlicza od ustawionej wartości do zera, a następnie wyzwala zmianę stanu.

Wymagania dotyczące czasu

StanCzas trwaniaWartość licznika
Zielone30 sekund30
Żółte10 sekund10
Czerwone40 sekund40

Jak działa licznik

  1. Gdy rozpoczyna się stan, do licznika wczytywana jest wartość czasu jego trwania
  2. Przy każdym takcie zegara licznik zmniejsza się o 1
  3. Gdy licznik osiągnie 0, należy przejść do następnego stanu

Twoim zadaniem jest dodanie brakującej logiki licznika do automatu stanów. Wejście next z poprzedniego kroku nie jest już używane: teraz to licznik decyduje o zmianie stanu, a testbench nie steruje już sygnałem next.

Co należy zrobić:

  1. Usuń input next, z nagłówka modułu i zastąp warunek else if (next) poniższą logiką licznika
  2. Dodaj deklarację reg [5:0] counter (zachowaj ją, jeśli została już zadeklarowana w pierwszym kroku)
  3. Podczas resetowania ustaw counter na 0
  4. Gdy counter == 0:
    • Wczytaj czas trwania następnego stanu do licznika
    • Przejdź do następnego stanu
  5. W przeciwnym razie zmniejszaj licznik o 1 przy każdym takcie zegara

Spróbuj swoich sił

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;
  // TODO: Zadeklaruj rejestr licznika (6 bitów)
  

  // Przypisania wyjść
  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

  // Maszyna stanów z odmierzaniem czasu
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Rozpocznij od stanu Red
      // TODO: Ustaw licznik na 0
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: Ustaw licznik dla stanu Yellow (10 sekund)
            
          end
          1: begin
            state <= 2;
            // TODO: Ustaw licznik dla stanu Red (40 sekund)
            
          end
          2: begin
            state <= 0;
            // TODO: Ustaw licznik dla stanu Green (30 sekund)
            
          end
        endcase
      end else begin
        // TODO: Zmniejsz licznik o 1
        
      end
    end
  end

endmodule

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online