MIPS Monociclo
Implementação em VHDL
Moraes 03/maio/2011
Incrementada por Calazans em maio/2013
Instruções 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 código objeto da instrução em execução
– Decodifica a instrução
– Gera a microinstrução, ou seja, o conjunto de microoperações
(sinais de controle) para:
•
•
•
•
Controle dos multiplexadores (uins.i)
Controle de escrita no banco de registradores (uins.wreg)
Controle de leitura/escrita da/na memória (uins.ce, uins.rw (uins.bw))
Operação na ULA (uins.i)
Código 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 são inúteis nesta versão 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: condição "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 atribuição corresponde ao
processo de decodificação da
instrução em si
Demais sinais de controle
Bloco de dados
• Cada código objeto de uma instrução define seus operandos
• Instruções tipo R:
IR_out
control_unit
uins
MIPS_V0
incpc
reg_dest
datapath
+4
25..21
uins.ce
uins.rw
uins.wreg
uins.i
pc
20..16
result
RD
adRs
R1
R1
U
L
A
adRt
15..11
D
PC
ck
rst
Q
i_address
address
data
Memória
de
Instruções
instruction
adRD
20..16
R2
R2
d_address
ck
rst
uins.i
wreg
uins.wreg
uins.i
zero
uins.i
15..0
data
ext32
uins.i
Memória
de
Dados
uins.rw
uins.ce
R2
uins.ce
uins.rw
ext_sinal
ext_0
uins.i
• 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 instruçaõ é tipo R
–
adD <= instruction(15 downto 11) when instR='1' else
instruction(20 downto 16); -- Mux: gera endereço de escrita no banco
–
op2 <= R2 when instR='1' else ext32; -- Mux: gera entrada inferior da ULA
Bloco de dados
• Instrução ORI:
IR_out
control_unit
uins
MIPS_V0
incpc
reg_dest
datapath
+4
25..21
uins.ce
uins.rw
uins.wreg
uins.i
pc
20..16
result
RD
adRs
R1
R1
U
L
A
adRt
15..11
D
PC
Q
i_address
ck
rst
address
data
Memória
de
Instruções
instruction
adRD
20..16
R2
R2
d_address
ck
rst
uins.i
wreg
uins.wreg
uins.i
zero
Memória
de
Dados
uins.i
15..0
data
ext32
uins.i
uins.rw
uins.ce
R2
uins.ce
uins.rw
ext_sinal
ext_0
uins.i
• 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); -- extensão de zero!
else
-- Mux: gera segunda entrada da ULA
Bloco de dados
• Instruções LW / SW
IR_out
control_unit
uins
MIPS_V0
incpc
reg_dest
datapath
+4
25..21
uins.ce
uins.rw
uins.wreg
uins.i
pc
20..16
result
RD
adRs
R1
R1
U
L
A
adRt
15..11
D
PC
Q
i_address
ck
rst
address
data
Memória
de
Instruções
instruction
adRD
20..16
R2
R2
ck
rst
uins.i
wreg
uins.wreg
uins.i
zero
Memória
de
Dados
uins.i
15..0
data
d_address
ext32
uins.i
uins.rw
uins.ce
R2
uins.ce
uins.rw
ext_sinal
ext_0
ENDEREÇO É A SOMA DO
REG BASE+DESLOCAMENTO
uins.i
• 3 multiplexadores:
–
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);
Código VHDL
Código VHDL
IR_out
uins
incpc
+4
D
PC
ck
rst
uins.ce
uins.rw
uins.wreg
uins.i
pc
Q
i_address
address
data
Memória
de
Instruções
instruction
• Memória de instruções é
externa ao processador – ver
testbench
Código VHDL
25..21
uins.i
RD
adRs
20..16
R1
R1
U
L
A
adRt
15..11
instruction
adRD
20..16
R2
R2
uins.i
ck
15..0
rst
uins.i
wreg
uins.wreg
ext32
ext_sinal
ext_0
uins.i
uins.i
Código VHDL
reg_dest
result
RD
adRs
R1
R1
U
L
A
adRt
adRD
ck
R2
rst
R2
uins.wreg
ext32
uins.i
data
uins.i
zero
uins.i
wreg
d_address
uins.i
uins.ce
uins.rw
Memória
de
Dados
uins.rw
uins.ce
R2
ULA
BANCO DE REGISTRADORES
TOP
Download

Transparências com explicações e estrutura da MIPS monociclo