Menu
Coddy logo textTech

Logica della macchina a stati

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 80 di 90.

challenge icon

Sfida

In questa lezione aggiungerai la logica di transizione degli stati al controller del semaforo. La macchina a stati determina quando passare da uno stato al successivo.

La logica della macchina a stati controlla quando e come il semaforo cambia stato.

Sequenza degli stati

Verde → Giallo → Rosso → Verde → …

Il tuo compito è aggiungere la logica della macchina a stati al modulo.

In questo passaggio, un nuovo segnale di input, next, attiva ogni cambiamento; il contatore temporale verrà introdotto nel passaggio successivo. Mantieni tutto ciò che hai scritto nel passaggio precedente (il registro state, la dichiarazione inutilizzata di counter e il blocco di output always @(*)).

Cosa fare:

  1. Aggiungi una porta di input a 1 bit chiamata next all'intestazione del modulo, dopo reset: input next,. Il banco di prova genera impulsi su di essa per richiedere lo stato successivo
  2. Aggiungi un blocco always @(posedge clk or posedge reset)
  3. In caso di reset, imposta state su Rosso (2)
  4. Quando next è 1, passa allo stato successivo:
    • Se lo stato è Verde (0): passa a Giallo
    • Se lo stato è Giallo (1): passa a Rosso
    • Se lo stato è Rosso (2): passa a Verde

Provalo tu

module traffic_light (
  input clk,
  input reset,
  input next,           // Attivatore per cambiare stato
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;

  // Assegnazioni delle uscite
  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: Aggiungere la logica della macchina a stati (senza temporizzazione)
  // 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

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online