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:
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:

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:

Observaciones clave:
- El pulso de entrada de un período de reloj a 20 ns es síncrono al reloj y produce una respuesta retrasada en la salida.
- Durante la simulación, los eventos ocurren en pasos de tiempo cero (ciclos delta). Como el flip-flop lee la entrada y actualiza la salida en el mismo ciclo delta, captura el valor de entrada pre-flanco.
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
- Los procesos con reloj con reset síncrono incluyen solo el reloj en la lista de sensibilidad.
- Usar
if rising_edge(Clk)garantiza activación estrictamente en el flanco de subida del reloj. - En un diseño síncrono, todos los cambios de estado ocurren en el flanco de reloj activo.
¿Listo para probar sus conocimientos? Tome el Cuestionario Básico VHDL – parte 3 o continúe al siguiente tutorial.
VHDL
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Creación de un testbench dirigido por Tcl para un módulo VHDL de cerradura por código
- 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
- Diseño de un búfer circular FIFO robusto en VHDL usando RAM de bloques
- Cómo construir un testbench de auto-comprobación en VHDL: Guía práctica
- Implementación de lista enlazada dinámica en VHDL con tipos protegidos y punteros de acceso
- 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