Case Statement
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
Conclua o case statement
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 projeto4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPratique por conta própria: Compilador de Verilog online