Temporizzare le transizioni
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 81 di 90.
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
| Stato | Durata | Valore del contatore |
|---|---|---|
| Verde | 30 secondi | 30 |
| Giallo | 10 secondi | 10 |
| Rosso | 40 secondi | 40 |
Come funziona il contatore
- Quando inizia uno stato, il contatore viene caricato con il valore della durata
- A ogni impulso di clock, il contatore diminuisce di 1
- 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:
- Rimuovi
input next,dall'intestazione del modulo e sostituisci la condizioneelse if (next)con la logica del contatore riportata sotto - Aggiungi una dichiarazione
reg [5:0] counter(mantienila se l'hai già dichiarata nel primo passaggio) - Al reset, imposta
countersu 0 - Quando
counter == 0:- Carica nel contatore la durata dello stato successivo
- Passa allo stato successivo
- 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
endmoduleTutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 115Controllore del semaforo
Definire gli statiLogica della macchina a statiEsercitati da solo: Compilatore Verilog online