Sie sind auf Seite 1von 10

Sistemas digitales 2, Practica #5, 12/Junio/2018

Calculadora con Memoria RAM


José Emmanuel Lagunas Buenos Aires1, Vicencio Monge Morales2
11
Universidad Autónoma del Estado de Morelos, Facultad de Ciencias Químicas e Ingeniería, CP 62209,
México

RESUMEN:
En esta práctica se usan los conocimientos adquiridos de las practicas anteriores. Desde la practica #1 ALU hasta la
práctica #4. Jerarquización, memorias, registros, contadores, etc. Esta práctica es la culminación de todo el curso.

Palabras clave—Memorias, RAM, Escritura, Lectura.

I. INTRODUCCIÓN

El motivo de la realización de la práctica fue el


tener un conocimiento y una mayor habilidad
sobre los temas vistos durante el semestre.

de memoria. Un dispositivo o un circuito eléctrico


utilizado para almacenar un solo bit (0 o 1).
Ejemplos de celdas de memoria son: flip-flops, un
capacitor cargado, y una sola mancha en cinta
magnética o disco.

Palabra de memoria (Word). Un grupo de bits


(células) en una memoria que representa
instrucciones o datos de algún tipo. Los tamaños
de las palabras en las computadoras modernas
suelen oscilar entre 32 y 128 bits, dependiendo del
tamaño de la computadora.

Byte. Un término especial usado para un grupo de


II. METODOLOGIA
ocho bits. Un tamaño de palabra de ocho bits
también es un tamaño de palabra de un byte, una A. Muestras de diseño.
palabra el tamaño de 16 bits es dos bytes, y así
sucesivamente. El equipo utilizado para la práctica fue la FPGA
Altera, con el chip Cyclone E de 780 pin. Chip
Capacidad. Una forma de especificar cuántos bits EP4CE115F29C7
se puede almacenar en un determinado dispositivo
de memoria o sistema de memoria completo. Para El compilador empleado fue el Quartus de Altera
ilustrar, supongamos que tenemos una memoria versión 15 y versión 13, ambos de 64 bits.
que puede almacenar 4096 palabras de 20 bits.
Para las muestras
Esto representa una capacidad total de 81,920 bits.
Es común usar la designación "1K" para B. Análisis de datos
representar 1024 = 210; "1M" para representar
220 =1,048,576 "Giga" se refiere a 230 La recolección de los datos del programa se llevó
1,073,741,824 cuando se refiere a la capacidad de a acabo a través de la tarjeta FPGA, no se podía
la memoria. ver los resultados en la simulación. Todo debía ser
con la tarjeta, los resultados se veían en el display
de la tarjeta.
Sistemas digitales 2, Practica #5, 12/Junio/2018

III. RESULTADOS Estados para guardar


La calculadora RAM funciono al 100% con todos
valores en la Acción
los requisitos que se pedían. Se disponían de 16 calculadora
direcciones de memoria donde se pueden 00 Asigna valor en A
almacenar datos, operaciones y resultados. Esto 01 Asigna valor en B
para poder usarlo 10 Mantiene valor en A
Las operaciones que se podían realizar eran suma, 11 Mantiene valor en B
resta, división y multiplicación. Incluso se podían Tabla 2. Asignación de valores en las variables de
representar números negativos, así como con la calculadora para realizar las operaciones.
punto decimal.
Estados para las
Selector de estado en operaciones en la Acción
memoria ram calculadora
Acción
WR Selector 00 Suma
01 Resta
0 00 Hace nada
10 Multiplicación
Selecciona 11 División
0 01 dirección para Tabla 3. Estado para las operaciones aritméticas
mostrar de la calculadora
0 10 Hace nada
IV. DISCUSIÓN
Selecciona
0 11 dirección para ¿Cuáles son las especificaciones y
mostrar consideraciones que se deben tener en cuenta para
Escribe dato de elegir el tipo de memoria a utilizar en la
los switches en realización de un sistema?
1 00 el espacio de Si sólo es de escritura- lectura, sólo lectura, cómo
memoria guarda los valores en la memoria RAM y la forma
seleccionado. de sacar los datos de la memoria.
Selecciona
¿Cuál es la parte esencial para el modelado de la
1 01 dirección para
solución de un problema?
mostrar
Escribe dato de Análisis del problema, tomar todas las posibles
la variable que variables si es posible y encontrar la forma más
guarda el fácil de resolverlo.
1 10 resultado en el ¿Qué dificultades se encontraron en el desarrollo
espacio de de los sistemas solicitados?
memoria
seleccionado. Errores de hardware en la jerarquización de las
Selecciona operaciones, ese error nos llevó a la producción de
datos basura. El error se corrigió.
1 11 dirección para
mostrar V. CONCLUSIONES
Tabla 1. Estados para la asignación de valores en
memoria RAM. Las suposiciones basadas en la investigación
previa fueron correctas. Se encontró la manera de
improvisar y resolver el problema de la selección
de casos y jerarquía fue adecuada para obtener un
resultado óptimo cumpliendo con todo lo
marcado.
Sistemas digitales 2, Practica #5, 12/Junio/2018

Las operaciones se muestran claridad en el APÉNDICE


momento de realizar un barrido de memoria.

Ningún dato basura interfería con el


funcionamiento del sistema.

No se puede reusar los resultados de la operación


división porque en realidad el divisor se multiplica
por mil para obtener los decimales, y la resolución
del decodificador es de 9999.

VI. RECOMENDACIONES

Practicar más ejercicios sobre la realización e


implementación de memorias para tener un
dominio más sólido del tema. Figura 1. Resultado de la operación 2 + (-2).

Agregar un teclado hexadecimal para seleccionar


los datos y operaciones con mayor facilidad

Disminuir en la medida de lo posible el uso del if-


else para la toma de decisiones debido a que causa
que la memoria se llene de datos residuos.

REFERENCIAS

Manuel de sistemas digitales 2

DE2_115_User_Manual-1076-2008 IEEE
Standard VHDL. Language Reference Manual-
IEEE (2009)

David Pellerin, Douglas Taylor-VHDL Made


Easy Pallerin, Douglas Taylor-Prentice Hall PTR
(1996)

Ronald J. Tocci, Neal S. Widmer, Gregory L. Figura 2. Asignación del valor -8 en la


Moss, (2007). Digital Systems Principles and posición 8.
Applications, USA: Pearson, Prentice Hall.

Figura 3. Asignación del resultado de la


operación -2 - 3.
Sistemas digitales 2, Practica #5, 12/Junio/2018

Figura 6. Asignación del valor -1 en la


posición 15.

Figura 4. Asignación del valor -7 en la ranura


9 de la RAM.

Figura 7. Asignación del valor -2 en la


