Upload
kevinarias
View
233
Download
0
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=PDF7/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=PDF7/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=PDF7/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=PDF7/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_7dFH47/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