Capítulo 27 Memoria ROM genérica.pdf
-
Upload
kevinarias -
Category
Documents
-
view
217 -
download
0
Transcript of Capítulo 27 Memoria ROM genérica.pdf
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
1/13
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 27: Memoria ROM genéricaTestato edited this page Feb 21, 2016 · 27 revisions
Ejemplos de este capítulo en github
Introducción
Las memorias son elementos muy comunes, que usaremos mucho en nuestros diseños. En vez
de estar haciendo memorias con un tamaño determinado, es más versátil crear una memoria
genérica cuyos parámetros de longitud de datos y de direcciones se establezcan al instanciarlas.
Crearemos una memoria rom genérica y la utilizaremos en dos ejemplo: uno para reproducir una
secuencia de luces en los leds y otro para tocar una melodía: la marcha imperial
Memoria rom paramétrica
La memoria rom genérica la denominaremos genrom
Parámetros
Tiene 3 parámetros que se asignan al instanciarse la rom:
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/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-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/T27-rom-paramhttps://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-27:-Memoria-ROM-gen%C3%A9rica/_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-27%3A-Memoria-ROM-gen%25c3%25a9ricahttps://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 27 Memoria ROM genérica.pdf
2/13
DW (Data width): Anchura de los datos (en bits)
AW (Address width): Anchura de las direcciones (en bits)
ROMFILE: Fichero con el contenido de la rom
Puertos
Los puertos de la rom son los clásicos, pero ahora su tamaño no está especificado:
Addr : Bus de direcciones
data: Bus de datos
clk: Reloj del sistema
genrom.v: Descripción en Verilog
Puesto que los puertos (addr y data) son genéricos, y por tanto se tienen que definir al declarar el
módulo, es necesario primero definir los parámetros AW y DW. Luego, en función de ellos se definen
los puertos. Esto se codifica en verilog con esta estructura:
module nombre #(definición de parametros) (definicion de puertos);
El código verilog de la memoria rom genérica es:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
3/13
//-- Fichero: genrom.v
module genrom #( //-- Parametros
parameter AW = 5, //-- Bits de las direcciones (Adress width)
parameter DW = 4) //-- Bits de los datos (Data witdh)
( //-- Puertos
input clk, //-- Señal de reloj global
input wire [AW-1: 0] addr, //-- Direcciones
output reg [DW-1: 0] data); //-- Dato de salida
//-- Parametro: Nombre del fichero con el contenido de la ROM
parameter ROMFILE = "rom1.list";
//-- Calcular el numero de posiciones totales de memoria
localparam NPOS = 2 ** AW;
//-- Memoria
reg [DW-1: 0] rom [0: NPOS-1];
//-- Lectura de la memoria
always @(posedge clk) begin
data
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
4/13
Ejemplo 1: secuencia en los leds
En este ejemplo reproduciremos una secuencia en los leds, igual que en los ejemplos del capítulo
anterior, pero usando una rom genérica
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 también de 5 bits (AW = 5, para tener 32 posiciones). La secuencia
es un contador. En cada posición de la memoria se almacena su número de dirección
genromleds.v: Descripción en verilog
La descripción en verilog del ejemplo es:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
5/13
//-- Fichero: genromleds.v
`default_nettype none
`include "divider.vh"
module genromleds (input wire clk,
output wire [4:0] leds);
//- Tiempo de envio
parameter DELAY = ̀ T_500ms;
//-- Fichero con la rom
parameter ROMFILE = "rom1.list";
//-- Numero de bits de la direccione
parameter AW = 5;
parameter DW = 5;
//-- Cable para direccionar la memoria
reg [AW-1: 0] addr;
reg rstn = 0;
wire clk_delay;
//-- Instanciar la memoria rom
genrom
#( .ROMFILE(ROMFILE),
.AW(AW),
.DW(DW))
ROM (
.clk(clk),
.addr(addr),
.data(leds)
);
//-- Contador
always @(negedge clk) if (rstn == 0)
addr
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
6/13
//-- Fichero rom1.list
//-- Cada linea se corresponde con una posicion de memoria
//-- Se pueden poner comentarios
//-- ROM1: contiene los numeros del 0 al 31 (en hexadecimal)
0 //-- Posicion 0
1 //-- Posicion 1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10
11
12
1314
15
16
17
18
19
1A
1B
1C
1D
1E
1F
Simulación
El banco de pruebas es el mismo que en el capítulo anterior. Para simular ejecutamos:
$ make sim
y en el gtkwave vemos lo siguiente:
Por los leds aparece la secuencia de cuenta, desde 0 hasta 31 (en hexadecimal)
Síntesis y pruebas
Para sintetizar hay que ejecutar el comando:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
7/13
$ make sint
Los recursos empleados son:
Recurso ocupación
PIOs 7 / 96
PLBs 15 / 160
BRAMs 1 / 16
El diseño se carga con:
$ sudo iceprog genromleds.bin
Se podrá ver por los leds la secuencia de cuenta
Ejemplo 2: Tocando la marcha imperialEn el segundo ejemplo tocaremos un fragmento de la marcha imperial de star wars. Esto es un
clásico en el grupo de Clone wars, tocándose con los motores paso a paso para comprobar su
funcionamiento. Pues bien, una FPGA no la tendrás dominada hasta que no toques con ella la
marcha imperial :-)
Diagrama de bloques
El diseño 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 envían a los leds, para ver la actividad
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttp://www.reprap.org/wiki/Proyecto_Clone_Warshttps://es.wikipedia.org/wiki/Marcha_Imperial
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
8/13
El generador de notas (notegen) es similar al que se hizo en el capítulo 17 pero adaptándolo a las
reglas del diseño síncrono y haciendo que el módulo del contador se pase como una entrada más,
en vez de ser un valor fijo. Además, se ha modificado para que la señal cuadrada generada tenga
siempre unciclo de trabajo del 50% (y que todas las notas suenen con la misma intensidad)
La duración de cada nota se ha establecido en 200ms. Colocando la misma nota en dos
posiciones consecutivas de la memoria rom, su duración será el doble (400ms). De esta forma se
controla de forma sencilla la duración de todas las notas y los silencios
Descripción en verilog
Los dos ficheros principales son el notegen.v, que contiene el componente de generación 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); //-- Señal de salida
wire clk_tmp;
//-- Registro para implementar el contador modulo note
reg [15:0] divcounter = 0;
//-- Contador módulo note
always @(posedge clk)
//-- Reset
if (rstn == 0)
divcounter
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
9/13
La descripción en verilog del circuito reproductor se muestra a continuación:
//-- Fichero romnotes.v
//-- Incluir las constantes del modulo del divisor
`include "divider.vh"
//-- Parametros:
//-- clk: Reloj de entrada de la placa iCEstick
//-- ch_out: Canal de salida
module romnotes(input wire clk,
output wire [4:0] leds,
output wire ch_out);
//-- Parametros
//-- Duracion de las notas
parameter DUR = ̀ T_200ms;
//-- Fichero con las notas para cargar en la rom
parameter ROMFILE = "imperial.list";
//-- Tamaño del bus de direcciones de la rom
parameter AW = 6;
//-- Tamaño de las notasparameter DW = 16;
//-- Cables de salida de los canales
wire ch0, ch1, ch2;
//-- Selección del canal del multiplexor
reg [AW-1: 0] addr = 0;
//-- Reloj con la duracion de la nota
wire clk_dur;
reg rstn = 0;
wire [DW-1: 0] note;
//-- Instanciar la memoria rom
genrom
#( .ROMFILE(ROMFILE),
.AW(AW),
.DW(DW))
ROM (
.clk(clk),
.addr(addr),
.data(note)
);
//-- Generador de notas
notegen
CH0 (
.clk(clk),
.rstn(rstn),
.note(note),
.clk_out(ch_out)
);
//-- Sacar los 5 bits menos significativos de la nota por los leds
assign leds = note[4:0];
//-- Inicializador
always @(posedge clk)
rstn
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
10/13
//-- Divisor para marcar la duración de cada nota
dividerp1 #(DUR)
TIMER0 (
.clk(clk),
.clk_out(clk_dur)
);
endmodule
El parámetro DUR determina la duración mínima de una nota (o un silencio), que se ha
establecido en 200ms. Para reproducir una nota del doble de duración, simplemente se toca dos
veces. Tocándola N veces durará N * 200ms.
Contenido de la ROM: imperial.list
La melodía de la marcha imperial está almacenada en este fichero de texto:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
11/13
//-- Marcha imperial
0 //-- Un 0 es un SILENCIO
0
0
0
0
0
0
0
0
471A //-- MI_4
471A
0
471A //-- MI_4
471A
0
471A //-- MI_4
471A
0
5996 //-- DO_4
5996
3BCA //-- SOL_4
471A //-- MI_4
471A0
5996 //-- DO_4
5996
3BCA //-- SOL_4
471A //-- MI_4
471A
//----------- Segundo trozo
0
0
0
2F75 //-- SI_4
2F75
02F75 //-- SI_4
2F75
0
2F75 //-- SI_4
2F75
0
2CCB //-- DO_5
2CCB
3BCA //-- SOL_4
471A //-- MI_4
471A
0
5996 //-- DO_4
5996
3BCA //-- SOL_4
471A //-- MI_4
471A
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 más tiempo, se reproduce 2 ó más veces, colocándose en memoria las
copias de la misma nota.
La nota 0 equivale a un silencio
Simulación
El banco de pruebas es el clásico: se instancia el componente romnotes y se genera el reloj para que
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
12/13
funcione:
//-- Fichero: romnotes_tb.v
module romnotes_tb();
//-- Registro para generar la señal de reloj
reg clk = 0;
//-- Salidas de los canales
wire ch_out;
//-- Instanciar el componente y establecer el valor del divisor
//-- Se pone un valor bajo para simular (de lo contrario tardaria mucho)
romnotes #(.DUR(2))
dut(
.clk(clk),
.ch_out(ch_out)
);
//-- Generador de reloj. Periodo 2 unidades
always
# 1 clk
-
8/17/2019 Capítulo 27 Memoria ROM genérica.pdf
13/13
Los recursos empleados son:
Recurso ocupación
PIOs 7 / 96
PLBs 31 / 160
BRAMs 1 / 16
El diseño se carga con:
$ sudo iceprog romnotes.bin
El resultado se puede ver en este vídeo de youtube:
¡Que las FPGAs te acompañen!
Ejercicios
Completar la marcha imperial, aumentando la memoria y añadiendo el resto de notas
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/wikihttps://www.youtube.com/watch?v=IDU8kHAaLTw