posición 14.
Código para la asignación de valores en la
memoria RAM.
Library IEEE;
use IEEE.std_logic_1164.all;
Figura 5. Multiplicación de 2x-2. use IEEE.std_logic_signed.all;
entity estadocalc is
port(
entrada:in std_logic_vector(3
downto 0);
selector:in std_logic_vector(1
downto 0);
enter:in std_logic;
a:out std_logic_vector (13
downto 0);
Sistemas digitales 2, Practica #5, 12/Junio/2018

direccion:out if enter='0'
std_logic_vector(3 downto 0); then
ans:in std_logic_vector(13 op1<=ans;
downto 0)
end if;
);
when "11" =>
end estadocalc;
if enter='0'
architecture compu of estadocalc is then
signal valor,op1:std_logic_vector(13
downto 0); calle<=valor(3 downto 0);
signal calle:std_logic_vector(3 end if;
downto 0);
when others=>
begin
process(valor,op1) op1<="ZZZZZZZZZZZZZZ";
begin
calle<="ZZZZ";
if entrada(3)='1' then
end case;
valor<="1111111111"&entrada; end process;
else a<=op1;
direccion<=calle;
valor<="0000000000"&entrada;
end architecture;
end if;
Código de la memoria RAM.
case selector is
library IEEE;
when "00"=>
use IEEE.std_logic_1164.all;
if enter='0' then
use IEEE.std_logic_unsigned.all;
op1<=valor;
entity RAM_16x12 is
end if;
port
when "01"=>
(
if enter='0'
WR : in std_logic; -- Enable
then
ADDR : in std_logic_vector (3 downto 0); --
Direcciones de la RAM
calle<=valor(3 downto 0);
DIN : in std_logic_vector (13 downto 0); --
end if;
Dato a escribir
when "10"=>
Sistemas digitales 2, Practica #5, 12/Junio/2018

DOUT : out std_logic_vector (13 downto 0) - RAM_ADDR_IN := conv_integer (ADDR); -


- Dato a leer - convierte la dirección a entero
); if (WR = '1') then -- Escritura de RAM
habilitada?
end entity RAM_16x12;
RAM (RAM_ADDR_IN) <= DIN ;
architecture RAM_BEHAVIOR of
RAM_16x12 is end if;
subtype WORD is std_logic_vector (13 DOUT <= RAM (RAM_ADDR_IN); --
downto 0); -- define tamaño del dato Operación de lectura siempre activa
type MEMORY is array (0 to 15) of WORD; end if;
-- tamaño de la memoria
end process;
signal RAM: MEMORY; begin
end architecture RAM_BEHAVIOR;
process (WR, DIN, ADDR)
Código de la calculadora.
-- variable para la conversión de la dirección
library ieee;
a entero
use ieee.std_logic_1164.all;
variable RAM_ADDR_IN: integer range 0 to
15; use ieee.numeric_std.all;
variable STARTUP: boolean := true; --
variable para inicialización
entity calcu is
begin
port
if (STARTUP = true) then -- Inicialización de
la RAM (

RAM <= (0 => "00000000000101", -- las 5 clk: in std_logic;


primeras localidades entrada : in std_logic_vector (13
1 => "00000000110100", downto 0);

2 => "00000000000110", aob: in std_logic_vector(1 downto


0);
3 => "00000000011000",
res : out std_logic_vector (13 downto
4 => "00000000000011", 0);
others => "00000000000000" operacion:in std_logic_vector(1
downto 0)
);
);
DOUT <= "XXXXXXXXXXXXXX"; --
configura salidas a valor indefinido end calcu;
STARTUP := false; -- esta parte del proceso
se ejecuta solo una vez
architecture cpu of calcu is
else
signal a, b, c: signed (13 downto 0);
Sistemas digitales 2, Practica #5, 12/Junio/2018

signal divisor : signed (24 downto 0); c <=


