-
Notifications
You must be signed in to change notification settings - Fork 200
Capítulo 7: Contador de 4 bits con prescaler
Ejemplos de este capítulo en github
Contador de 4 bits conectado a los leds. Para que cuente más lentamente, la señal de reloj se pasa por un prescaler de 22 bits. Se trata del mismo contador del capítulo 4, pero con un diseño mejorado. Para cambiar la frecuencia de cuenta sólo hay que cambiar los bits del prescaler (y no hace falta modificar los bits del contador ni reasignarlos en el fichero .pcf)
El contador tiene una entrada de reloj clk y una salida de datos data de 4 bits. También tiene un paráemtro N para indicar el número de bits del prescaler y establecer su frecuencia de funcionamiento. El código verilog es el siguiente:
//-- counter4.v
module counter4(input clk, output [3:0] data);
wire clk;
reg [3:0] data = 0;
//-- Parametro para el prescaler
parameter N = 22;
//-- Reloj de salida del prescaler
wire clk_pres;
//-- Instanciar el prescaler de N bits
prescaler #(.N(N))
pres1 (
.clk_in(clk),
.clk_out(clk_pres)
);
//-- Incrementar el contador en cada flanco de subida
always @(posedge(clk_pres)) begin
data <= data + 1;
end
endmodule
Se podría haber definido un contador genérico en un fichero aparte e instanciarlo (igual que se ha hecho con el prescaler). Sin embargo se ha hecho así para mostrar un ejemplo de diseño jerárquico mezclado con un componente definido en un proceso. Además, el contador es tan sencillo, que no merece la pena almacernarlo en un fichero separado.
El código se ha implementado a partir del dibujo de la imagen 1
La señal de reloj de 21Mhz entra por el pin 21 de la fpga, y la salida de datos se cada por los pines de los leds, del 99 al 96
Para sintentizarlo ejecutar el comando:
$ make sint
Los recursos empleados son:
Recurso | ocupación |
---|---|
PIOs | 3 / 96 |
PLBs | 7 / 160 |
BRAMs | 0 / 16 |
Cargar en la FPGA con el comando:
$ sudo iceprog counter4.bin
El banco de pruebas es similar al del capítulo 4, sin embargo, el proceso de comprobación del contador se ha modificado ligeramente.
//-- counter4_tb.v
module counter4_tb();
//-- Registro para generar la señal de reloj
reg clk = 0;
//-- Datos de salida del contador
wire [3:0] data;
//-- Registro para comprobar si el contador cuenta correctamente
reg [3:0] counter_check = 0;
//-- Instanciar el contador, con prescaler de 1 bit (para la simulacion)
counter4 #(.N(1))
C1(
.clk(clk),
.data(data)
);
//-- Generador de reloj. Periodo 2 unidades
always #1 clk = ~clk;
//-- Proceso de comprobación. Cada vez que hay un cambio en
//-- el contador se comprueba con el valor de prueba
always @(data) begin
if (counter_check != data)
$display("-->ERROR!. Esperado: %d. Leido: %d",counter_check, data);
counter_check = counter_check + 1;
end
//-- Proceso al inicio
initial begin
//-- Fichero donde almacenar los resultados
$dumpfile("counter4_tb.vcd");
$dumpvars(0, counter4_tb);
//-- Comprobación del reset.
# 0.5 if (data != 0)
$display("ERROR! Contador NO está a 0!");
else
$display("Contador inicializado. OK.");
# 99 $display("FIN de la simulacion");
# 100 $finish;
end
endmodule
- Ej1
- Ej2
TODO
Borrador...
El contador de 26 bits del tutorial lo podemos ver como un contador de 4 bits cuyos bits se sacan por los leds y cuya señal de reloj proviene de un prescaler de 22 bits, con un reloj de entrada de 12Mhz
Aplicando la fórmula anterior, la **frecuencia de reloj del contador de 4 bits es **fp = 12Mhz / 2^22 = 2.86 Hz. Se incrementa cada Tp = 1 / fp = 1 / 2.86 = 0.35 segundos.
0 You are leaving the privative sector (EN)
1 ¡Hola mundo! (EN) (RU)
2 De un bit a datos (EN)
3 Puerta NOT (EN)
4 Contador de 26 bits (EN)
5 Prescaler de N bits (EN)
6 Múltiples prescalers (EN)
7 Contador de 4 bits con prescaler (EN)
8 Registro de 4 bits (EN)
9 Inicializador (EN)
10 Registro de desplazamiento (EN)
11 Multiplexor de 2 a 1 (EN)
12 Multiplexor de M a 1 (EN)
13 Inicializando registros (EN)
14 Registro de N bits con reset síncrono
15 Divisor de frecuencias
16 Contador de segundos
17 Generando tonos audibles
18 Tocando notas
19 Secuenciando notas
20 Comunicaciones serie asíncronas
21 Baudios y transmisión
22 Reglas de diseño síncrono
23 Controladores y autómatas finitos
24 Unidad de transmisión serie asíncrona
25 Unidad de recepción serie asíncrona
26 Memoria ROM
27 Memoria ROM genérica
28 Memoria RAM
29 Puertas triestado
30 Hacia el microprocesador y más allá