Instrução Case
Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 55 de 90.
A instrução case permite que você escolha entre muitas ações diferentes com base no valor de uma única expressão. Ela é uma alternativa mais limpa para múltiplos comandos if-else ao comparar a mesma variável a muitos valores diferentes.
A instrução case compara uma expressão a uma lista de valores e executa o bloco correspondente. É como um desvio de múltiplas vias.
Sintaxe:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseÉ fortemente recomendado sempre incluir <strong>default</strong> em uma instrução <strong>case</strong> combinacional. Sem o default, se sel assumir um valor inesperado (como X ou Z), out não receberá atribuição e fará o latch do seu valor anterior. Isso cria memória não intencional (um latch) em vez de lógica combinacional pura.
Exemplo simples
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseSe sel for 00, out recebe a. Se sel for 01, out recebe b. Se sel for 10, out recebe c.
Caso contrário, out recebe 0.
Múltiplas Instruções por Case
Use begin e end para múltiplas instruções:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseRegras Importantes
| Regra | Explicação |
|---|---|
Os valores de case devem ser únicos | Com duplicatas, apenas o primeiro ramo correspondente é executado |
| Os valores devem corresponder à largura de bits | 2'b01 e não 1'b1 |
default é opcional, mas recomendado | Captura valores não mapeados |
Sem default, valores não mapeados causam latches | Em lógica combinacional |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| Melhor para | Uma variável, muitos valores | Condições complexas |
| Legibilidade | Muito claro | Pode ficar confuso |
| Exemplo | Multiplexador, decodificador | Comparador, verificações de intervalo |
Desafio
Complete a Instrução Case
O que fazer:
Adicione a instrução case que está faltando para fazer este multiplexador funcionar.
Como funciona:
- Quando
select = 2'b00,result = in0 - Quando
select = 2'b01,result = in1 - Quando
select = 2'b10,result = in2 - Quando
select = 2'b11,result = in3
Experimente você mesmo
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: Adicione o case statement
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo