Professional Documents
Culture Documents
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
Introduccin
Las memorias son elementos muy comunes, que usaremos mucho en nuestros diseos. En vez
de estar haciendo memorias con un tamao determinado, es ms verstil crear una memoria
genrica cuyos parmetros de longitud de datos y de direcciones se establezcan al instanciarlas.
Crearemos una memoria rom genrica y la utilizaremos en dos ejemplo: uno para reproducir una
secuencia de luces en los leds y otro para tocar una meloda: la marcha imperial
Parmetros
https://github.com/Obijuan/open-fpga-verilog-tutor
Clone in Desktop
converted by Web2PDFConvert.com
Puertos
Los puertos de la rom son los clsicos, pero ahora su tamao no est especificado:
converted by Web2PDFConvert.com
//-- Puertos
input clk,
//-- Seal de reloj global
input wire [AW-1: 0] addr, //-- Direcciones
output reg [DW-1: 0] data); //-- Dato de salida
El tercer parmetro, ROMFILE, se define de la manera habitual, usando la palabra clave parameter
dentro del mdulo. Dentro de #() slo se definen los parmetros que afectan a los puertos
Ahora declaramos los cables que van conectados a la rom genrica en funcin de estos
parmetros:
reg [AW-1: 0] addr; //-- Bus de direcciones
reg [DW-1: 0] data; //-- Bus de datos
converted by Web2PDFConvert.com
Diagrama de bloques
Utilizaremos 5 leds para la secuencia, por lo que la anchura de los datos ser de 5 bits (DW = 5),
y una anchura de direcciones tambin de 5 bits (AW = 5, para tener 32 posiciones). La secuencia
es un contador. En cada posicin de la memoria se almacena su nmero de direccin
converted by Web2PDFConvert.com
Fichero rom1.list
El fichero que se graba en la rom, con la secuencia de ejemplo (contador) es el siguiente:
converted by Web2PDFConvert.com
Simulacin
El banco de pruebas es el mismo que en el captulo anterior. Para simular ejecutamos:
$ make sim
Por los leds aparece la secuencia de cuenta, desde 0 hasta 31 (en hexadecimal)
Sntesis y pruebas
Para sintetizar hay que ejecutar el comando:
converted by Web2PDFConvert.com
$ make sint
Recurso
ocupacin
PIOs
7 / 96
PLBs
15 / 160
BRAMs
1 / 16
Diagrama de bloques
El diseo consta de una memoria ROM de 64 posiciones de 16 bits. En cada una de ellas se
almacena el valor del divisor para generar una nota musical. Los 5 bits menos significativos de
cada valor de la nota se envan a los leds, para ver la actividad
converted by Web2PDFConvert.com
El generador de notas (notegen) es similar al que se hizo en el captulo 17 pero adaptndolo a las
reglas del diseo sncrono y haciendo que el mdulo del contador se pase como una entrada ms,
en vez de ser un valor fijo. Adems, se ha modificado para que la seal cuadrada generada tenga
siempre un ciclo de trabajo del 50% (y que todas las notas suenen con la misma intensidad)
La duracin de cada nota se ha establecido en 200ms. Colocando la misma nota en dos
posiciones consecutivas de la memoria rom, su duracin ser el doble (400ms). De esta forma se
controla de forma sencilla la duracin de todas las notas y los silencios
Descripcin en verilog
Los dos ficheros principales son el notegen.v, que contiene el componente de generacin de las
notas musicales y romnotes.v que tiene el reproductor completo
notegen.v:
//-- Fichero: notegen.v
module notegen(input wire clk,
//-- Senal de reloj global
input wire rstn,
//-- Reset
input wire [15:0] note, //-- Divisor
output reg clk_out); //-- Seal de salida
wire clk_tmp;
//-- Registro para implementar el contador modulo note
reg [15:0] divcounter = 0;
//-- Contador mdulo note
always @(posedge clk)
//-- Reset
if (rstn == 0)
divcounter <= 0;
//-- Si la nota es 0 no se incrementa contador
else if (note == 0)
divcounter <= 0;
//-- Si se alcanza el tope, poner a 0
else if (divcounter == note - 1)
divcounter <= 0;
//-- Incrementar contador
else
divcounter <= divcounter + 1;
//-- Sacar un pulso de anchura 1 ciclo de reloj si el generador
assign clk_tmp = (divcounter == 0) ? 1 : 0;
//-- Divisor de frecuencia entre 2, para obtener como salida una seal
//-- con un ciclo de trabajo del 50%
always @(posedge clk)
if (rstn == 0)
clk_out <= 0;
else if (note == 0)
clk_out <= 0;
else if (clk_tmp == 1)
clk_out <= ~clk_out;
endmodule
romnotes.v
converted by Web2PDFConvert.com
converted by Web2PDFConvert.com
Lo que se almacenan son los valores de los divisores (en hexadecimal) para generar las notas.
Los valores de las diferentes notas se encuentran en el archivo notegen.vh.
Para que una nota dure ms tiempo, se reproduce 2 ms veces, colocndose en memoria las
copias de la misma nota.
La nota 0 equivale a un silencio
Simulacin
El banco de pruebas es el clsico: se instancia el componente romnotes y se genera el reloj para que
converted by Web2PDFConvert.com
funcione:
//-- Fichero: romnotes_tb.v
module romnotes_tb();
//-- Registro para generar la seal de reloj
reg clk = 0;
//-- Salidas de los canales
wire ch_out;
Y en la simulacin podremos ver cmo se van enviando los 5 bits menos significativos de la nota a
los leds. En la simulacin la duracin de la nota est puesta a 2 unidades
Sntesis y pruebas
La sntesis se realiza con el comando:
$ make sint2
converted by Web2PDFConvert.com
Recurso
ocupacin
PIOs
7 / 96
PLBs
31 / 160
BRAMs
1 / 16
Ejercicios
Completar la marcha imperial, aumentando la memoria y aadiendo el resto de notas
Conclusiones
TODO
converted by Web2PDFConvert.com