Nota: Este código sólo puede dividir frecuencias por números pares (2, 4, 6, 10, etc). Para dividir frecuencias de reloj por números impares, visita éste articulo.
Los dispositivos lógicos programables operan a velocidades bastante altas. Por ejemplo, el reloj para el FPGA de la tarjeta Mojo opera a 50MHz. Si designáramos un circuito para encender y apagar un LED, el LED lo haría a 50 o 25 millones de ciclos por segundo (dependiendo del diseño) y por lo tanto, sería imposible de observar con la vista.
Para solucionar esa situación, podemos usar el reloj del FPGA para crear relojes mas lentos. El concepto es simple. El circuito cuenta un número determinado de ciclos de reloj para cambiar una nueva señal a alta o baja. Esta nueva señal sería nuestro nuevo reloj.
La fórmula para calcular el nuevo reloj es simple:
contador = (reloj_entrante / reloj_nuevo) / 2
entonces, para crear un reloj de 5MHz usando un reloj de 50MHz, nuestro contador usaría 5 ciclos de reloj entrante:
contador = (50MHz / 5MHz) / 2 = (10) / 2 = 5
En la figura 1, simulamos el divisor de reloj de 50MHz a 5MHz usando Xilinx ISim para mostrar el comportamiento del reloj entrante (clk), el contador (count) y el nuevo reloj (clk2). Nótese que por cada 5 ciclos de clk, clk2 transiciona. La barra amarilla muestra el vector count cuando llega al valor 5 (3'b101) y es seguida por la transición en clk2.
Fig. 1. Simulación de divisor de reloj de 50MHz a 5MHz. |
Ejemplo de código:
module clock_divider(
input clk, // reloj entrante de 50MHz
output reg clk2, // nuevo reloj de 5MHz
);
reg [3:0] count;
// divisor de reloj 50MHz a 5MHz
always@(posedge clk)
begin
if(count==4'd4) // cuenta 5 ciclos (0-4) de reloj
begin
count<=0; // reinicia cuenta a 0
clk2 <= ~clk2; // transiciona clk2 a alto o bajo
end
else
begin
count<=count+1; // aumenta contador
end end
No comments:
Post a Comment