Upload
murray
View
157
Download
6
Embed Size (px)
DESCRIPTION
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. Puramente combinacional - PowerPoint PPT Presentation
Citation preview
MIPS MonocicloImplementação em VHDL
Moraes 03/maio/2011Incrementada 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
• 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)
control_unit IR_out
MIPS_V0 uins
uins.rwuins.ce
uins.wreguins.i
pcincpc
Código VHDL do controlelibrary IEEE;use IEEE.Std_Logic_1164.all;use work.p_MI0.all;
entity control_unit isport(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 26)="000000" and ir(10 downto 0)="00000100001" else SUBU when ir(31 downto 26)="000000" and ir(10 downto 0)="00000100011" else AAND when ir(31 downto 26)="000000" and ir(10 downto 0)="00000100100" else OOR when ir(31 downto 26)="000000" and ir(10 downto 0)="00000100101" else XXOR when ir(31 downto 26)="000000" and ir(10 downto 0)="00000100110" else NNOR when ir(31 downto 26)="000000" and ir(10 downto 0)="00000100111" else ORI when ir(31 downto 26)="001101" else LW when ir(31 downto 26)="100011" else SW when ir(31 downto 26)="101011" else invalid_instruction ; -- 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:
• 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
control_unit
Memória de
Instruções
address data
PCck
D Q
25..21
20..16
15..11
20..16
adRs
adRt
adRD
R1
R2
RD
ck wreg
ext_sinal
ULA
uins.i
Memória de
Dados
d_address data
result
uins.ceuins.rw
R1
R2
R2
ext_0
zero
+4
i_address instruction
uins.i
uins.i
uins.i
15..0
IR_out
uins.i
uins.ceuins.rw
MIPS_V0
uins.wreg
uins
uins.rwuins.ce
uins.wreguins.i
rst
rst
reg_dest
pcincpc
datapath
ext32
Bloco de dados• Instrução ORI:
• 3 multiplexadores:– adD <= instruction(15 downto 11) when instR='1' else
instruction(20 downto 16);
– op2 <= R2 when instR='1' else ext32; -- Mux: gera segunda entrada da ULA
– 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!
control_unit
Memória de
Instruções
address data
PCck
D Q
25..21
20..16
15..11
20..16
adRs
adRt
adRD
R1
R2
RD
ck wreg
ext_sinal
ULA
uins.i
Memória de
Dados
d_address data
result
uins.ceuins.rw
R1
R2
R2
ext_0
zero
+4
i_address instruction
uins.i
uins.i
uins.i
15..0
IR_out
uins.i
uins.ceuins.rw
MIPS_V0
uins.wreg
uins
uins.rwuins.ce
uins.wreguins.i
rst
rst
reg_dest
pcincpc
datapath
ext32
Bloco de dados• Instruções LW / SW
• 3 multiplexadores:– adD <= instruction(15 downto 11) when instR='1' else
instruction(20 downto 16) ;
– op2 <= R2 when instR='1' else ext32; -- Mux: gera segunda entrada da ULA
– 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);
control_unit
Memória de
Instruções
address data
PCck
D Q
25..21
20..16
15..11
20..16
adRs
adRt
adRD
R1
R2
RD
ck wreg
ext_sinal
ULA
uins.i
Memória de
Dados
d_address data
result
uins.ceuins.rw
R1
R2
R2
ext_0
zero
+4
i_address instruction
uins.i
uins.i
uins.i
15..0
IR_out
uins.i
uins.ceuins.rw
MIPS_V0
uins.wreg
uins
uins.rwuins.ce
uins.wreguins.i
rst
rst
reg_dest
pcincpc
datapath
ext32
ENDEREÇO É A SOMA DO REG BASE+DESLOCAMENTO
Código VHDL
Memória de
Instruções
address dataPC
ck
D Q
+4
i_address instruction
IR_out
uins
uins.rwuins.ce
uins.wreguins.i
rst
pcincpc
Código VHDL
• Memória de instruções é externa ao processador – ver
testbench
Código VHDL25..21
20..16
15..11
20..16
adRs
adRt
adRD
R1
R2
RD
ck wreg
ext_sinal
ULA
uins.i
R1
R2
ext_0
instruction
uins.i
uins.i
15..0
uins.i
uins.wreg
uins.i
rst
ext32
Código VHDL
adRs
adRt
adRD
R1
R2
RD
ck wreg
ULA
uins.i
Memória de
Dados
d_address data
result
uins.ceuins.rw
R1
R2
R2
zero
uins.i
uins.i
uins.i
uins.ceuins.rw
uins.wreg
rst
reg_dest
ext32
ULA
BANCO DE REGISTRADORES
TOP