8/17/2019 Capítulo 26 Memoria ROM.pdf
1/15
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
10Registro de desplazamiento
11Multiplexor de 2 a 1
12Multiplexor de M a 1
13 Inicializando registros
14Registro de N bits con reset
síncrono
15Divisor de frecuencias
16Contador de segundos
17Generando tonos audibles
18Tocando notas
19Secuenciando notas
20Comunicaciones serie
asíncronas
21Baudios y transmisión
22Reglas de diseño síncrono
23Controladores y autómatas
finitos
24Unidad de transmisión serieasíncrona
25Unidad de recepción serie
asíncrona
26Memoria ROM
27Memoria ROM genérica
28Memoria RAM
29Puertas triestado
30Hacia el microprocesador y más
allá
Clone this wiki locally
Capítulo 26: Memoria ROMTestato edited this page Feb 21, 2016 · 36 revisions
Ejemplos de este capítulo en github
Introducción
Las memorias nos permiten almacenar información para usarlas en nuestros circuitos: datos,
instrucciones, configuraciones, etc. Son los componentes esenciales para crear circuitos más
complejos, como por ejemplo microprocesadores.
Mostraremos cómo se modelan las memorias ROM (de sólo lectura) en verilog y haremos tres
ejemplos muy sencillos: un hola mundo y dos ejemplos de generación de secuencias en los leds,
para cargar en la placa ICEstick
Memoria ROM 32x4
Comenzaremos por una rom muy sencilla, que puede almacenar 32 valores de 4 bits. Las
direcciones de memoria van desde la 0 hasta la 31. Se necesitan 5 bits para representarlas
13 31 15Watch Star ForkObijuan / open-fpga-verilog-tutorial
Code Issues 0 Pull requests 0 Wiki Pulse Graphs
Pages 40
https://github.com/Obijua
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-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/T26-romhttps://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-26:-Memoria-ROM/_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-26%3A-Memoria-ROMhttps://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 26 Memoria ROM.pdf
2/15
Pines de acceso
Los puertos de acceso a la memoria son:
clk: Señal de reloj del sistema. Es un circuito síncrono, que nos devuelve los datos en el flanco
activo del reloj
addr : Entrada: Dirección a leer (5 bits)
data: Salida: Dato almacenado en esa posición
Cronograma
Para acceder a la memoria rom se deposita la dirección el puerto addres. En el siguiente flanco de
bajada del reloj, se obtendrá el dato
Descripción en verilog
El código verilog de la memoria rom de 32x4 es el siguiente:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 26 Memoria ROM.pdf
3/15
//-- Fichero rom32x4.v
`default_nettype none
module rom32x4 (input clk,
input wire [4:0] addr,
output reg [3:0] data);
//-- Memoria
reg [3:0] rom [0:31];
//-- Proceso de acceso a la memoria.
//-- Se ha elegido flanco de bajada en este ejemplo, pero
//-- funciona igual si es de subida
always @(negedge clk) begin
data
8/17/2019 Capítulo 26 Memoria ROM.pdf
4/15
La salida de datos de la rom se conecta directamente a los 4 leds rojos de la placa ICEStick,
para visualizar el dato que sale. Colocamos una dirección fija por la entrada addr . El contenido de
esa dirección se mostrará por los leds. Dependiendo de la dirección, por los leds se mostrará un
dato u otro
romhw.v: Descripción en Verilog
El código verilog es el siguiente:
//-- Fichero romhw.v
`default_nettype none
module romhw (input wire clk,
output wire [3:0] leds);
localparam ADDR = 5'h5; //-- Direccion 5 por defecto
//-- Instanciar la memoria rom
rom32x4
ROM (
.clk(clk),
.addr(ADDR),
.data(leds)
);
endmodule
El parámetro ADDR se usa para establecer la dirección constante que queremos visualizar en los
leds. Por defecto se ha elegido la dirección 5
Simulación
El banco de pruebas es muy sencillo. Sólo instancia el circuito romhw y genera la señal de reloj para
que funcione
La simulación se realiza con:
$ make sim
y los resultados obtenidos en gtkwave son:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 26 Memoria ROM.pdf
5/15
El valor que se obtiene es 5 (que es lo que se ha almacenado en la posición de memoria 5 de la
rom)
Síntesis y pruebas
La síntesis se realiza con el comando:
$ make sint
Los recursos empleados son:
Recurso ocupación
PIOs 3 / 96
PLBs 2 / 160
BRAMs 1 / 16
Observamos que ahora se está usando 1 bloque de memoria (BRAM, Block RAM) de los 16 que
tiene la FPGA. El sintetizador ha detectado que hay una memoria en nuestro diseño y la ha
sintetizado mediante un bloque de memoria.
El diseño se carga con:
$ sudo iceprog romhw.bin
Por los leds se visualizará esto:
(led superior e inferior encendidos)
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 26 Memoria ROM.pdf
6/15
Ejemplo 2: Secuencia de luces
Como segundo ejemplo vamos a generar una secuencia de luces en los leds. Los valores están
almacenados en una memoria rom de 16x4
Diagrama de bloques
La memoria se direcciona mediante un contador de 4 bits, de forma que se recorre la memoria
desde la dirección 0 hasta la 15. El valor de cada posición se envía directamente a los leds. El
contador se incrementa cada medio segundo, mediante un temporizador
Simplemente cambiando los valores almacenados en la memoria, se consigue una secuencia
diferente
Descripción en Verilog
Memoria ROM de 16x4
La memoria rom es igual que la de 32x4, pero inicializada con los valores de la secuencia:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 26 Memoria ROM.pdf
7/15
//-- Fichero: rom16x4.v
module rom16x4 (input clk,
input wire [3:0] addr,
output reg [3:0] data);
//-- Memoria
reg [3:0] rom [0:31];
always @(negedge clk) begin
data
8/17/2019 Capítulo 26 Memoria ROM.pdf
8/15
//-- Fichero: romleds.v
`default_nettype none
`include "divider.vh"
module romleds (input wire clk,
output wire [3:0] leds);
//- Tiempo de envio
parameter DELAY = `T_500ms; //`T_1s;
reg [3:0] addr;
reg rstn = 0;
wire clk_delay;
//-- Instanciar la memoria rom
rom16x4
ROM (
.clk(clk),
.addr(addr),
.data(leds)
);
//-- Contadoralways @(negedge clk)
if (rstn == 0)
addr
8/17/2019 Capítulo 26 Memoria ROM.pdf
9/15
//-- Fichero: romleds_tb.v
module romleds_tb();
//-- Para la simulacion se usa un retraso de 2 ciclos de reloj
parameter DELAY = 2;
//-- Registro para generar la señal de reloj
reg clk = 0;
//-- Datos de salida del componente
wire [3:0] leds;
//-- Instanciar el componente
romleds #(DELAY)
dut(
.clk(clk),
.leds(leds)
);
//-- Generador de reloj. Periodo 2 unidades
always #1 clk = ~clk;
//-- Proceso al inicioinitial begin
//-- Fichero donde almacenar los resultados
$dumpfile("romleds_tb.vcd");
$dumpvars(0, romleds_tb);
# 100 $display("FIN de la simulacion");
$finish;
end
endmodule
La simulación se realiza con:
$ make sim2
y los resultados obtenidos en gtkwave son:
Síntesis y pruebas
La síntesis se realiza con el comando:
$ make sint2
Los recursos empleados son:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 26 Memoria ROM.pdf
10/15
Recurso ocupación
PIOs 4 / 96
PLBs 13 / 160
BRAMs 1 / 16
El diseño se carga con:
$ sudo iceprog romleds.bin
La secuencia que aparece en los leds se puede ver en este vídeo de youtube:
Cargando la ROM desde un ficheroLa carga de las roms se puede hacer tamién desde un fichero. Esto es especialmente útil si lo
que se está cargando es el código máquina de un programa. El ensamblador genera este código
máquina en un fichero de texto que posteriormente se carga en nuestra rom
La lectura desde fichero se realiza con las funciones $readmemh y $readmemb. El primero es para
leer un fichero con datos en hexadecimal, y el segundo en binario.
romfile16x4.v: Descripción en Verilog
Esta es una memoria de 16x4 cuyo contenido se carga desde el fichero rom1.list. El código verilog
es:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://www.youtube.com/watch?v=HKHM_NONhKg
8/17/2019 Capítulo 26 Memoria ROM.pdf
11/15
//-- Fichero romfile16x4
module romfile16x4 (input clk,
input wire [3:0] addr,
output reg [3:0] data);
//-- Parametro: Nombre del fichero con el contenido de la ROM
parameter ROMFILE = "rom1.list";
//-- Memoria
reg [3:0] rom [0:31];
//-- Lectura de la memoria
always @(negedge clk) begin
data
8/17/2019 Capítulo 26 Memoria ROM.pdf
12/15
//-- Fichero romleds2.v
`default_nettype none
`include "divider.vh"
module romleds2 (input wire clk,
output wire [3:0] leds);
//-- Parametros:
//- Tiempo de envio
parameter DELAY = `T_500ms; //`T_1s;
//-- Fichero para cargar la rom
parameter ROMFILE = "rom1.list"; //-- rom2.list
reg [3:0] addr;
reg rstn = 0;
wire clk_delay;
//-- Instanciar la memoria rom
romfile16x4 #(ROMFILE)
ROM (
.clk(clk),
.addr(addr), .data(leds)
);
//-- Contador
always @(negedge clk)
if (rstn == 0)
addr
8/17/2019 Capítulo 26 Memoria ROM.pdf
13/15
//-- Fichero: romleds_tb.v
module romleds2_tb();
//-- Para la simulacion se usa un retraso de 2 ciclos de reloj
parameter DELAY = 2;
parameter ROMFILE = "rom1.list";
//-- Registro para generar la señal de reloj
reg clk = 0;
//-- Datos de salida del componente
wire [3:0] leds;
//-- Instanciar el componente
romleds2 #(.DELAY(DELAY), .ROMFILE(ROMFILE))
dut(
.clk(clk),
.leds(leds)
);
//-- Generador de reloj. Periodo 2 unidades
always #1 clk = ~clk;
//-- Proceso al inicio
initial begin
//-- Fichero donde almacenar los resultados
$dumpfile("romleds2_tb.vcd");
$dumpvars(0, romleds2_tb);
# 100 $display("FIN de la simulacion");
$finish;
end
endmodule
La simulación se realiza con:
$ make sim3
y los resultados obtenidos en gtkwave son:
Se está usando la rom1.list, que tiene en cada posición un valor igual a su dirección, como se puede
comprobar en la simulación
Para simular la secuencia con la otra rom, hay que cambiar el fichero rom1.list por rom2.list en esta
línea del banco de pruebas:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 26 Memoria ROM.pdf
14/15
parameter ROMFILE = "rom2.list";
Ahora al simular vemos una secuencia diferente:
Síntesis y pruebas
Primero seleccionamos el fichero con el contenido de la rom y lo ponemos en esta línea del
fichero romleds2.v:
parameter ROMFILE = "rom1.list"; //-- rom2.list
La síntesis se realiza con el comando:
$ make sint3
Los recursos empleados son:
Recurso ocupación
PIOs 4 / 96
PLBs 14 / 160
BRAMs 1 / 16
El diseño se carga con:
$ sudo iceprog romleds2.bin
Igual que en el ejemplo 2, veremos cómo leds siguen una secuencia, dada por los valores que
hayamos colocado en la rom
Ejercicios propuestos
Crear una secuencia en los leds con 32 valores, que se carguen desde un fichero
CONCLUSIONESTODO
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 26 Memoria ROM.pdf
15/15
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/wiki