Menu
Coddy logo textTech

Definire gli stati

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

challenge icon

Sfida

Un controller di un semaforo è una macchina a stati finiti che passa ciclicamente da uno stato del semaforo all'altro (rosso, giallo, verde) con intervalli di tempo specifici. Una macchina a stati finiti (FSM) è un circuito che può trovarsi in uno tra un numero limitato di stati. Passa da uno stato all'altro in base agli input o alla temporizzazione.

In questo progetto realizzerai un controller di un semaforo per un semplice incrocio. Il semaforo ha tre uscite:

LuceUscitaSignificato
Rossored = 1Fermati
Gialloyellow = 1Attenzione
Verdegreen = 1Via

Le luci si alternano in questo ordine:

Green → Yellow → Red → Green → …

Sequenza temporale

StatoDurataStato successivo
Verde30 secondiGiallo
Giallo10 secondiRosso
Rosso40 secondiVerde

In questa lezione definirai gli stati del controller del semaforo.

Un semaforo ha tre stati possibili:

StatoLuceCodice
VerdeLuce verde ACCESA2'b00
GialloLuce gialla ACCESA2'b01
RossoLuce rossa ACCESA2'b10

Completa il modulo aggiungendo le parti mancanti.

Cosa fare:

Definisci la codifica degli stati: 0=Verde, 1=Giallo, 2=Rosso

  1. Dichiara un registro a 2 bit chiamato state
  2. Dichiara un registro a 6 bit chiamato counter (per la temporizzazione fino a 40 secondi). Non viene usato in questo passaggio: la logica di temporizzazione che lo usa per contare verrà aggiunta più avanti in questo progetto, nel passaggio Temporizzazione delle transizioni
  3. Aggiungi le assegnazioni delle uscite all'interno di un blocco always combinatorio, always @(*) begin ... end, con un case (state) al suo interno. red, yellow e green sono dichiarate come output reg e un reg può essere assegnato solo all'interno di un blocco di questo tipo. @(*) significa che il blocco viene eseguito di nuovo ogni volta che cambia uno qualsiasi dei valori che legge; in questo caso, state:
    • Quando lo stato è 0: green = 1, yellow = 0, red = 0
    • Quando lo stato è 1: green = 0, yellow = 1, red = 0
    • Quando lo stato è 2: green = 0, yellow = 0, red = 1

Provalo tu

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // TODO: Attività 1 - Dichiarare il registro di stato (2 bit)
  
  // TODO: Attività 2 - Dichiarare il registro contatore (6 bit)
  

  // TODO: Attività 3 - Assegnare le uscite usando case (state)
  // stato 0: green=1, yellow=0, red=0
  // stato 1: green=0, yellow=1, red=0
  // stato 2: green=0, yellow=0, red=1

endmodule

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online