Está en la página 1de 10

Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo

MODELO ALGORÍTMICO DE UN PROCESADOR SENCILLO

ESQUEMA

2010/2011 1
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo

CICLO DE LECTURA CICLO DE ESCRITURA

FORMATO DE LAS INSTRUCCIONES

Desplazamiento lógico a la derecha (LSR)

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;

PROCEDIMIENTOS DE LA UC procedure SOLICITA_BUS is


procedure CARGA_INSTR is begin
begin PETICION_BUS <= '1';
SOLICITA_BUS; if BUS_LIBRE='0' then
ADDRESS_SOURCE<= CONT_PROG; wait until BUS_LIBRE='1';
wait until RELOJ='1'; end if;
(INC_CP, HABILITA_DIR, ESCRIBE, HABILITA_MEM, CARGA_RI) <= std_logic_vector'("11011"); end SOLICITA_BUS;
wait until RELOJ='1'; procedure LIBERA_BUS is
(INC_CP, HABILITA_DIR, ESCRIBE, HABILITA_MEM, CARGA_RI) <= std_logic_vector'("00Z00"); begin
LIBERA_BUS; PETICION_BUS <= '0';
end CARGA_INSTR; end LIBERA_BUS;
procedure EJECUTA_INSTR is when "11" => -- ARIT-LÓGICA
begin SEL_REG_LECT<= SEL_RF1;
case TIPO_INSTR is CARGA_A<= '1'; procedure CALCULA_DIR is
when "00" => CALCULA_DIR; LEC; -- LOAD wait until RELOJ = '1'; begin
when "01" => CALCULA_DIR; ESC; -- STORE CARGA_A<= '0'; SEL_REG_LECT <= SEL_RX;
when "10" => if CONDICION_SALTO='1' then -- SALTO SEL_REG_LECT<= SEL_RF2; CARGA_RDM <= '1';
CARGA_CP<= '1'; wait until RELOJ = '1'; wait until RELOJ = '1';
wait until RELOJ='1'; OPERA<= '1'; CARGA_RDM <= '0';
CARGA_CP<= '0'; ESCRIBE_REGISTRO<= '1'; end CALCULA_DIR;
end if; wait until RELOJ = '1';
OPERA<= '0';
ESCRIBE_REGISTRO<= '0';
when others => null;
end case;
end EJECUTA_INSTR;
2010/2011 4
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo

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

architecture ESTIMULOS of ESTIMULOS is


ENTORNO DE TEST signal RELOJ_I: std_logic:= '0';
type M is array (natural range <>) of unsigned(15 downto 0);
begin
Bloque de RELOJ_I <= not RELOJ_I after 25 ns;
estímulos RELOJ <= RELOJ_I;
INICIALIZA <= '1', '0' after 50 ns;
MEMORIA: process
variable MEM : M(0 to 255);
begin
MEM(0) := "0001000000001010"; -- LOAD(2,0,10)
MEM(1) := "0001100000001011"; -- LOAD(3,0,11)
MEM(2) := "1110001101000100"; -- ADD(4,3,2)
MEM(3) := "0110000000001100"; -- STORE(4,0,12)
MEM(4) := "1000000000000000"; -- JMP(0)
MEM(10) := "0000000000000011"; -- 3
MEM(11) := "0000000000001000"; -- 8
loop
DATOS <= (others => 'Z');
BLOQUE DE ESTÍMULOS wait until HABILITA_MEM'delayed(10 ns) = '1';
library IEEE; if ESCRIBE = '1' then
use IEEE.STD_LOGIC_1164.all; MEM(TO_INTEGER(DIR)) := DATOS;
use IEEE.NUMERIC_STD.all; else
entity ESTIMULOS is port ( DATOS <= MEM(TO_INTEGER(DIR));
INICIALIZA : out std_logic; wait until HABILITA_MEM'delayed(10 ns) = '0';
RELOJ : out std_logic; end if;
end loop;
BUS_LIBRE : out std_logic; end process MEMORIA;
HABILITA_MEM : in std_logic; ARBITRO_BUS: process
ESCRIBE : in std_logic; begin
PETICION_BUS : in std_logic; BUS_LIBRE <= '0'; wait until PETICION_BUS = '1';
DATOS : inout unsigned(15 downto 0); BUS_LIBRE <= '1'; wait until PETICION_BUS = '0';
DIR : in unsigned(7 downto 0)); end process ARBITRO_BUS;
end ESTIMULOS; end ESTIMULOS;
2010/2011 8
Diseño Microelectrónico I Modelo algorítmico de un procesador sencillo

MODELO DEL ENTORNO DE TEST


library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
-----------------------------------------
entity BANCO_PRUEBAS is
end BANCO_PRUEBAS;
-----------------------------------------
architecture TEST of BANCO_PRUEBAS is
signal INICIALIZA, RELOJ, BUS_LIBRE, HABILITA_MEM, ESCRIBE, PETICION_BUS: std_logic;
signal DATOS : unsigned(15 downto 0);
signal DIR : unsigned(7 downto 0);
begin
ES: entity WORK.ESTIMULOS port map (INICIALIZA, RELOJ, BUS_LIBRE, HABILITA_MEM,
ESCRIBE, PETICION_BUS, DATOS,DIR);
PR: entity WORK.PROCESADOR port map (INICIALIZA, RELOJ, BUS_LIBRE, DATOS, DIR
HABILITA_MEM, ESCRIBE, PETICION_BUS);
end TEST;

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

También podría gustarte