Capítulo 26 Memoria ROM.pdf

Embed Size (px)

Citation preview

  • 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