Dominando la sentencia Case-When en VHDL: Diseño eficiente de multiplexores
La sentencia Case-When dirige un programa VHDL por uno de varios caminos basándose en una señal, variable o expresión. Ofrece una alternativa más limpia y legible a largas cadenas if-then-elsif-else, particularmente al manejar múltiples valores discretos.
Muchos lenguajes de programación usan constructos como switch o case; en VHDL, el constructo case es un elemento básico para construir multiplexores y otra lógica de selección.
Este artículo es parte de nuestra serie Tutoriales Básicos de VHDL.
Sintaxis básica
La estructura canónica de una sentencia case es:
case <expression> is when <choice> => -- código para esta rama when <choice> => -- código para esta rama ... end case;
El <expression> es típicamente una señal o variable. Aunque un case puede contener muchas ramas when, solo una se ejecutará durante la simulación.
Cada <choice> puede ser:
- Un valor único, ej.
when "11" => - Un rango, ej.
when 5 to 10 => - Una lista de valores, ej.
when 1|3|5 => - La palabra clave
others, que coincide con cualquier valor no listado explícitamente.
Ejercicio práctico: Construyendo un multiplexor 4-a-1
A continuación se muestra el código VHDL completo que demuestra un multiplexor 4-a-1 implementado con tanto if-then-elsif como case.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T14_CaseWhenTb is
end entity;
architecture sim of T14_CaseWhenTb is
signal Sig1 : unsigned(7 downto 0) := x"AA";
signal Sig2 : unsigned(7 downto 0) := x"BB";
signal Sig3 : unsigned(7 downto 0) := x"CC";
signal Sig4 : unsigned(7 downto 0) := x"DD";
signal Sel : unsigned(1 downto 0) := (others => '0');
signal Output1 : unsigned(7 downto 0);
signal Output2 : unsigned(7 downto 0);
begin
-- Estímulos para la señal selector
process is
begin
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= "UU";
wait;
end process;
-- MUX usando if-then-else
process(Sel, Sig1, Sig2, Sig3, Sig4) is
begin
if Sel = "00" then
Output1 <= Sig1;
elsif Sel = "01" then
Output1 <= Sig2;
elsif Sel = "10" then
Output1 <= Sig3;
elsif Sel = "11" then
Output1 <= Sig4;
else
Output1 <= (others => 'X');
end if;
end process;
-- MUX equivalente usando case statement
process(Sel, Sig1, Sig2, Sig3, Sig4) is
begin
case Sel is
when "00" => Output2 <= Sig1;
when "01" => Output2 <= Sig2;
when "10" => Output2 <= Sig3;
when "11" => Output2 <= Sig4;
when others => Output2 <= (others => 'X');
end case;
end process;
end architecture;
Después de ejecutar la simulación en ModelSim, la forma de onda muestra comportamiento idéntico para Output1 y Output2. Cuando el selector Sel toma un valor indefinido (ej. "UU"), la cláusula when others => emite 'X', señalando un estado desconocido.
La salida de consola contiene la siguiente advertencia a 50 ns, indicando una comparación de metavalor:
VSIM 2> run # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb
Conclusiones clave
- Use sentencias
casepara reemplazar largas cadenasif-then-elsifpara mejor legibilidad. - Implemente un camino por defecto con
when others =>para manejar valores inesperados. - Los multiplexores se expresan más limpiamente con constructos
caseen VHDL.
Continúe al siguiente tutorial para conceptos más avanzados de VHDL.
VHDL
- Dominando las Técnicas de Afiladora de Herramientas: Guía Práctica
- Cómo el molibdeno moldea la industria moderna: usos, beneficios y dinámica de suministro
- Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Finalizar elegantemente una simulación de testbench VHDL
- Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
- Generación de números aleatorios en VHDL: De uniforme a OSVVM
- Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
- Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
- Dominando funciones VHDL: Guía práctica para diseño eficiente
- Diseño de máquina de estados finitos en VHDL: Ejemplo práctico de semáforo