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

Construcción de un proceso activado por reloj en VHDL: Guía práctica

La mayoría de los diseños VHDL emplean lógica con reloj —comúnmente referida como lógica síncrona o secuencial. Un proceso con reloj se activa únicamente en el flanco del reloj maestro, independientemente de cambios en otras señales de entrada.

El elemento fundamental de la lógica con reloj es el flip-flop. En este tutorial nos centramos en el flip-flop de flanco positivo con reset negativo. Vea el esquema a continuación:

Construcción de un proceso activado por reloj en VHDL: Guía práctica

Como dispositivo de muestra-y-retención, el flip-flop captura el valor de entrada en el flanco de subida del reloj y retiene ese valor hasta el siguiente flanco de subida o hasta que la señal de reset se afirma.

Nota: Este post es parte de la serie Tutoriales Básicos de VHDL.

Todos los procesos con reloj se disparan al unísono y muestrean sus entradas simultáneamente. El reloj establece pasos de tiempo discretos, permitiendo a los diseñadores particionar lógica compleja en eventos claros ciclo a ciclo.

Los flip-flops, o arrays de los mismos, también se llaman registros.

La lista de sensibilidad de un proceso con reloj típicamente contiene solo la señal de reloj, porque el proceso despierta exclusivamente en un flanco de reloj. Entradas adicionales son ignoradas para propósitos de disparo.

A continuación se muestra una plantilla reutilizable para un proceso con reloj con reset síncrono:

process(Clk) is
begin
  if rising_edge(Clk) then
    if nRst = '0' then
      <reset all output signals here>
    else
      <main logic here>
    end if;
  end if;
end process;

Ejercicio

En el tutorial de video adjunto recorremos la creación de un proceso con reloj en VHDL.

Código del testbench

El testbench final para el flip-flop:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T17_ClockedProcessTb is
end entity;

architecture sim of T17_ClockedProcessTb is
  constant ClockFrequency : integer := 100e6; -- 100 MHz
  constant ClockPeriod : time := 1000 ms / ClockFrequency;
  signal Clk : std_logic := '1';
  signal nRst : std_logic := '0';
  signal Input : std_logic := '0';
  signal Output : std_logic;
begin
  -- Device Under Test (DUT)
  i_FlipFlop : entity work.T17_FlipFlop(rtl)
    port map(
      Clk   => Clk,
      nRst  => nRst,
      Input => Input,
      Output=> Output
    );
  -- Generación de reloj
  Clk <= not Clk after ClockPeriod / 2;
  -- Secuencia testbench
  process is
  begin
    -- Liberar DUT de reset
    nRst <= '1';
    wait for 20 ns;
    Input <= '1';
    wait for 22 ns;
    Input <= '0';
    wait for 6 ns;
    Input <= '1';
    wait for 20 ns;
    -- Aplicar reset
    nRst <= '0';
    wait;
  end process;
end architecture;

Módulo Flip-Flop

Implementación del flip-flop de flanco positivo con reset negativo:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T17_FlipFlop is
  port(
    Clk   : in  std_logic;
    nRst  : in  std_logic; -- Reset negativo
    Input : in  std_logic;
    Output: out std_logic
  );
end entity;

architecture rtl of T17_FlipFlop is
begin
  -- Flip-flop con reset sincronizado
  process(Clk) is
  begin
    if rising_edge(Clk) then
      if nRst = '0' then
        Output <= '0';
      else
        Output <= Input;
      end if;
    end if;
  end process;
end architecture;

Observación de forma de onda

Después de ejecutar la simulación en ModelSim y hacer zoom en la línea de tiempo, la forma de onda muestra claramente la salida actualizándose solo en flancos de subida del reloj:

Construcción de un proceso activado por reloj en VHDL: Guía práctica

Análisis

La salida cambia exclusivamente en flancos de subida del reloj. Cualquier transición de entrada que ocurra entre dos flancos de subida —como la caída negativa que comienza alrededor de 45 ns— no es capturada, porque el flip-flop muestrea solo en el flanco.

A continuación hay una animación que visualiza la relación entre la entrada, reloj y salida:

Construcción de un proceso activado por reloj en VHDL: Guía práctica

Observaciones clave:

En la práctica, un flip-flop requiere una entrada estable por un breve período antes y después del flanco de reloj —conocido como setup y hold times. Estas restricciones son manejadas automáticamente por las herramientas de síntesis al convertir VHDL a netlist.

Para una inmersión más profunda en pasos de tiempo de simulación, vea Ciclos delta explicados.

Conclusión

¿Listo para probar sus conocimientos? Tome el Cuestionario Básico VHDL – parte 3 o continúe al siguiente tutorial.

VHDL

  1. Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
  2. Creación de un testbench dirigido por Tcl para un módulo VHDL de cerradura por código
  3. Finalizar elegantemente una simulación de testbench VHDL
  4. Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
  5. Generación de números aleatorios en VHDL: De uniforme a OSVVM
  6. Diseño de un búfer circular FIFO robusto en VHDL usando RAM de bloques
  7. Cómo construir un testbench de auto-comprobación en VHDL: Guía práctica
  8. Implementación de lista enlazada dinámica en VHDL con tipos protegidos y punteros de acceso
  9. Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
  10. Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
  11. Dominando funciones VHDL: Guía práctica para diseño eficiente