Beruflich Dokumente
Kultur Dokumente
REPORTE
Proyecto: microprocesador ruta de datos con
unidad de control
Ing. Electrónica
Profesor:
Carlos Eduardo Torres Reyes
P R E S E N T A N:
Objetivo:
Construir un microprocesador que con una ruta de datos y unidad de control en
vhdl de 8 bits capaz de realizar múltiples operaciones lógicas y aritméticas sin que
se desperdicien datos anteriores para poder aplicar alguna otra operación con
ayuda de multiples bloques que se mostraran a continuación:
Desarrollo:
La ruta de datos de un microprocesador, es una parte fundamental del mismo para
la programación en VHDL.
La ruta de datos, se compone de diferentes bloques, cada uno de ellos, con una
tarea específica y fundamental para el correcto funcionamiento de la máquina. Los
bloques contenidos en ella, serán descritos a continuación:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity BR_TOP is
port(
D: in unsigned (7 downto 0);
DA,AA,BA: in std_logic;
clk,RW: in std_logic; --actializa cada registro
salA,salB: out unsigned(7 downto 0)
);
end entity BR_TOP;
begin
-- Actualizar registros con clk, reset
process(clk)
begin
if (clk'event and clk='1') then
r0_reg <= r0_next;
r1_reg <= r1_next;
ba_reg <= ba_next;
bb_reg <= bb_next;
end if;
end process;
-- Asignaciones a ***_next
process ( ba_reg,bb_reg,BA,AA,DA,D,r0_reg,r1_reg,RW) is
begin
r0_next <= r0_reg;
r1_next <= r1_reg;
ba_next <= ba_reg;
bb_next <= bb_reg;
end if;
else
null;
end if;
if AA <='0' then
ba_next <=r0_reg;
else
ba_next<=r1_reg;
end if;
if BA <='0' then
bb_next <=r0_reg;
else
bb_next<=r1_reg;
end if;
end process;
-- Salidas
process (ba_reg,bb_reg) is
begin
salA <= ba_reg;
salB <= bb_reg;
end process;
end architecture una;
Figura.1
2.- MULTIPLEXOR B
A través de él, se da el paso al conjunto de bit’s que servirán como dirección para
la memoria. Contiene tres entradas y una salida como se puede ver a continuación
el código y en la figura 2 se muestra el multiplexor:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity MUXB_TOP is
port(
R: in unsigned(7 downto 0); --entrada del relleno de ceros
B: in unsigned(7 downto 0); --entrada del banco de registos
MB: in std_logic; --selector
SALMUXB: out unsigned( 7 downto 0) --salida que conecta memoria y alu.
);
end entity MUXB_TOP ;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
entity ALU_TOP is
port(
A,B:in unsigned(7 downto 0);
ope:in unsigned(2 downto 0); --selector
salalu:out unsigned(7 downto 0);
FC:out bit --activa el acarreo
);
begin
Figura. 3
4.- MEMORIA
Se utilizó una memoria ram 8x8 para poder leer y escribir los datos para las
direcciones de entrada y salida para poder ingresar datos. En la figura se puede
ver el circuito de nuestra memoria.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity ram8x8_TOP is
port(
a:in Unsigned(2 downto 0);
oe,we: in std_logic;
din: in unsigned(7 downto 0);
dout: out unsigned(7 downto 0)
);
5. MULTIPLEXOR D
Se usa de igual forma el mismo multiplexor B solo que en este se añaden una
salida de la unidad aritmética lógica y otra salida de datos el código es el siguiente
y en la figura 5 se pude observar el circuito.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity MUXD_TOP is
port(
salalu, saldatos: in unsigned(7 downto 0); --salida del alu y salida de datos
MD: in std_logic; --selecor
SALMUXD: out unsigned( 7 downto 0) --salida del multiplexor D
);
end entity MUXD_TOP ;
Figura. 5
6.- INSTANCIAMIENTO DE RUTA DE DATOS
La siguiente parte que se realizo fue la unidad de control la cual está constituida
por un oscilador, un contador, una memoria de instrucciones (memoria rom8x8) y
un descodificador de instrucciones que a continuación se mostraran:
Las entradas son nuestro clk y reset y nuestra salida la pusimos con la variable
“b”. Conforme nuestro oscilador vaya produciendo señales va ir funcionando
nuestro contador y a la vez va ir cambiando cada estado.
port(
rst, clk : in std_logic;
b : out std_logic_vector (2 downto 0));
Figura .7
library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
entity mem_top is
port(
ad: in std_logic_vector(2 downto 0);
instru: out std_logic_vector(7 downto 0);
oe: in std_logic;
cs: in std_logic
);
end entity mem_top;
Figura 8
El descodificador está compuesto por una entrada y una salida y como su nombre
lo dice nos va a convertir un dato en binario de 8 bits a una salida de 14 bits, que
la salida será nuestra palabra de control la cual va ir activando cada bit
correspondiente a la ruta de datos y cada palabra de control será una instrucción.
Como se podrá observar a continuación el código. En la figura 9 se verá su
circuito.
entity descodificador_top is
port(
Figura 9
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
entity process_top is
port(
rst, clk : in std_logic;
oe,cs: in std_logic;
Din: in unsigned(7 downto 0);
SAL:out unsigned(7 downto 0);
FC:out bit
);
u1:work.conme_top(una)
port map(rst=>rst, clk=>clk, oe=>oe,cs=>cs, salida=>salida );
u2:work.ruta_top(una)
port map(clk=>clk, Rw=>salida(8),Dir=>salida(13 downto
11),oe=>salida(10),we=>salida(9),Da=>salida(0),Aa=>salida(1),Ba=>salida(2),MB=>salida(3),MD
=>salida(7),R=>Din,ope=>salida(6 downto 4), SAL=>SAL,FC=>FC);
end una;
Figura 11
En la parte izquierda se observara nuestras entradas que serán clk, oe, cs, reset y
nuestro dato de entrada, también estarán lo que son nuestras salidas como FC
(bandera de acarreo) y nuestra salida externa en la cual se van ir mostrando los
resultados de cada operación hecha.
Figura 12
Comentarios:
La ruta de datos es una parte fundamental para poder nuestro propio procesador
con las especificaciones e instrucciones que se nos puedan asignar. Lo que
genera algunas complicaciones es el banco de registro, asignar las direcciones
correctamente y como poder manipularla con la unidad de control dentro del
mismo procesador. Lo que vimos que nos faltó hacer es que en el banco de
registros se guardara cada dato en cada uno de los registros y en nuestro caso se
guardaba en paralelo el dato en los dos registros que teníamos.
Referencias:
Tal y como se dice en Fundamentos de diseño lógico y de computadoras (Morris
Mano, 2005) La ALU es una parte fundamental para el desarrollo de una ruta de
datos porque es un circuito digital que calcula operaciones aritméticas y
operaciones lógicas, entre valores de los argumentos.