Menu
Coddy logo textTech

Logika maszyny stanów

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

challenge icon

Wyzwanie

W tej lekcji dodasz logikę przejść między stanami do sterownika sygnalizacji świetlnej. Automat stanów określa, kiedy przejść z jednego stanu do następnego.

Logika automatu stanów steruje tym, kiedy i jak sygnalizacja świetlna zmienia stany.

Sekwencja stanów

Zielony → Żółty → Czerwony → Zielony → …

Twoim zadaniem jest dodanie logiki automatu stanów do modułu.

W tym kroku każdy stan zmienia się po otrzymaniu nowego sygnału wejściowego next; licznik czasu pojawi się w następnym kroku. Zachowaj wszystko, co napisałeś w poprzednim kroku (rejestr state, nieużywaną deklarację counter i blok wyjściowy always @(*)).

Co zrobić:

  1. Dodaj 1-bitowy port wejściowy o nazwie next do nagłówka modułu, po reset: input next,. Testbench podaje na niego impuls, aby zażądać następnego stanu
  2. Dodaj blok always @(posedge clk or posedge reset)
  3. Podczas resetu ustaw state na Czerwony (2)
  4. Gdy next ma wartość 1, przejdź do następnego stanu:
    • Jeśli stan to Zielony (0): zmień na Żółty
    • Jeśli stan to Żółty (1): zmień na Czerwony
    • Jeśli stan to Czerwony (2): zmień na Zielony

Spróbuj swoich sił

module traffic_light (
  input clk,
  input reset,
  input next,           // Sygnał wyzwalający zmianę stanu
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;

  // 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

  // TODO: Dodaj logikę maszyny stanów (bez odmierzania czasu)
  // 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

endmodule

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online