Istruzione case
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 55 di 90.
L'istruzione case ti consente di scegliere tra molte azioni diverse in base al valore di una singola espressione. È un'alternativa più ordinata a più istruzioni if-else quando confronti la stessa variabile con molti valori diversi.
L'istruzione case confronta un'espressione con un elenco di valori ed esegue il blocco corrispondente. È simile a una diramazione a più vie.
Sintassi:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseÈ fortemente consigliato includere sempre default in un'istruzione case combinatoria. Senza default, se sel assume un valore non elencato in alcun caso, a out non viene assegnato un valore e mantiene quello precedente. Quando un valore di sel composto solo da bit 0 e 1 non ha un ramo corrispondente, la sintesi crea una memoria non intenzionale (un latch) invece di una logica puramente combinatoria. Anche una X o una Z su sel lascia out invariato nella simulazione, ma non crea un latch.
Esempio semplice
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseSe sel è 00, out riceve a. Se sel è 01, out riceve b. Se sel è 10, out riceve c.
Altrimenti, out assume il valore 0.
Più istruzioni per caso
Usa begin e end per più istruzioni:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseRegole importanti
| Regola | Spiegazione |
|---|---|
| I valori dei casi devono essere univoci | In presenza di duplicati, viene eseguito solo il primo ramo corrispondente |
| I valori devono corrispondere alla larghezza in bit | Scrivi 2'b01, non 1'b1 (un valore più corto viene completato con zeri) |
default è facoltativo ma consigliato | Gestisce i valori non mappati |
Senza default, i valori non mappati causano latch | Nella logica combinatoria |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| Ideale per | Una variabile, molti valori | Condizioni complesse |
| Leggibilità | Molto chiaro | Può diventare disordinato |
| Esempio | Multiplexer, decoder | Comparatore, controlli di intervallo |
Sfida
Completa l'istruzione case
Cosa fare:
Aggiungi l'istruzione case mancante per far funzionare questo multiplexer.
Come funziona:
- Quando
select = 2'b00,result = in0 - Quando
select = 2'b01,result = in1 - Quando
select = 2'b10,result = in2 - Quando
select = 2'b11,result = in3
Provalo tu
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: Aggiungere un'istruzione case
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte 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 1Esercitati da solo: Compilatore Verilog online