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 organizada 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 com várias opções.
Sintaxe:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseÉ altamente recomendável sempre incluir default em uma instrução combinacional case. Sem default, se sel assumir um valor que não esteja listado em nenhum item do case, out não será atribuído e manterá seu valor anterior. Quando um valor de sel composto apenas por bits 0 e 1 não tiver uma ramificação correspondente, a síntese criará uma memória não intencional (um latch) em vez de lógica puramente combinacional. Um X ou Z em sel também deixa out inalterado na simulação, mas não cria um latch.
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 dos casos devem ser únicos | Com valores duplicados, apenas a primeira ramificação correspondente é executada |
| Os valores devem corresponder à largura de bits | Escreva 2'b01, não 1'b1 (um valor mais curto é preenchido com zeros) |
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 | |
|---|---|---|
| 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 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: Adicionar 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