Sentencia Case
Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 55 de 90.
La sentencia case permite elegir entre muchas acciones diferentes basándose en el valor de una sola expresión. Es una alternativa más limpia a múltiples sentencias if-else al comparar la misma variable con muchos valores diferentes.
La sentencia case compara una expresión con una lista de valores y ejecuta el bloque correspondiente. Es como una ramificación de múltiples vías.
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 será asignado y retendrá (latch) su valor anterior. Esto crea memoria no deseada (un latch) en lugar de lógica combinacional pura.
Ejemplo sencillo
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 sentencias por caso
Utilice begin y end para múltiples sentencias:
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 |
|---|---|
| Todos los valores de case deben ser únicos | Sin valores duplicados |
| Los valores deben coincidir con el 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 claro | Puede volverse desordenado |
| Ejemplo | Multiplexor, decodificador | Comparador, comprobaciones de rango |
Desafío
Completa la sentencia Case
Qué hacer:
Añade la sentencia case que falta para 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
Hoja de referencia
La sentencia case selecciona entre múltiples acciones basándose en una única expresión — una alternativa más limpia a los if-else encadenados.
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcasePara múltiples sentencias por rama, utilice begin/end:
case (sel)
2'b00: out = a;
2'b01: begin
out = b;
flag = 1;
end
default: out = 0;
endcaseIncluya siempre default en la lógica combinacional. Sin él, los valores que no coinciden (por ejemplo, X, Z) hacen que la salida conserve su valor anterior, creando un latch no deseado.
Reglas clave:
- Todos los valores del case deben ser únicos
- Los valores deben coincidir con el ancho de bits de la expresión (por ejemplo,
2'b01, no1'b1) - Utilice
casepara una variable frente a muchos valores; utiliceif-elsepara condiciones complejas o de rango
Pruébalo tú mismo
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: Agregar 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