Capítulo 28 Memoria RAM.pdf

Embed Size (px)

Citation preview

  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    1/12

    Inicio(EN)

    Captulos

    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 Mltiples 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

    sncrono

    15Divisor de frecuencias

    16Contador de segundos

    17Generando tonos audibles

    18Tocando notas

    19Secuenciando notas

    20Comunicaciones serie

    asncronas

    21Baudios y transmisin

    22Reglas de diseo sncrono

    23Controladores y autmatas

    finitos

    24Unidad de transmisin serieasncrona

    25Unidad de recepcin serie

    asncrona

    26Memoria ROM

    27Memoria ROM genrica

    28Memoria RAM

    29Puertas triestado

    30Hacia el microprocesador y ms

    all

    Clone this wiki locally

    Captulo 28: Memoria RAMTestato edited this page Feb 21, 2016 29 revisions

    Ejemplos de este captulo en github

    Introduccin

    Las memorias RAMnos permiten almacenar datos y recuperarlos durante el funcionamiento del

    circuito. Son memorias donde podemos leer y escribir

    Crearemos una memoria RAM genrica, sncrona, con una entrada de datos para escritura y una

    salida para lectura. Como ejemplo disearemos un buffer de almacenamientode 16 bytes que

    cargue a travs de datos provenientes del puerto serie, y una vez llenado, se vuelca su contenido

    tambin por el puerto serie.

    Memoria RAM genrica

    La memoria RAM genrica la denominaremos genram

    Puertos y parmetros

    Los puertos y parmetros se muestran esta figura:

    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/T28-ramhttps://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-28:-Memoria-RAM/_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-28%3A-Memoria-RAMhttps://github.com/join?source=header-repohttps://github.com/explorehttps://github.com/businesshttps://github.com/open-sourcehttps://github.com/personalhttps://github.com/
  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    2/12

    Los parmetrosson los mismos que en la memoria ROM:

    DW(Data width): Anchura de los datos (en bits)

    AW(Address width): Anchura de las direcciones (en bits)

    ROMFILE: Fichero con el contenido inicial precargado de la ram

    Los puertosson:

    data_in: Entrada de datos, para escritura

    data_out: Salida de datos, en la lectura

    addr: Direccin de acceso, tanto para escritura como para lectura

    rw: Modo de acceso: lectura (rw = 1) o escritura (rw = 0)

    Cronograma

    En este cronograma se muestran dos ciclos de lecturay uno de escrituraintercalado:

    Ciclo de lectura:

    Se coloca la direccin de lectura en addr

    Se pone la seal rw a 1para indicar que se quiere leer

    En el siguiente flanco de subidase devolver el datopor el puerto data_out

    Ciclo de escritura:

    Se coloca la direccinde escritura en addr

    Se coloca el dato a escribiren el puerto data_in

    Se pone la seal rw a 0para indicar escritura

    En el siguiente flanco de subidadel reloj se escribir el dato en la memoria

    Descripcin en verilog

    El cdigo es similar al de la memoria rom pero aadiendo un proceso nuevo que se encarga de la

    escritura en cada flanco de subida del reloj, usando la seal rw como habilitacin

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    3/12

    modulegenram#( //-- Parametros

    parameterAW =5, //-- Bits de las direcciones (Adress width)

    parameterDW =4) //-- Bits de los datos (Data witdh)

    ( //-- Puertos

    inputclk, //-- Seal de reloj global

    inputwire[AW-1: 0] addr, //-- Direcciones

    inputwirerw, //-- Modo lectura (1) o escritura (0)

    inputwire[DW-1: 0] data_in, //-- Dato de entrada

    outputreg[DW-1: 0] data_out); //-- Dato a escribir

    //-- Parametro: Nombre del fichero con el contenido de la RAM

    parameterROMFILE ="bufferini.list";

    //-- Calcular el numero de posiciones totales de memoria

    localparamNPOS =2**AW;

    //-- Memoria

    reg[DW-1: 0] ram [0: NPOS-1];

    //-- Lectura de la memoria

    always@(posedgeclk) begin

    if(rw ==1)

    data_out

  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    4/12

    Ruta de datos

    En la ruta de datos se instancian la unidad de transmisin de serie (uart_tx.v), la de recepcin

    (uart_rx.v) y la memoria ram genrica (genram.v). El resto de componentes son: uncontadorpara

    direccionar la memoria, uncomparadorpara detectar cuando hay overflow en el contador(paso de

    0xF a 0) y un inicializador

    El contador es de 4 bits(para direccionar la memoria de 16 posiciones). Tiene una entrada de

    enable controlada por la microrden cenapara habili tar su cuenta. Cuando est a 1 se incrementa.

    Su salida se compara con el valor 0xF para activar la seal de overflow ov, que indica que se ha

    llegado a la ltima posicin de la memoria.

    La salida de datos del receptor serieest conectada directamente a la entrada de datos de la

    memoria, para guardar los datos recibidos en la direccin indicada por el contador. La salida de

    datos de la memoriaest conectada a la entrada de datos del transmisor serie, para su volcado

    Controlador

    Las micrordenesque genera el controlador son:

    cena: Habilitacin del contador (counter enable). Cuando est a 1 se incrementa en una unidad

    el contadorrw: Seleccin de lectura (1) o escritura (0) en la memoria

    transmit: Realizar la transmisin serie de un carcter

    El diagrama de estados del autmata es el siguiente:

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    5/12

    Comienza en el estado WAIT_TX. Se queda esperando hasta que el transmisor est listo para

    transmitir (cuando ready est a 1). Se pasa al estado READ_TXdonde se lee el dato de la memoria

    y se inicia la transmisin por el puerto serie. Se habilita el contador para que se incremente la

    direccin. Se vuelve al estado WAIT_TX hasta que se pueda enviar el siguiente.

    Permanece en ese bucle hasta que se alcanza la direccin 0xF, activndose la seal de overflow

    ov. En estos primeros dos estados se vuelca el contenido completo de la memoria. En los siguientes

    estados se almacenan los datos recibidos desde el puerto serie.

    El funcionamiento es similar, se comienza con WAIT_RX, esperando a recibir un dato. Una vez

    recibido se pasa a WRITE_RXdonde se escribe en la ram y se incrementa el contador de

    direcciones. Se repite el bucle hasta que se han almacenado los 16 caracteres. Y se procede al

    estado inicial, para comenzar su volcado

    Descripcin en verilog

    El cdigo del buffer en Verilog es el siguiente:

    //--Fichero: buffer.v

    `default_nettypenone

    `include"baudgen.vh"

    modulebuffer(inputwireclk,

    inputwirerx,

    outputwiretx,

    outputwire[3:0] leds, outputregdebug);

    //-- Velocidad de transmision

    parameterBAUD =`B115200;

    //-- Fichero con la rom

    parameterROMFILE ="bufferini.list";

    //-- Numero de bits de la direccion de memoria

    parameterAW =4;

    //-- Numero de bits de los datos almacenados en memoria

    parameterDW =8;

    //-- Seal de reset

    regrstn =0;

    //-- Inicializador

    always@(posedgeclk)

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    6/12

    rstn

  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    7/12

    _

    localparamRX_WAIT =2;

    localparamRX_WRITE =3;

    //-- Transiones de estados

    always@(posedgeclk)

    if(!rstn)

    state

  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    8/12

    Observamos que la mquina de estadosse ha hecho de una forma diferentea como se haba

    hecho en los otros ejemplos. Es otra modalidad para hacer autmatas. En esta se definen el

    registro de estado(state) y su siguiente valor(next_state):

    //-- Estado del automata

    reg[1:0] state;

    reg[1:0] next_state;

    Se define un proceso que simplemente actualiza el estado actual con el siguiente:

    //-- Transiones de estados

    always@(posedgeclk)

    if(!rstn)

    state

  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    9/12

    //----------------------------------------

    tasksend_car;

    input[7:0] car;

    begin

    rx

  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    10/12

    endmodule

    La simulacin se realiza con:

    $ make sim

    Veremos los resultados de la simulacin por partes. Primero el volcado inicial. Se observa que se

    transmiten todos los caracteres de la cadena: "ola k ase.......", que salen por la lnea data_outde la

    memoria

    A continuacin el banco de pruebas enva la cadela "HOLA QUE HACES-." y se recibe por data_in

    para escribirlo en la memoria ram

    y por ltimo esta cadena recibida y almacenada en memoria se vuelca de nuevo por el puerto serie:

    Sntesis y pruebas

    La sntesis se realiza con el comando:

    $ make sint

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    11/12

    Los recursos empleados son:

    Recurso ocupacin

    PIOs 12 / 96

    PLBs 44 / 160

    BRAMs 1 / 16

    El diseo se carga con:

    $ sudo iceprog buffer.bin

    Si abrimos primero el gtkterm y luego cargamos el bitstream, lo primero que veremos es la cadena

    volcada: "ola k ase......". A continuacin escribirmos una cadena de 16 caracteres. Al teclear el ltimo

    carcter se vuelca la cadena completa:

    El resultado se puede ver en este vdeo de youtube:

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://www.youtube.com/watch?v=36yny_7dFH4
  • 7/26/2019 Captulo 28 Memoria RAM.pdf

    12/12

    Ejercicios propuestos

    TODO

    Conclusiones

    Ya conocemos todo lo necesario para empezar a hacer microprocesadores :-)

    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