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.

Clk

Clock

Señal de Reset Síncrona

initial
  begin
    rst = 1'b0;
    repeat(2)
      @(posedge clk) #1;
    rst = 1'b1;
      @(posedge clk) #1;
    rst = 1'b0;
  end
Diagrama Clock FPGA

Diagrama Clock FPGA

Fuentes de Oscilación  (Clocks)

Clock Multiplicación / Divición

Clock Multiplicación / Divición

Fuente de Oscilación (Hz)

Fuente de Oscilación (Hz)

Fuente de oscilación del FPGA

Fuente de oscilación del FPGA

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:

Diseño de un Oscilador de 1Hz

Diseño de un Oscilador de 1Hz

  • 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

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

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.

negedge

Negedge

posedge

Posedge

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).

Asinacion de Pines S3A2

Asignación de Pines

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

Imagen Representativa On

Imagen Representativa On

Imagen Representativa Off

Imagen Representativa Off

 

 

Escríbenos tus dudas o comentarios

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Usamos Cookies en nuestro sitio WEB

Por favor confirma, si aceptas nuestras cookies de rastreo. También puedes negar el uso de cookies de rastreo y seguir navegando sin que ninguna información sea enviada a servicios de terceros.