Está en la página 1de 8

Personal

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

Captulo 5: Prescaler de N bits


Juan Gonzalez-Gomez edited this page Dec 31, 2015 21 revisions

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:

Entendiendo el prescaler de 2 bits


Antes de implementar un prescaler de N bits, vamos a entender cmo funciona uno de 2 bits

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 Mltiples 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 reset
sncrono
15 Divisor de frecuencias
16 Contador de segundos
17 Generando tonos audibles
18 Tocando notas
19 Secuenciando notas
20 Comunicaciones serie
asncronas
21 Baudios y transmisin
22 Reglas de diseo sncrono
23 Controladores y autmatas
finitos
24 Unidad de transmisin serie
asncrona
25 Unidad de recepcin serie
asncrona
26 Memoria ROM
27 Memoria ROM genrica
28 Memoria RAM
29 Puertas triestado
30 Hacia el microprocesador y ms
all
Clone this wiki locally

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

vemos que el periodo de la seal d0 es 2 veces T, y la de la seal d1 es 4 veces T. Es decir, que


cada nuevo bit duplica el periodo de la seal anterior. Siguiendo la frmula general, el periodo de
este prescaler de 2 bits es: Tout = 2^2 * T = 4 * T (y grficamente comprobamos que es as).

Frecuencias y periodos del prescaler


La frecuencia de entrada al prescaler en la placa iCEStick es de 12Mhz . Aplicando la frmula
anterior, obtenemos esta tabla con periodos y frecuencias para prescalers con diferente nmero
de bits (N). Esto nos da una idea de qu valor de N elegir para hacer parpadear el led

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.

Descripcin del hardware


El cdigo es prcticamente igual al de un contador, sin embargo introducimos la novedad de que el
prescaler es paramtrico, de forma que el nmero de bits est determinado por el parmetro N.
Slo cambiando este parmetro podemos sintetizar prescalers de diferentes tamaos

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

Para sintentizar ejecutamos el comando:


$ make sint

Los recursos empleados son:

converted by Web2PDFConvert.com

Recurso

ocupacin

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 vdeo de youtube se puede ver el led parpadeando:

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

El cdigo del banco de pruebas es el siguiente:

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

Para simular ejecutamos:


$ make sim

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:

Ahora la seal 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 simulacin para N = 4

Conclusiones
TODO

FPGA Libres: [Wiki] [Repo]

2016 GitHub, Inc. Terms Privacy Security Contact Help

Status API Training Shop Blog About

converted by Web2PDFConvert.com

También podría gustarte