Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Open source
Business
Explore
Pricing
Blog
Support
This repository
Obijuan / open-fpga-verilog-tutorial
Code
Issues 0
Pull requests 0
Search
Watch
Wiki
Pulse
Sign in
13
Star
31
Sign up
Fork
15
Graphs
Pages 40
Inicio (EN)
Captulos
Ejemplos de este captulo en github
Introduccin
Los prescalers sirven para ralentizar las seales de reloj. Por la entrada entra una seal de reloj
de frecuencia f y por la salida se obtiene una de frecuencia menor. En este tutorial haremos un
prescaler de N bits para hacer parpadear un led a diferentes frecuencias
Para un prescaler de N bits, las frmulas que relacionan las frecuencias y periodos de entrada con
los de salida son:
https://github.com/Obijuan/open-fpga-verilog-tutor
Clone in Desktop
converted by Web2PDFConvert.com
Internamente est constituido por un contador de 2 bits, cuyas salidas son d0 y d1. La de mayor
peso es la que se saca como seal de salida. Este contador se incrementa en cada flanco de subida
de clk, que tiene un periodo T. Si observamos las seales de salida de sus dos bits (d0 y d1):
converted by Web2PDFConvert.com
Bits (N)
Frecuencia
Periodo
Visible
6 MHz
0.167 usec
No
3 MHz
0.333 usec
No
1.5 Mhz
0.666 usec
No
750 Khz
1.333 usec
No
375 Khz
2.666 usec
No
187.5 Khz
5.333 usec
No
93.75 KHz
10.666 usec
No
46.875 Khz
21.333 usec
No
23437.5 Hz
42.666 usec
No
10
11718.7 Hz
85.333 usec
No
11
5859.37 Hz
170.66 usec
No
12
2929.68 Hz
341.33 usec
No
13
1464.84 Hz
682.66 usec
No
14
732.42 Hz
1.365 ms
No
15
366.21 Hz
2.73 ms
No
16
183.1 Hz
5.46 ms
No
17
92.552 Hz
10.92 ms
No
18
45.776 Hz
21.84 ms
No
19
22.888 Hz
43.69 ms
Si
20
11.444 Hz
87.38 ms
Si
21
5.722 Hz
174.76 ms
Si
22
2.861 Hz
349.52 ms
Si
El ojo humano tiene una frecuencia de refresco de unos 25Hz. Esto significa que frecuencias
superiores no se aprecian. Si hacemos parpadear el led con una frecuencia superior, lo
apreciaremos como si siempre estuviese encendido (no lo veremos parpadear)
Al usar el prescarler con el led, a partir de 19 bits es cuando se puede apreciar el parpadeo.
Cuanto ms bits, ms lento parpadear el led.
converted by Web2PDFConvert.com
//-- prescaler.v
//-- clk_in: seal de reloj de entrada
//-- clk_out: Seal de reloj de salida, con menor frecuencia
module prescaler(input clk_in, output clk_out);
wire clk_in;
wire clk_out;
//-- Numero de bits del prescaler (por defecto)
parameter N = 22;
//-- Registro para implementar contador de N bits
reg [N-1:0] count = 0;
//-- El bit ms significativo se saca por la salida
assign clk_out = count[N-1];
//-- Contador: se incrementa en flanco de subida
always @(posedge(clk_in)) begin
count <= count + 1;
end
endmodule
Definimos un registro de N bits, que se incrementa en cada flanco de subida de la seal de reloj de
entrada. Su bit ms significativo se conecta directamente a la salida clk_out.
Por defecto el prescaler es de 22 bits, por lo que la frecuencia de clk_out es de 2.9Hz aprox.
Slo hay que dar otro valor a N para cambiar la frecuencia de salida
Sntesis en la FPGA
La seal de la placa iCEstick de 12 MHZ se introduce a clk_in a travs del pin 21 de la fpga. La
salida clk_out se enva directamente al led D1 (pin 99), para que parpadee a su misma frecuencia
converted by Web2PDFConvert.com
Recurso
ocupacin
PIOs
2 / 96
PLBs
5 / 160
BRAMs
0 / 16
Simulacin
En el banco de pruebas colocamos el prescaler de N bits (por defecto con N = 2), un generador de
reloj y un bloque de comprobacin que se ejecuta con cada flanco de bajada del reloj. Este bloque
tiene un registro interno que se incrementa y su bit ms significativo se comprueba con clk_out, para
asegurarse que est funcionando correctamente. Hay un cuarto bloque que inicializa todo y espera a
que se termine la simulacin
converted by Web2PDFConvert.com
converted by Web2PDFConvert.com
//-- prescaler_tb.v
module prescaler_tb();
//-- Numero de bits del prescaler a comprobar
parameter N = 2;
//-- Registro para generar la seal de reloj
reg clk = 0;
//-- Salida del prescaler
wire clk_out;
//-- Registro para comprobar si el prescaler funciona
reg [N-1:0] counter_check = 0;
//-- Instanciar el prescaler de N bits
prescaler #(.N(N)) //-- Parmetro N
Pres1(
.clk_in(clk),
.clk_out(clk_out)
);
//-- Generador de reloj. Periodo 2 unidades
always #1 clk = ~clk;
//-- Comprobacion del valor del contador
//-- En cada flanco de bajada se comprueba la salida del contador
//-- y se incrementa el valor esperado
always @(negedge clk) begin
//-- Incrementar variable del contador de prueba
counter_check = counter_check + 1;
//-- El bit de mayor peso debe coincidir con clk_out
if (counter_check[N-1] != clk_out) begin
$display("--->ERROR! Prescaler no funciona correctamente");
$display("Clk out: %d, counter_check[2]: %d",
clk_out, counter_check[N-1]);
end
end
//-- Proceso al inicio
initial begin
//-- Fichero donde almacenar los resultados
$dumpfile("prescaler_tb.vcd");
$dumpvars(0, prescaler_tb);
# 99 $display("FIN de la simulacion");
# 100 $finish;
end
endmodule
converted by Web2PDFConvert.com
En esta simulacin del prescaler de 2 bits vemos cmo efectivamente la seal de salida tiene un
periodo de 4 veces el de la seal de entrada.
Repetimos la simulacin pero ahora estableciendo un prescaler de 3 bits, cambiando esta lnea:
parameter N = 2;
El resultado es:
Ejercicios propuestos
Modificar el prescaler para valores de N = 18, 19, 20 y 21. Sintetizarlos y descargarlos en la
iCEstick
Realizar la simulacin para N = 4
Conclusiones
TODO
converted by Web2PDFConvert.com