Verilog Diseño de Contadores y Clocks
Verilog Diseño de Contadores y Clocks (señales de reloj) regulan la lógica de las señales para que los sistemas secuenciales puedan correr a una velocidad óptima. Para los estímulos se utilizan los procesos initial y always. La elección de éstos se determinada por características de las señales a generar. La generación asíncrona se basa en el uso de retardos para activar y desactivar señales, mientras que la generación síncrona se basa en el uso de eventos, disparados por flancos para activar y desactivar señales. En este caso todas las señales que se activen de forma síncrona se harán con un retardo.

Señal de Reset Síncrona
[code languaje=»cpp»]
initial
begin
rst = 1’b0;
repeat(2)
@(posedge clk) #1;
rst = 1’b1;
@(posedge clk) #1;
rst = 1’b0;
end
[/code]

Fuentes de Oscilación (Clocks)



Pin_17
En verilog podemos sintetizar relojes mediante contadores síncronos.
Diseño de un Oscilador de 1Hz en Verilog.
Practica Clocks:
Esta practica consiste en generar un oscilador entre estados altos y bajos a 1Hz en un LED. El diseño de este oscilador se muestra en el siguiente diagrama:

- C_50Mhz: Entrada externa de oscilación.
- C_1Hz: Oscilación de salida.
- [24:0] Cuenta -Variable del divisor.
Los periodos que tendrá una señal a una frecuencia de 50 Mhz en 1 segundo son 50,000,000 en 0.5 segundos son 25,000,000 a 0.001 segundos son 50,000. De esta manera se hace el divisor de frecuencia.
Código en Verilog
[code languaje=»cpp»]
module Cloks (C_50Mhz,C_1Hz);
input C_50Mhz; //Clock de entrada del FPGA de entrada (Pin 17).
output reg C_1Hz = 1; //Señal de salida (<em>Se debe asignar un estado lógico</em>).
reg[24:0] contador = 0; //Variable Contador equivale a 25 millones de estados.
always @(posedge C_50Mhz)
begin
contador = contador + 1; //0.5 segundos LED encendido
if(contador == 25_000_000)
begin
contador = 0;
C_1Hz = ~C_1Hz; //0.5 segundos LED apagado
end
end
endmodule
[/code]
Se debe de asignar un estado lógico inicial a la salida C_1Hz ya que de esta manera asignamos el estado de el led al poner nosotros «1» declaramos que el LED inicializara encendido, o viveversa si declaramos un «0», de cualquiera de las dos formas es aseptable.
El bloque always que presente un posedge, únicamente se «ejecutara» cuando ocurra el flanco positivo.Si presenta un negedge, únicamente se «ejecutara» cuando ocurra el flanco negativo.


Cuando un bloque always es usado para sintetizar lógica secuencial, no se recomienda mezclar con otro tipo de flancos o entradas.
Descargar el código a la FPGA, asignar la señal C_50Mhz a la entrada PIN_17 y la salida C_1Hz a un led (cualquiera).

Probaremos nuestro programa en físico mostrando la oscilación en un LED en estados altos y bajos a 1 Hz de frecuencia.


