Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ESQUEMA
2010/2011 1
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo
Tipo de instrucción
2010/2011 2
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo
MODELO VHDL
library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all;
entity PROCESADOR is
port (INICIALIZA, RELOJ, BUS_LIBRE : in std_logic;
DATOS : inout unsigned(15 downto 0);
DIR : out unsigned(7 downto 0);
HABILITA_MEM, ESCRIBE, PETICION_BUS : out std_logic);
end PROCESADOR;
architecture ALGORITMICA of PROCESADOR is
type SEL_REG is (SEL_RD, SEL_RX, SEL_RF, SEL_RF1, SEL_RF2);
type FUENTE_DIR is (CONT_PROG, REG_DIR_MEM);
type VECTOR_REGISTRO is array (natural range <>) of unsigned(15 downto 0);
signal HABILITA_DIR, HABILITA_DATOS: std_logic;
signal ADDRESS_SOURCE : FUENTE_DIR;
signal SEL_REG_LECT : SEL_REG;
signal CARGA_RDM, CARGA_RI, CARGA_CP, CARGA_A : std_logic;
signal ESCRIBE_REGISTRO, INC_CP, OPERA, CONDICION_SALTO : std_logic;
signal TIPO_INSTR : unsigned(1 downto 0);
signal DIR_I : unsigned(7 downto 0);
signal DATOS_I : unsigned(15 downto 0);
begin
U_CONTROL: process
-- . . .
U_PROCESO: process
-- . . .
with HABILITA_DIR select
DIR <= DIR_I when '1',
(others => 'Z') when others;
with HABILITA_DATOS select
DATOS<= DATOS_I when '1',
(others => 'Z') when others;
end ALGORITMICA;
2010/2011 3
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo
UNIDAD DE CONTROL
U_CONTROL: process
-- Declaración procedimientos SOLICITA_BUS, LIBERA_BUS, LEC, ESC, CARGA_INSTR, CALCULA_DIR y EJECUTA_INSTR
begin
wait until INICIALIZA='0';
(HABILITA_MEM,ESCRIBE,PETICION_BUS,ESCRIBE_REGISTRO) <= std_logic_vector'("0Z00")
(HABILITA_DIR, HABILITA_DATOS) <= std_logic_vector'("00");
(OPERA,CARGA_RDM,CARGA_RI,INC_CP,CARGA_CP,CARGA_A) <= std_logic_vector'("000000")
loop
wait until RELOJ = '1'; CARGA_INSTR;
wait until RELOJ = '1'; EJECUTA_INSTR;
end loop;
end process U_CONTROL;
procedure LEC is
begin
SOLICITA_BUS;
ADDRESS_SOURCE <= REG_DIR_MEM;
wait until RELOJ = '1';
(HABILITA_DIR, HABILITA_MEM, ESCRIBE_REGISTRO, ESCRIBE) <= std_logic_vector'("1110");
SEL_REG_LECT <= SEL_RD;
wait until RELOJ = '1';
(HABILITA_DIR, HABILITA_MEM, ESCRIBE_REGISTRO, ESCRIBE) <= std_logic_vector'("000Z");
LIBERA_BUS;
end LEC;
procedure ESC is
begin
SOLICITA_BUS;
ADDRESS_SOURCE <= REG_DIR_MEM;
wait until RELOJ = '1';
(HABILITA_DIR, HABILITA_DATOS, ESCRIBE, HABILITA_MEM) <= std_logic_vector'("1111");
SEL_REG_LECT <= SEL_RF;
wait until RELOJ = '1';
(HABILITA_DIR, HABILITA_DATOS, ESCRIBE, HABILITA_MEM) <= std_logic_vector'("00Z0");
LIBERA_BUS;
end ESC;
2010/2011 5
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo
UNIDAD DE PROCESO
U_PROCESO: process
variable BANCO_REG : VECTOR_REGISTRO(0 to 7);
variable C, N : std_logic;
variable CP, RDM : unsigned(7 downto 0);
variable IRD : integer := 0; -- variable para indicar nº registro destino
variable A, RI : unsigned(15 downto 0);
alias TI : unsigned(1 downto 0) is RI(15 downto 14);
alias OP : unsigned(2 downto 0) is RI(2 downto 0);
alias RD : unsigned(2 downto 0) is RI(13 downto 11);
alias NUMERO : unsigned(4 downto 0) is RI(7 downto 3);
function CALC_REG_LECT(SEL_REG_LECT: SEL_REG; RI: unsigned(15 downto 0)) return natural is
begin -- función que determina el registro a leer en función del contenido de RI
case SEL_REG_LECT is
when SEL_RD | SEL_RF => return TO_INTEGER(RI(13 downto 11));
when SEL_RX | SEL_RF1 => return TO_INTEGER(RI(10 downto 8));
when SEL_RF2 => return TO_INTEGER(RI(7 downto 5));
end case;
end CALC_REG_LECT;
begin
wait until INICIALIZ='0';
CP := (others=> '0');
C := '0';
N := '0';
for I in 0 to 7 loop
BANCO_REG(I) := (others => '0');
end loop;
loop
wait until RELOJ='1';
if CARGA_RI='1' then RI:= DATOS; end if; -- Carga de RI
if CARGA_RDM='1' then RDM:=BANCO_REG(CALC_REG_LECT(SEL_REG_LECT,RI))(7 downto 0)) + RI(7 downto 0); end if; -- Carga de RDM
if CARGA_A='1' then A:=BANCO_REG(CALC_REG_LECT(SEL_REG_LECT, RI)); end if; -- Carga de A
if CARGA_CP='1' then CP:= RI(7 downto 0); end if; -- Salto
if INC_CP = '1' then CP:= CP + 1; end if; end if; -- No salto
loop
wait until RELOJ='1';
if CARGA_RI='1' then RI:= DATOS; end if; -- Carga de RI
if CARGA_RDM='1' then RDM:=BANCO_REG(CALC_REG_LECT(SEL_REG_LECT,RI))(7 downto 0)) + RI(7 downto 0);end if;-- Carga de RDM
if CARGA_A='1' then A:=BANCO_REG(CALC_REG_LECT(SEL_REG_LECT, RI)); end if; -- Carga de A
if CARGA_CP='1' then CP:= RI(7 downto 0); end if; -- Salto
-- . . .
2010/2011 6
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo
-- . . .
if INC_CP = '1' then CP:= CP + 1; end if; -- No salto
if ESCRIBE_REGISTRO = '1' then IRD:= TO_INTEGER(RD); -- ESC en el Banco de Registros
if OPERA = '1' then
case OP is
when "000”=>BANCO_REG(IRD):= NUMERO + A; -- ADDI
when "001”=>BANCO_REG(IRD):= A - NUMERO; -- SUBI
when "100”=>BANCO_REG(IRD):= A + BANCO_REG(CALC_REG_LECT(SEL_REG_LECT, RI)); -- ADD
when "101”=>BANCO_REG(IRD):=A - BANCO_REG(CALC_REG_LECT(SEL_REG_LECT, RI)); -- SUB
when "110”=>BANCO_REG(IRD):= SHIFT_LEFT(A, 1); -- LSR
when "111”=>BANCO_REG(IRD):= A and BANCO_REG(CALC_REG_LECT(SEL_REG_LECT,RI)); -- AND
when others =>null;
end case;
else BANCO_REG(IRD):= DATOS;
end if;
if BANCO_REG(IRD) = X"0000" then C:= '1';
else C:= '0';
end if;
if BANCO_REG(IRD)(15) = '1' then N:= '1';
else N:= '0';
end if;
end if;
TIPO_INSTR <= TI;
case RI(13 downto 11) is
when "000" => CONDICION_SALTO <= '1'; -- BR
when "001" => CONDICION_SALTO <= C; -- BEQ
when "010" => CONDICION_SALTO <= N; -- BL
when "011" => CONDICION_SALTO <= C or N; -- BLE
when "101" => CONDICION_SALTO <= not C; -- BNE
when "110" => CONDICION_SALTO <= C or not N; -- BGE
when "111" => CONDICION_SALTO <= (not C) and (not N); -- BG
when others =>CONDICION_SALTO <= 'X';
end case;
DATOS_I <= BANCO_REG(IRD); -- Asignación a DATOS_I
if ADDRESS_SOURCE = CONT_PROG then -- Asignación a DIRECCIÓN_I
DIR_I<= CP;
else
DIR_I<= RDM;
end if;
end loop;
end process U_PROCESO;
2010/2011 7
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo
2010/2011 9
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo
RESULTADOS DE LA SIMULACIÓN
'U'
'U' 'Z'
'U'
0 ns 500 ns
1 us 1500 ns
2010/2011 10