Istruzione case
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 55 di 90.
L’istruzione case ti permette di scegliere tra molte azioni diverse in base al valore di una singola espressione. È un’alternativa più pulita 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 un ramo a più vie.
Sintassi:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseSi consiglia vivamente di includere sempre <strong>default</strong> in un'istruzione combinatoria <strong>case</strong>. Senza default, se sel assume un valore imprevisto (come X o Z), out non verrà assegnato e manterrà (latch) il valore precedente. Questo crea una memoria indesiderata (un latch) invece di una logica puramente combinatoria.
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 riceve 0.
Più istruzioni per caso
Usa begin ed 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 case devono essere univoci | In presenza di duplicati, viene eseguito solo il primo ramo corrispondente |
| I valori devono corrispondere alla larghezza in bit | 2'b01 non 1'b1 |
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 complicato |
| Esempio | Multiplexer, decoder | Comparatore, verifiche 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: Aggiungi 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