Você está na página 1de 15

MIPS Monociclo

Implementao em VHDL
Moraes 03/maio/2011
Incrementada por Calazans em
maio/2013

Instrues suportadas
ADDU, SUBU, AND, OR, XOR, NOR
Formato R

ORI, LW, SW
Formato I

Hardware

Bloco de Controle
IR_out

control_unit
uins

MIPS_V0
incpc

pc

uins.ce
uins.rw
uins.wreg
uins.i

Puramente combinacional
Recebe cdigo objeto da instruo em execuo
Decodifica a instruo
Gera a microinstruo, ou seja, o conjunto de microoperaes
(sinais de controle) para:

Controle dos multiplexadores (uins.i)


Controle de escrita no banco de registradores (uins.wreg)
Controle de leitura/escrita da/na memria (uins.ce, uins.rw (uins.bw))
Operao na ULA (uins.i)

Cdigo VHDL do controle

library IEEE;
use IEEE.Std_Logic_1164.all;
use work.p_MI0.all;

entity control_unit is
port(ck, rst: in std_logic;
-- estes sinais so inteis nesta verso da
-- Unidade de Controle, pois ela combinacional
uins :
out microinstruction;
ir :
in reg32
);
end control_unit;
architecture control_unit of control_unit is
signal i : inst_type;
begin
uins.i <= i;
i <= ADDU
when ir(31 downto
SUBU
when ir(31 downto
AAND
when ir(31 downto
OOR
when ir(31 downto
XXOR
when ir(31 downto
NNOR
when ir(31 downto
ORI
when ir(31 downto
LW
when ir(31 downto
SW
when ir(31 downto
invalid_instruction ; --

26)="000000" and ir(10 downto 0)="00000100001" else


26)="000000" and ir(10 downto 0)="00000100011" else
26)="000000" and ir(10 downto 0)="00000100100" else
26)="000000" and ir(10 downto 0)="00000100101" else
26)="000000" and ir(10 downto 0)="00000100110" else
26)="000000" and ir(10 downto 0)="00000100111" else
26)="001101" else
26)="100011" else
26)="101011" else
IMPORTANTE: condio "default" invalid instruction;

assert i /= invalid_instruction
report "******************* INVALID INSTRUCTION *************"
severity error;
uins.ce

<= '1' when i=SW

or i=LW else '0';

uins.rw

<= '0' when i=SW

else '1';

uins.wreg

<= '0' when i=SW

else '1';

end control_unit;

Esta atribuio
corresponde ao
processo de
decodificao da
instruo em si

Demais sinais de
controle

Bloco de dados
Cada cdigo objeto de uma instruo define seus operandos
Instrues tipo R:

Processo de controle dos multiplexadores:

instR <= '1' when uins.i=ADDU or uins.i=SUBU or uins.i=AAND or uins.i=OOR or


uins.i=XXOR or uins.i=NNOR
else'0'; -- sinal auxiliar que define quando instrua tipo R

adD <= instruction(15 downto 11) when instR='1' else


instruction(20 downto 16); -- Mux: gera endereo de escrita no banco

op2 <= R2 when instR='1' else ext32; -- Mux: gera entrada inferior da ULA

Bloco de dados

Instruo ORI:

3 multiplexadores:

adD <= instruction(15 downto 11) when instR='1'


instruction(20 downto 16);

op2 <= R2 when instR='1' else ext32;

ext32 <=x"FFFF" & instruction(15 downto 0) when


(instruction(15)='1 and (uins.i=LW or uins.i=SW))
else
x"0000" & instruction(15 downto 0); -- extenso de zero!

else

-- Mux: gera segunda entrada da ULA

Bloco de dados
Instrues LW / SW

3 multiplexadores:

ENDEREO A
SOMA DO REG
BASE+DESLOCAMEN
TO

adD <= instruction(15 downto 11) when instR='1'


instruction(20 downto 16) ;

op2 <= R2 when instR='1' else ext32; -- Mux: gera segunda entrada da ULA

else

ext32 <=x"FFFF" & instruction(15 downto 0) when


(instruction(15)='1 and (uins.i=LW or uins.i=SW)) else
x"0000" & instruction(15 downto 0);

Cdigo VHDL

Cdigo VHDL
IR_out
uins

incpc

+4

D
ck

PC
rst

uins.ce
uins.rw
uins.wreg
uins.i

pc

i_address

address

data

Memria
de
Instrues

instruction

Memria de instrues
externa ao processador
ver testbench

Cdigo VHDL

Cdigo VHDL

ULA

BANCO DE REGISTRADORES

TOP

Você também pode gostar