3.1. Generador de reloj

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:

constant FRECUENCIA : real:=60.0e6; -- 60 MHz
constant PERIODO    : time:=1 sec/FRECUENCIA; -- 16666667 fs

Copyright © 2011 UTN FRBA - INTI - Ing. Salvador E. Tropea