Declaração Case
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 55 de 90.
A instrução case permite escolher entre muitas ações diferentes com base no valor de uma única expressão. Ela é uma alternativa mais limpa a várias instruções if-else ao comparar a mesma variável com muitos valores diferentes.
A instrução case compara uma expressão com uma lista de valores e executa o bloco correspondente. É como um desvio de múltiplos caminhos.
Sintaxe:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseÉ altamente recomendável sempre incluir <strong>default</strong> em uma instrução <strong>case</strong> combinacional. Sem default, se sel assumir um valor inesperado (como X ou Z), out não será atribuído e irá reter seu valor anterior. Isso cria uma memória não intencional (um latch) em vez de uma lógica puramente combinacional.
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.
Várias instruções por caso
Use begin e end para várias 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, somente o primeiro ramo correspondente é executado |
| Os valores devem corresponder à largura de bits | 2'b01, não 1'b1 |
default é opcional, mas recomendado | Captura valores não mapeados |
Sem default, valores não mapeados causam latches | Na lógica combinacional |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| Ideal 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 ausente 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 a instrução case
// 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. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operadores Parte 1
Operadores aritméticosOperador móduloOperadores de comparaçãoRecapitulação - Matemática simplesOperadores bit a bit7Atribuições e Portas
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ões
Declaração IfIf - ElseRevisão - Comparador SimplesDeclaração CaseCasex e CasezRevisão - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteiro e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores - Parte 2
Operadores lógicosOperadores de reduçãoOperadores de deslocamentoOperador de concatenaçãoOperador condicionalRevisão - Desafio de operadores3Sistema Numérico
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRevisão - Formatos Numéricos6Módulos
Estrutura de MódulosPortas de Entrada e SaídaPortas InoutInstanciação de MódulosMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação — Construindo um MóduloPratique por conta própria: Compilador de Verilog online