La mayor parte de los diseños VHDL de la vida real son circuitos
sincrónicos comandados por uno o más relojes. Es por esta razón que casi
siempre necesitaremos de un generador de reloj. En Sección 2.3.4
se mencionó que en circuitos completamente sincrónicos es posible finalizar
la ejecución de nuestro banco de pruebas deteniendo el reloj en una
sentencia wait. En el Ejemplo 3-1 se
muestra como generar una señal de reloj con 50 % de ciclo útil y que puede
ser detenido llevando a false la señal detener
.
Ejemplo 3-1. Generación de reloj
constant PERIODO : time:=10 ns; -- Período del reloj signal clk : std_logic; -- Señal de reloj signal detener : boolean:=false; -- Señal para detener el reloj ... gen_reloj: process begin clk <= '1'; wait for PERIODO/2; clk <= '0'; wait for PERIODO/2; if detener then wait; end if; end process gen_reloj;
Otra forma de describir este circuito, pero usando los conceptos explicados en Sección 2.9 es la que se muestra en el Ejemplo 3-2.
Ejemplo 3-2. Generación de reloj
gen_reloj: process begin clk <= '1', '0' after PERIODO/2; wait for PERIODO; if detener then wait; end if; end process gen_reloj;
Cabe destacar que este mecanismo no sólo es más compacto, sino que soluciona el
problema que se presenta cuando el período es un número impar de femptosegundos. En este
caso el redondeo de la división hace que PERIODO
sea distinto que
PERIODO
/2+PERIODO
/2. Esto afecta al primer método,
pero no al segundo.
En ocasiones la frecuencia de operación es fácil de representar, pero el período
es una fracción con infinitos decimales, por ejemplo 60 MHz. En estos casos es más cómodo
definir una constante FRECUENCIA
y derivar el período de la siguiente
manera: