Está en la página 1de 12

Universidad Autónoma Metropolitana

División CBI
Departamento de Electrónica

Laboratorio de Diseño Lógico

Práctica 11: Memorias RAM

Equipo 1
Diego Ivan Sanchez Reyes 2202015818
Luis Axel Estarrón Navarro 2222005818
Maribel Espinoza Santiago 2213032370
Profesor: Francisco Javier Sanchez Rangel

Grupo: CEL 01

Trimestre: 23-I

Fecha de entrega: 10-Junio-2023


OBJETIVOS:
1. Conocer el funcionamiento de las memorias RAM.
2. Diseñar en VHDL una memoria RAM.

MARCO TEÓRICO.
1. Describir qué es una memoria RAM.
La memoria RAM acepta información nueva y la almacena para usarla después. El
proceso de almacenamiento de información nueva en la memoria se le conoce
como operación de escritura en memoria. El proceso de transmisión de la
información almacenada en la memoria se le conoce como lectura de la memoria.
La información binaria se almacena en la memoria en grupo de bits, que se llaman
palabras. Una palabra es una entidad de bits que entra y sale de la memoria como
unidad.
La memoria RAM tiene dos características que la diferencian del resto de tipos de
almacenamiento. Por una parte, tiene una enorme velocidad, y por otra los datos
sólo se almacenan de forma temporal. Esto quiere decir que cada vez que reinicies o
apagues tu ordenador, lo normal es que los datos que haya almacenados en la RAM
se pierdan. Teniendo en cuenta que la RAM sirve para que el ordenador o dispositivo
móvil gestione los datos de las aplicaciones en funcionamiento, la cantidad que
tengas afecta directamente al rendimiento de tu dispositivo. Cuanta más RAM
tengas más aplicaciones podrás gestionar a la vez, y de ahí su importancia porque si
no hay suficiente el ordenador puede ir lento. A lo que te suelen referir como
memoria RAM cuando estás hablando de ella como un componente físico es a unas
tarjetas que van conectadas directamente a la placa base de tu ordenador. Estas
tarjetas tienen diferentes módulos de memoria integrada que están conectados
entre sí, y en dispositivos como ordenadores hay ranuras para tener varias de estas
tarjetas. La información binaria se almacena en la memoria en grupo de bits, que se
llaman palabras. Una palabra es una entidad de bits que entra y sale de la memoria
como unidad. Un grupo de ocho bits se llama byte. La mayor parte de las memorias
emplean palabras que son múltiplos de ocho bits. Generalmente, la capacidad de
una unidad de memoria se indica como la cantidad de bytes que puede almacenar.
2. Mencionar los distintos tipos de memorias RAM que existen y comentar
cómo funcionan.
Existen dos tipos de memoria RAM. Las memorias de tipo DDR (Double Data Rate)
se caracterizan por ser capaces de llevar a cabo dos operaciones en cada ciclo de
reloj, a diferencia de las de tipo SDR (Single Data Rate), que solo ejecutan una
operación de lectura o escritura. Para hacerlo posible los chips DDR se activan dos
veces en cada ciclo de la señal de reloj, bien por nivel (alto o bajo), bien por anco (de
subida o bajada).
DESARROLLO TEÓRICO.
1. Diseñe en VHDL una Memoria RAM de 16x8, la memoria debe tener salida
con buffers de tres estados. El diagrama a bloques de la memora RAM se
muestra en la Figura no. 1.

a. Determinar las entradas y salidas.


Para la elaboración de la memoria RAM 16x8, las entradas y salidas se encuentran
dadas por el diagrama de bloques presente en la figura 1.
● Se requieren 3 entradas de control:
○ Entrada de reloj de sincronización CLK.
○ Entrada de habilitación de escritura WE.
○ Entrada de habilitación de entrada RE.
● Asimismo, se requiere una entrada de selección para la dirección de memoria
que se va a leer/escribir ADRS.
● Adicionalmente, se necesita una entrada y una salida de 8 bits Din y Dout para
la entrada de datos en modo escritura y salida de datos en modo lectura.
● Finalmente, dado que la dirección de memoria y el contenido guardado en
dicha dirección se va a mostrar por medio de displays de 7 segmentos,
requerimos salidas adicionales:
○ 3 vectores de 7 bits que representen la letra ‘A’ y la letra ‘D’ para saber
que display muestra la dirección de memoria (A de ADDRESS) y que
displays muestran el contenido del registro seleccionado (DA de
DATA).

b. Elaborar la tabla de verdad.


CLK WE/RE QADRS Dout
↓ X QADRS X
↑ 10 Din X
↑ 01 QADRS QADRS

c. Diseñar el circuito a bloques.


Considerando el diagrama de bloques para la memoria presentado en la figura 1,
tenemos que la entrada ADDRESS se debe de mandar a un decoder de BCD a display
de 7 segmentos para mostrar la dirección de memoria. Asimismo, la salida de datos
Dout se debe de mandar a 2 decoders de BCD a display de 7 segmentos; uno de los
displays va a mostrar los bits menos significativos (0 a 3), mientras que el otro va a
mostrar los bits más significativos (4 a 7). El diagrama completo del circuito resulta
de la siguiente manera:

d. Diseñar el circuito en VHDL.


Para el diseño de la memoria, debemos de comenzar con las especificaciones:
● Se tienen 16 registros dentro de la memoria (# de palabras)
● Cada registro tiene un tamaño de 8 bits (longitud de cada palabra)
Por lo que, para implementar una memoria en VHDL, cada registro se representa con
un vector de 8 bits (de 7 a 0).
Ahora bien, para poder agrupar los 16 registros en una sola memoria, lo que
requerimos es un “vector de vectores”, o lo que se conoce como una matriz. En este
caso, VHDL utiliza arrays de objetos (en este caso registros) para poder crear
nuestra memoria.
Una vez declarado el array de registros, solamente es cuestión de utilizar
sentencias secuenciales if-else y case-when para implementar la selección de modo
de operación (lectura y escritura), así como un divisor de frecuencias.
Finalmente, se utiliza instanciación para convertir la dirección de memoria y la
salida de datos Dout de BCD a salidas de 7 bits para los displays de 7 segmentos. El
código en VHDL resulta de la siguiente manera:
Código para el display de 7 segmentos:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity decoder_BINto7HEX is
Port(B: in std_logic_vector(3 downto 0);
H: out std_logic_vector(6 downto 0)
);
end decoder_BINto7HEX;

architecture decoder_BINto7HEX_arch of decoder_BINto7HEX is


begin
with B select
H<= "1000000" when "0000",
"1111001"when"0001",
"0100100"when"0010",
"0110000"when"0011",
"0011001"when"0100",
"0010010"when"0101",
"0000010"when"0110",
"1111000"when"0111",
"0000000"when"1000",
"0010000"when"1001",
"0001000"when"1010",
"0000011"when"1011",
"1000110"when"1100",
"0100001"when"1101",
"0000110"when"1110",
"0001110"when"1111",
"0000000"when others;

end decoder_BINto7HEX_arch;

Código para la memoria RAM 16x8:


entity RAM_16x8 is
Port(CLK: in std_logic;
WRITE,READ: in std_logic;
ADDRESS: in std_logic_vector(3 downto 0);
Din: in std_logic_vector (7 downto 0);
Dout: buffer std_logic_vector (7 downto 0);
Display_ADDRESS,Display_DATA1,Display_DATA0: out std_logic_vector(6 downto 0);
Display_A: out std_logic_vector(6 downto 0):="0001000";
Display_A2: out std_logic_vector(6 downto 0):="0001000";
Display_D: out std_logic_vector(6 downto 0):="0100001";
Display_EMPTY0: out std_logic_vector(6 downto 0):="1111111";
Display_EMPTY1: out std_logic_vector(6 downto 0):="1111111";
FOCO: out std_logic;
end RAM_16x8;

architecture RAM_16x8_arch of RAM_16x8 is


type memtype is array(0 to 15) of std_logic_vector(7 downto 0);
signal MEMORY: memtype;
signal MEMORYout: std_logic_vector(7 downto 0);
signal Display_DATA1_aux: std_logic_vector(6 downto 0);
signal Display_DATA0_aux: std_logic_vector(6 downto 0);

signal RELOJ: std_logic;


signal DIV: std_logic_vector(25 downto 0);

component decoder_BINto7HEX is
Port(B: in std_logic_vector(3 downto 0);
H: out std_logic_vector(6 downto 0)
);
end component;
begin
--Divisor de frecuencias
process(CLK)
begin
if CLK'event and CLK='1' then
Div<=Div+1;
end if;
end process;
RELOJ<= Div(25);

--Memoria RAM
MEMORY out<=MEMORY(to_integer(unsigned(ADDRESS))) when READ='1' else (others=>'Z');
process(RELOJ)
begin
if RELOJ'event and RELOJ='1' then
if WRI='1' then
MEMORY(to_integer(unsigned(ADDRESS)))<=Din;
end if;
Dout<=MEMORYout;
end if;
end process;

--Displays
Display0: decoder_BINto7HEX port map(ADDRESS,Display_ADDRESS);
Display1: decoder_BINto7HEX port map(Dout(3 downto 0),Display_DATA0_aux);
Display1: decoder_BINto7HEX port map(Dout(7 downto 4),Display_DATA1_aux);
Display_DATA0<=Display_DATA0_aux when RE='1' else "1111111";
Display_DATA1<=Display_DATA1_aux when RE='1' else "1111111";

end RAM_16x8_arch;

MATERIAL Y EQUIPO.
• Computadora PC.
• Software Quartus II.
• Tarjeta de desarrollo ALTERA DE2.
DESARROLLO EXPERIMENTAL.
1) RAM 16x8

Imagen 1. Código en VHDL.

Imagen 2. Código en VHDL (parte 2).


Imagen 3. Código en VHDL (parte 3).

Imagen 4. Código en VHDL decoder bin to hex.

Imagen 5. RTL de RAM 16x8.


Imagen 6. Simulaciones de RAM 16x8.

Imagen 7. Pin planner de RAM 16x8.


Imagen 8. Pin planner de RAM 16x8.

Imagen 9. Pin planner de RAM 16x8.


Fotografía 1. RAM 16x8.
En la fotografía se puede apreciar los vectores D(00000000), ADDRESS(0001) y el bit
read (1), pero anteriormente se le había asignado el valor de 03 a la dirección 1, por
lo tanto al estar el address y el read activados este nos dará el valor guardado en la
dirección asignada por esa razón en los displays de 7 segmentos sale el valor 03 en
data y 1 en adress.
BIBLIOGRAFÍA.
● SÁNCHEZ RANGEL; NOTAS DEL CURSO DE DISEÑO LÓGICO
● QUARTUS II HANDBOOK VERSION 13.0, VOLUME 1: DESIGN AND SYNTHESIS;
ALTERA 2013.
● DE2 DEVELOPMENT AND EDUCATION BOARD, USER MANUAL; ALTERA 2012

CONCLUSIONES INDIVIDUALES.

DIEGO IVAN SANCHEZ REYES


En la práctica se llevó a cabo 1 proyecto, la RAM, la cual fue un poco compleja a la hora de
cambiar un poco el código visto en clase ya que se le agregaron varias cosas y lo más
confuso en este caso fue el pin planner ya que en este se tuvo que asignar muchos pines.
Para probar el write de la memoria el profesor nos puso a guardar diferentes valores en cada
address disponible para después mostrarlo con solo el read activo y así comprobar que
funcione correctamente.
MARIBEL ESPINOZA SANTIAGO.

En esta práctica se llevó a cabo un circuito, el cual tenía como objetivo principal conocer el
funcionamiento de las memorias RAM y con ello diseñar uno, el cual tenía que trabajar con
el write y el read. En este proyecto se tuvieron que asignar varios pines para que al momento
de bajar el código a la tarjeta pudiera mostrar la escritura y la lectura de la información que
había indicado el profesor. Por lo que en esta práctica no hubo problemas y se pudo cumplir
con el objetivo del proyecto.

LUIS AXEL ESTARRÓN NAVARRO


Durante la práctica fue posible diseñar e implementar una memoria RAM de 16x8 en VHDL
y mostrar la dirección de memoria y datos de salida en displays de 7 segmentos. La
implementación de la memoria se realizó por medio de las dos formas de expansión de
memoria:
● Expansión del tamaño de registro (cada registro tuvo una capacidad de 8 bits).
● Expansión del número de registros (se utilizaron 16 registros en total).
En cuanto a la implementación, esta fue la primera práctica en la que se utilizaron
los arrays de datos en VHDL, ya que previamente se habían utilizado bits o vectores de bits;
pero, para la implementación de una memoria este tipo de datos no podrían haber sido
suficientes, por lo que se utilizó un array de vectores de bits (un vector de vectores o una
matriz en términos prácticos).
Otro punto importante de la implementación fue el uso de decoder BCD a
display de 7 segmentos nuevamente. En este caso, el uso de éste bloque se utilizó tanto
para expresar la dirección de memoria, la información del registro, y para dejar ciertos
displays fijos con los caracteres ‘A’ y ‘dA’ con fines estéticos.
Con todo lo anterior, podemos concluir que se cumplieron con los objetivos de la
práctica, ya que fue posible implementar la memoria en VHDL, y por medio de la
implementación se adquirieron las bases de cómo funcionan las memorias RAM.

También podría gustarte