8/17/2019 Capítulo 5 Prescaler de N Bits
1/8
Inicio (EN)
Capítulos
0 You are leaving the privative
sector (EN)
1 ¡Hola mundo! (EN)
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
7 Contador de 4 bits con prescaler
8 Registro de 4 bits
9 Inicializador
10 Registro de desplazamiento
11 Multiplexor de 2 a 1
12 Multiplexor de M a 1
13 Inicializando registros
14 Registro de N bits con resetsí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 serieasí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á
Clone this wiki locally
Capítulo 5: Prescaler de N bitsJuan Gonzalez-Gomez edited this page Dec 31, 2015 · 21 revisions
Ejemplos de este capítulo en github
Introducción
Los prescalers sirven para ralentizar las señales de reloj. Por la entrada entra una señal 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 di ferentes frecuencias
Para un prescaler de N bits, las fórmulas que relacionan las frecuencias y periodos de entrada con
los de salida son:
Entendiendo el prescaler de 2 bits
Antes de implementar un prescaler de N bits, vamos a entender cómo funciona uno de 2 bits
13 31 15Watch Star ForkObijuan / open-fpga-verilog-tutorial
Code Issues 0 Pull requests 0 Wiki Pulse Graphs
Pages 40
https://github.com/Obijuan/open-
Clone in Desktop
Personal Open source Business Explore Pric ing Blog Support This repository Search Sign upSign upSign inSign in
converted by Web2PDFConvert.com
https://github.com/Obijuan/open-fpga-verilog-tutorial/tree/master/tutorial/ICESTICK/T05-prescalerhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-30%3A-Hacia-el-microprocesador-y-m%C3%A1s-all%C3%A1http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://github.com/Obijuan/open-fpga-verilog-tutorial/tree/master/tutorial/ICESTICK/T05-prescalerhttps://windows.github.com/https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-30%3A-Hacia-el-microprocesador-y-m%C3%A1s-all%C3%A1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-29%3A-Puertas-triestadohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-28%3A-Memoria-RAMhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-27%3A-Memoria-ROM-gen%C3%A9ricahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-26%3A-Memoria-ROMhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-25%3A-Unidad-de-recepci%C3%B3n-serie-as%C3%ADncronahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-24%3A-Unidad-de-transmisi%C3%B3n-serie-as%C3%ADncronahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-23%3A-Controladores-y-aut%C3%B3matas-finitoshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-22%3A-Reglas-de-dise%C3%B1o-s%C3%ADncronohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-21%3A-Baudios-y-transmisi%C3%B3nhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-20%3A-Comunicaciones-serie-as%C3%ADncronashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-19%3A-Secuenciando-notashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-18%3A-Tocando-notashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-17%3A-Generando-tonos-audibleshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-16%3A-Contador-de-segundoshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-15%3A-Divisor-de-frecuenciashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-14%3A-Registro-de-N-bits-con-reset-s%C3%ADncronohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-13%3A-Inicializando-registroshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-12%3A-Multiplexor-de-M-a-1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-11%3A-Multiplexor-de-2-a-1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-10%3A-Registro-de-desplazamientohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-9%3A-Inicializadorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-8%3A-registro-de-4-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-7%3A-Contador-de-4-bits-con-prescalerhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-6%3A-Multiples-prescalershttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-5%3A-N-bit-prescalerhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-5%3A-Prescaler-de-N-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-4%3A-26-bit-counterhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-4%3A-Contador-de-26-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-3%3A-NOT-Gate.-Invhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-3%3A-Puerta-NOT.-Invhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-2%3A-From-bit-to-data.-Fporthttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-2%3A-De-un-bit-a-datos.-Fporthttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-1%3A-%C2%A1Hello-world%21-Setbithttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-1%3A-%C2%A1Hola-mundo%21-Setbithttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-0%3A-you-are-leaving-the-privative-sectorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-0%3A-you-are-leaving-the-privative-sectorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Home_ENhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Homehttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-5:-Prescaler-de-N-bits/_historyhttps://github.com/Obijuan/open-fpga-verilog-tutorial/graphshttps://github.com/Obijuan/open-fpga-verilog-tutorial/pulsehttps://github.com/Obijuan/open-fpga-verilog-tutorial/wikihttps://github.com/Obijuan/open-fpga-verilog-tutorial/pullshttps://github.com/Obijuan/open-fpga-verilog-tutorial/issueshttps://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuanhttps://github.com/Obijuan/open-fpga-verilog-tutorial/networkhttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/stargazershttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/watchershttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://help.github.com/https://github.com/bloghttps://github.com/pricinghttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorial%2Fwiki%2FCap%25c3%25adtulo-5%3A-Prescaler-de-N-bitshttps://github.com/join?source=header-repohttps://github.com/explorehttps://github.com/businesshttps://github.com/open-sourcehttps://github.com/personalhttps://github.com/
8/17/2019 Capítulo 5 Prescaler de N Bits
2/8
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 señal de salida. Este contador se incrementa en cada flanco de subida
de clk, que tiene un periodo T. Si observamos las señales de salida de sus dos bits (d0 y d1):
vemos que el periodo de la señal d0 es 2 veces T, y la de la señal d1 es 4 veces T. Es decir, que
cada nuevo bit duplica el periodo de la señal anterior. Siguiendo la fórmula general, el periodo de
este prescaler de 2 bits es: Tout = 2 2̂ * T = 4 * T (y gráficamente comprobamos que es así).
Frecuencias y periodos del prescaler
La frecuencia de entrada al prescaler en la placa iCEStick es de 12Mhz. Aplicando la fórmula
anterior, obtenemos esta tabla con periodos y frecuencias para prescalers con diferente número
de bits (N). Esto nos da una idea de qué valor de N elegir para hacer parpadear el led
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 5 Prescaler de N Bits
3/8
Bits (N) Frecuencia Periodo Visible
1 6 MHz 0.167 usec No
2 3 MHz 0.333 usec No
3 1.5 Mhz 0.666 usec No
4 750 Khz 1.333 usec No
5 375 Khz 2.666 usec No
6 187.5 Khz 5.333 usec No
7 93.75 KHz 10.666 usec No
8 46.875 Khz 21.333 usec No
9 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 más bits, más lento parpadeará el led.
Descripción del hardware
El código es prácticamente igual al de un contador, sin embargo introducimos la novedad de que el
prescaler es paramétrico, de forma que el número de bits está determinado por el parámetro N.
Sólo cambiando este parámetro podemos sintetizar prescalers de diferentes tamaños
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 5 Prescaler de N Bits
4/8
//-- prescaler.v
//-- clk_in: señal de reloj de entrada
//-- clk_out: Señal 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 más 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
8/17/2019 Capítulo 5 Prescaler de N Bits
5/8
Recurso ocupación
PIOs 2 / 96
PLBs 5 / 160
BRAMs 0 / 16
Lo descargamos en la FPGA mediante:
$ sudo iceprog prescaler.bin
El led D1 empezará a parpadear
En este vídeo de youtube se puede ver el led parpadeando:
Simulación
En el banco de pruebas colocamos el prescaler de N bits (por defecto con N = 2), un generador de
reloj y un bloque de comprobación que se ejecuta con cada flanco de bajada del reloj. Este bloque
tiene un registro interno que se incrementa y su bit más 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 simulación
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://www.youtube.com/watch?v=HSqNa5iC2Qc
8/17/2019 Capítulo 5 Prescaler de N Bits
6/8
El código del banco de pruebas es el siguiente:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 5 Prescaler de N Bits
7/8
//-- prescaler_tb.v
module prescaler_tb();
//-- Numero de bits del prescaler a comprobar
parameter N = 2;
//-- Registro para generar la señal 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)) //-- Par ámetro 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
Para simular ejecutamos:
$ make sim
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 5 Prescaler de N Bits
8/8
En esta simulación del prescaler de 2 bits vemos cómo efectivamente la señal de salida tiene un
periodo de 4 veces el de la señal de entrada.
Repetimos la simulación pero ahora estableciendo un prescaler de 3 bits, cambiando esta línea:
parameter N = 2;
El resultado es:
Ahora la señal de salida tiene un periodo 8 veces mayor que el de la entrada
Ejercicios propuestos
Modificar el prescaler para valores de N = 18, 19, 20 y 21. Sintetizarlos y descargarlos en la
iCEstick
Realizar la simulación para N = 4
Conclusiones
TODO
FPGA Libres: [Wiki] [Repo]
Status API Training Shop Blog About© 2016 GitHub, Inc. Terms Privacy Security Contact Help
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://help.github.com/https://github.com/contacthttps://github.com/securityhttps://github.com/site/privacyhttps://github.com/site/termshttps://github.com/abouthttps://github.com/bloghttps://shop.github.com/https://training.github.com/https://developer.github.com/https://status.github.com/https://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wikiTop Related