resize((divisor(13 downto 0)/b),c'length);
begin
when others =>
process (clk,entrada,aob)
c <=
begin
"00000000000000";
if aob = "00" then
end case;
if (clk' event and clk = '1')
res <= std_logic_vector(c);
then
end process;
a<=signed(entrada);
end cpu;
end if;
Código de complemento A2 para mostrar
elsif aob = "01" then
el número en display.
if (clk' event and clk = '1')
library IEEE;
then
use IEEE.STD_LOGIC_1164.all;
b<=signed(entrada);
use IEEE.NUMERIC_STD.all;
end if;
use ieee.std_logic_unsigned.all;
end if;
if (operacion = "11") then
ENTITY negado IS
divisor <= a
*"01111101000"; PORT(
else
divisor <= in1 : in std_logic_vector (13 downto
"0000000000000000000000000"; 0);
end if; out1 : out std_logic_vector (13
downto 0);
case operacion is
menos:out std_logic
when "00" =>
);
c <=
resize((a+b),c'length);
when "01" => END negado;
c <= resize((a- ARCHITECTURE arch OF negado is
b),c'length);
begin
when "10" =>
process(in1)
c <=
begin
resize((a*b),c'length);
if in1(13)='1' then
when "11" =>
Sistemas digitales 2, Practica #5, 12/Junio/2018

out1<=(not(in1))+"00000000000001"; conversion := (others => '0');


menos<='1'; -- realización de los primeros 3 corrimientos
else conversion(16 downto 3) := numero_bin;
out1<=in1; if signo='1' then
menos<='0'; d4<= "0111111";
end if; else
end process; d4<= "1111111";
end arch; end if;
Código del decodificador con signo -- iteraciones restantes para la conversion
negativo.
for i in 0 to 10 loop
library ieee;
-- obtención de unidades en 4 bits
use ieee.std_logic_1164.all;
if conversion(17 downto 14) > 4 then
use ieee.std_logic_unsigned.all;
conversion(17 downto 14) := conversion(17
entity decodificador is downto 14) + 3;
port( end if;
numero_bin : in std_logic_vector (13 downto -- obtención de decenas en 4 bits
0);
if conversion(21 downto 18) > 4 then
signo: in std_logic;
conversion(21 downto 18) := conversion(21
d0: out std_logic_vector (6 downto 0); downto 18) + 3;
d1: out std_logic_vector (6 downto 0); end if;
d2: out std_logic_vector (6 downto 0); -- obtención de centenas en 4 bits
d3: out std_logic_vector (6 downto 0); if conversion(25 downto 22) > 4 then
d4:out std_logic_vector (6 downto 0) conversion(25 downto 22) := conversion(25
downto 22) + 3;
);
end if;
end decodificador;
-- obtención de millares en 4 bits
architecture behavioral of decodificador is
if conversion(29 downto 30) > 4 then
begin
conversion(29 downto 30) := conversion(29
proceso_bcd: process(numero_bin)
downto 30) + 3;
variable conversion : std_logic_vector(29
end if;
downto 0);
-- corrimiento a la izquierda
begin
Sistemas digitales 2, Practica #5, 12/Junio/2018

conversion(29 downto 1) := conversion(28 when others => d1 <= "-------";


downto 0);
end case;
end loop;
case conversion(25 downto 22) is
-- Transformación del dato convertido a BCD
when "0000" => d2 <= "1000000";
case conversion(17 downto 14) is
when "0001" => d2 <= "1111001";
when "0000" => d0 <= "1000000"; --
when "0010" => d2 <= "0100100";
verificar la lógica de las
when "0011" => d2 <= "0110000";
when "0001" => d0 <= "1111001"; -- salidas,
tal vez se deba when "0100" => d2 <= "0011001";
when "0010" => d0 <= "0100100"; -- invertir when "0101" => d2 <= "0010010";
el valor.
when "0110" => d2 <= "0000010";
when "0011" => d0 <= "0110000";
when "0111" => d2 <= "1111000";
when "0100" => d0 <= "0011001";
when "1000" => d2 <= "0000000";
when "0101" => d0 <= "0010010";
when "1001" => d2 <= "0011000";
when "0110" => d0 <= "0000010";
when others => d2 <= "-------";
when "0111" => d0 <= "1111000";
end case;
when "1000" => d0 <= "0000000";
case conversion(29 downto 26) is
when "1001" => d0 <= "0011000";
when "0000" => d3 <= "1000000";
when others => d0 <= "-------";
when "0001" => d3 <= "1111001";
end case;
when "0010" => d3 <= "0100100";
case conversion(21 downto 18) is
when "0011" => d3 <= "0110000";
when "0000" => d1 <= "1000000";
when "0100" => d3 <= "0011001";
when "0001" => d1 <= "1111001";
when "0101" => d3 <= "0010010";
when "0010" => d1 <= "0100100";
when "0110" => d3 <= "0000010";
when "0011" => d1 <= "0110000";
when "0111" => d3 <= "1111000";
when "0100" => d1 <= "0011001";
when "1000" => d3 <= "0000000";
when "0101" => d1 <= "0010010";
when "1001" => d3 <= "0011000";
when "0110" => d1 <= "0000010";
when others => d3 <= "-------";
when "0111" => d1 <= "1111000";
end case;
when "1000" => d1 <= "0000000";
if numero_bin > "10011100010000" then
when "1001" => d1 <= "0011000";
d0 <= "1000000";
Sistemas digitales 2, Practica #5, 12/Junio/2018

d1 <= "1000000";
d2 <= "1000000";
d3 <= "1000000";
end if;
end process;
end behavioral;

Das könnte Ihnen auch gefallen