Skip to content

Capítulo 16: Contador de segundos

Juan Gonzalez-Gomez edited this page Aug 25, 2015 · 16 revisions

Imagen 1

Ejemplos de este capítulo en github

Introducción

Para practicar con los divisores de frecuencia, vamos a implementar un contador que se incremente cada segundo. La cuenta la mostraremos por los leds de la iCEstick

divisor.v: Descripción del hardware

Usaremos el divisor de frecuencia del capítulo pasado, pero con algunas mejoras:

//-- divider.v
//-- Incluir constantes definidas para este componente
`include "divider.vh"

//-- Entrada: clk_in. Señal original
//-- Salida: clk_out. Señal de frecuencia 1/M de la original
module divider(input wire clk_in, output wire clk_out);

//-- Valor por defecto del divisor
//-- Lo ponemos a 1 Hz (Constantes definidas en divider.vh)
parameter M = `F_1Hz;

//-- Numero de bits para almacenar el divisor
//-- Se calculan con la funcion de verilog $clog2, que nos devuelve el 
//-- numero de bits necesarios para representar el numero M
//-- Es un parametro local, que no se puede modificar al instanciar
localparam N = $clog2(M);

//-- Registro para implementar el contador modulo M
reg [N-1:0] divcounter = 0;

//-- Contador módulo M
always @(posedge clk_in)
  divcounter <= (divcounter == M - 1) ? 0 : divcounter + 1;

//-- Sacar el bit mas significativo por clk_out
assign clk_out = divcounter[N-1];

endmodule
Clone this wiki locally