Menu
Coddy logo textTech

Temporizzare le transizioni

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

challenge icon

Sfida

In questa lezione aggiungerai la logica del contatore che controlla per quanto tempo resta accesa ciascuna luce. Il contatore esegue il conto alla rovescia da un valore preimpostato fino a zero, poi attiva il successivo cambio di stato.

Requisiti di temporizzazione

StatoDurataValore del contatore
Verde30 secondi30
Giallo10 secondi10
Rosso40 secondi40

Come funziona il contatore

  1. Quando inizia uno stato, il contatore viene caricato con il valore della durata
  2. A ogni impulso di clock, il contatore diminuisce di 1
  3. Quando il contatore raggiunge 0, è il momento di passare allo stato successivo

Il tuo compito è aggiungere alla macchina a stati la logica del contatore mancante. L'ingresso next del passaggio precedente non viene più utilizzato: ora è il contatore a decidere quando cambia lo stato e il testbench non pilota più next.

Cosa fare:

  1. Rimuovi input next, dall'intestazione del modulo e sostituisci la condizione else if (next) con la logica del contatore riportata sotto
  2. Aggiungi una dichiarazione reg [5:0] counter (mantienila se l'hai già dichiarata nel primo passaggio)
  3. Al reset, imposta counter su 0
  4. Quando counter == 0:
    • Carica nel contatore la durata dello stato successivo
    • Passa allo stato successivo
  5. Altrimenti, decrementa il contatore di 1 a ogni impulso di clock

Provalo tu

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

  reg [1:0] state;
  // TODO: Dichiara il registro counter (6 bit)
  

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

  // Macchina a stati con temporizzazione
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // Inizia dal rosso
      // TODO: Imposta counter a 0
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: Carica counter per il giallo (10 secondi)
            
          end
          1: begin
            state <= 2;
            // TODO: Carica counter per il rosso (40 secondi)
            
          end
          2: begin
            state <= 0;
            // TODO: Carica counter per il verde (30 secondi)
            
          end
        endcase
      end else begin
        // TODO: Decrementa counter di 1
        
      end
    end
  end

endmodule

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online