Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> VHDL

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:

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

Continúe al siguiente tutorial para conceptos más avanzados de VHDL.

VHDL

  1. Dominando las Técnicas de Afiladora de Herramientas: Guía Práctica
  2. Cómo el molibdeno moldea la industria moderna: usos, beneficios y dinámica de suministro
  3. Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
  4. Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
  5. Finalizar elegantemente una simulación de testbench VHDL
  6. Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
  7. Generación de números aleatorios en VHDL: De uniforme a OSVVM
  8. Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
  9. Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
  10. Dominando funciones VHDL: Guía práctica para diseño eficiente
  11. Diseño de máquina de estados finitos en VHDL: Ejemplo práctico de semáforo