Sentencia Case
Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 55 de 90.
La declaración case te permite elegir entre muchas acciones diferentes según el valor de una sola expresión. Es una alternativa más limpia a múltiples declaraciones if-else cuando se compara la misma variable con muchos valores diferentes.
La declaración case compara una expresión con una lista de valores y ejecuta el bloque coincidente. Es como una ramificación múltiple.
Sintaxis:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseSe recomienda encarecidamente incluir siempre <strong>default</strong> en una sentencia <strong>case</strong> combinacional. Sin default, si sel toma un valor inesperado (como X o Z), out no se asignará y retendrá (hará latch) su valor anterior. Esto crea memoria no deseada (un latch) en lugar de lógica combinacional pura.
Ejemplo simple
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseSi sel es 00, out recibe a. Si sel es 01, out recibe b. Si sel es 10, out recibe c.
De lo contrario, out obtiene 0.
Múltiples declaraciones por caso
Utiliza begin y end para múltiples declaraciones:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseReglas importantes
| Regla | Explicación |
|---|---|
Los valores de case deben ser únicos | Si hay duplicados, solo se ejecuta la primera rama que coincida |
| Los valores deben coincidir en ancho de bits | 2'b01 no 1'b1 |
default es opcional pero recomendado | Captura valores no mapeados |
Sin default, los valores no mapeados causan latches | En lógica combinacional |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| Ideal para | Una variable, muchos valores | Condiciones complejas |
| Legibilidad | Muy clara | Puede volverse desordenado |
| Ejemplo | Multiplexor, decodificador | Comparador, comprobaciones de rango |
Desafío
Completa la instrucción case
Qué hacer:
Añade la instrucción case que falta para hacer que este multiplexor funcione.
Cómo funciona:
- Cuando
select = 2'b00,result = in0 - Cuando
select = 2'b01,result = in1 - Cuando
select = 2'b10,result = in2 - Cuando
select = 2'b11,result = in3
Pruébalo tú mismo
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: Añadir sentencia case
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
¿Qué es Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - Circuito de Compuertas Lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores Parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo