Capítulo 27 Memoria ROM genérica.pdf

  • View
    214

  • Download
    0

Embed Size (px)

Text 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