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 las sentencias Generate de VHDL: Cree desrebotadores reutilizables fácilmente

La sentencia generate de VHDL permite a los diseñadores replicar automáticamente un bloque de código en múltiples instancias, cada una cableada a señales distintas. Piénselo como un bucle for en tiempo de compilación que puede crear procesos encadenados o instancias de módulos, reduciendo drásticamente el código repetitivo y mejorando la mantenibilidad.

A diferencia de un bucle tradicional, confinado a un proceso o subprograma, generate se sitúa directamente en la región de arquitectura. Cuando se combina con genéricos, se convierte en un mecanismo potente para crear componentes VHDL altamente configurables y reutilizables.

Sintaxis de la sentencia Generate

[label :] for <constant_name> in <range> generate [declarations_local_to_each_loop_iteration] [begin] <processes_and_instantiations> end generate [label];

Los elementos opcionales están entre corchetes. Puede omitir la región declarativa y la palabra clave begin si no se declaran objetos locales. El <range> sigue la sintaxis estándar de enteros usando to o downto.

Desrebotador de un bit para interruptor

Antes de sumergirnos en generate, repaso un desrebotador simple que limpia una única entrada de interruptor. Un genérico timeout_cycles permite que el módulo se adapte a cualquier frecuencia de reloj. El desrebotador suprime transitorios que ocurren cuando un interruptor mecánico conmuta.

entity debouncer is generic ( timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switch : in std_logic; switch_debounced : out std_logic ); end debouncer;

La implementación se basa en un contador entero cuya anchura dicta el genérico. Una señal sombra debounced se usa internamente para mantener limpia la lógica de salida.

architecture rtl of debouncer is signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin -- Copiar señal interna a salida switch_debounced <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switch; else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switch /= debounced then counter <= 0; debounced <= switch; end if; end if; end if; end process; end architecture;

La simulación en ModelSim confirma que switch_debounced sigue la entrada solo después del tiempo de espera especificado, filtrando eficazmente los rebotes.

Dominando las sentencias Generate de VHDL: Cree desrebotadores reutilizables fácilmente

Descargue el proyecto completo de ModelSim, incluyendo testbenches, proporcionando su dirección de correo a continuación. Todas las actualizaciones se envían desde VHDLwhiz, y puede darse de baja en cualquier momento.

Bucle Generate con instanciaciones

Para extender el desrebotador a un array de interruptores, usamos una sentencia generate para crear múltiples instancias automáticamente.

entity debouncer_gen_inst is generic ( switch_count : positive; timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switches : in std_logic_vector(switch_count - 1 downto 0); switches_debounced : out std_logic_vector(switch_count - 1 downto 0) ); end debouncer_gen_inst;

La arquitectura usa un bucle generate para instanciar debouncer para cada bit del interruptor. Cada instancia comparte el mismo reloj y reset pero se conecta a un elemento distinto del vector.

architecture rtl of debouncer_gen_inst is begin MY_GEN : for i in 0 to switch_count - 1 generate DEBOUNCER : entity work.debouncer(rtl) generic map ( timeout_cycles => timeout_cycles ) port map ( clk => clk, rst => rst, switch => switches(i), switch_debounced => switches_debounced(i) ); end generate; end architecture;

Etiquetar el bloque generate (p.ej., MY_GEN) mejora la legibilidad en la jerarquía del simulador y los informes de síntesis, facilitando la depuración.

Dominando las sentencias Generate de VHDL: Cree desrebotadores reutilizables fácilmente

El testbench conmuta solo el interruptor 3, por lo que la forma de onda se centra en MY_GEN(3). Ejecute este ejemplo en ModelSim para ver la lógica de desrebote en acción.

Bucle Generate conteniendo procesos

Alternativamente, puede elevar la lógica del desrebotador dentro del bloque generate, eliminando instancias de componente separadas. Este enfoque demuestra que un bucle generate también puede crear procesos idénticos con señales locales.

architecture rtl of debouncer_gen_proc is begin MY_GEN : for i in 0 to switch_count - 1 generate signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin switches_debounced(i) <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switches(i); else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switches(i) /= debounced then counter <= 0; debounced <= switches(i); end if; end if; end if; end process; end generate; end architecture;

El comportamiento resultante coincide con el enfoque de instanciación de módulos, pero el código es autocontenido dentro de la arquitectura. Ambos métodos son válidos; elija el que mejor se alinee con su estilo de diseño.

Todos los ejemplos de código, incluyendo el proyecto completo de ModelSim, están disponibles para descarga mediante el formulario a continuación. Suscríbase a VHDLwhiz para actualizaciones, y siéntase libre de darse de baja en cualquier momento.

¿Tiene un uso creativo para generate? ¡Comparta sus ideas en los comentarios a continuación!

VHDL

  1. Circuito con interruptor: guía práctica de circuitos eléctricos básicos
  2. Experimento con Diodo Conmutador: Supresión de Retroceso Inductivo con Lámpara de Neón
  3. Configuración de análisis AC: Curvas, puntos y barrido de frecuencia
  4. Interruptores eléctricos: tipos, funciones y aplicaciones
  5. Dominando la sentencia switch en C#: Sintaxis, ejemplos y mejores prácticas
  6. Sentencia break en C#: Cómo y cuándo usarla
  7. Dominando la sentencia continue en C#: Cómo saltar iteraciones de bucles eficazmente
  8. Dominando switch-case en C++: Sintaxis, uso y ejemplos prácticos
  9. Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
  10. Aprovechando records VHDL para interfaces FIFO limpias y reutilizables
  11. Variables VHDL explicadas: Ejemplos prácticos y reglas para diseño fiable