Buscar

CPU8 V2 com memoria

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

library IEEE;
use IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;
entity cpu8 is
 port (
 CLK: in STD_LOGIC;
 --SAIDA DOS REGISTRADORES
 REG_A:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
 REG_B:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
-- REG_PC:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
 );
end cpu8;
architecture cpu8_arch of cpu8 is
 -- DECLARACAO DE REGISTRADORES (SINAIS) --
 SIGNAL RI : STD_LOGIC_VECTOR (7 DOWNTO 0); -- INSTRUCAO QUE ESTA 
SENDO EXECUTADA --
 SIGNAL PC : STD_LOGIC_VECTOR (3 DOWNTO 0); -- CONTADOR DE PROGRAMA 
--
 SIGNAL A : STD_LOGIC_VECTOR (7 DOWNTO 0); -- ARMAZENA RESULTADO 
DE OPERACOES --
 SIGNAL B : STD_LOGIC_VECTOR (7 DOWNTO 0); -- REGISTRADOR AUXILIAR 
--
 -- MAQUINA DE ESTADOS --
 SIGNAL ESTADO : STD_LOGIC_VECTOR (1 DOWNTO 0); -- ESTADOS DO 
PROCESSADOR (BUSCA/DECODIFICACAO/EXECUCAO)--
 
 -- INSTRUCOES (CONSTANTES) -- (OPCODES) 
 CONSTANT ADD : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000"; -- (0h) 
HEX - ARMAZENA O OPCODE DO "0000" NA CONSTANTE ADD --
 CONSTANT SUB : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0001"; -- (1h) 
HEX - ARMAZENA O OPCODE DO "0001" NA CONSTANTE SUB --
 CONSTANT C_AND : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0010"; -- (2h) 
HEX - ARMAZENA O OPCODE DO "0010" NA CONSTANTE AND --
 CONSTANT C_OR : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0011"; -- (3h) 
HEX - ARMAZENA O OPCODE DO "0011" NA CONSTANTE OR --
 CONSTANT C_XOR : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0100"; -- (4h) 
HEX - ARMAZENA O OPCODE DO "0100" NA CONSTANTE XOR --
 CONSTANT INC : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0101"; -- (5h) 
HEX - ARMAZENA O OPCODE DO "0101" NA CONSTANTE INC --
 CONSTANT DEC : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0110"; -- (6h) 
HEX - ARMAZENA O OPCODE DO "0110" NA CONSTANTE DEC --
 CONSTANT LOAD : STD_LOGIC_VECTOR (3 DOWNTO 0) := "1000"; -- (8h) 
HEX - ARMAZENA O OPCODE DO "1000" NA CONSTANTE LOAD --
 --CRIAR O JUMP
 CONSTANT JUMP : STD_LOGIC_VECTOR (3 DOWNTO 0) := "1001";
--INTERFACE DE MEMORIA
 SIGNAL RW: STD_LOGIC;
 SIGNAL DOUT: STD_LOGIC_VECTOR (7 downto 0);
 SIGNAL DIN: STD_LOGIC_VECTOR (7 downto 0);
 SIGNAL ADDR: STD_LOGIC_VECTOR (3 downto 0);
------------------------------------------------------
-- LogiBLOX RAM Module "RAM"
component RAM
 PORT(
 A: IN std_logic_vector(3 DOWNTO 0);
 DO: OUT std_logic_vector(7 DOWNTO 0);
 DI: IN std_logic_vector(7 DOWNTO 0);
 WR_EN: IN std_logic);
end component;
begin
 MEMORIA: RAM PORT MAP(ADDR,DIN,DOUT,RW);
 ADDR <= PC;
 --SAIDAS DOS REGISTRADORES
 REG_A <= A;
 REG_B <= B;
 -- REG_PC <= PC;
 PROCESS (CLK)
 
 BEGIN
 -- AQUI INICIA O PROCESSADOR --
 IF CLK'EVENT AND CLK = '1' THEN 
 
 CASE ESTADO IS -- QUANDO O ESTADO FOR...--
 WHEN "00" => -- BUSCA --
 RI <= DIN; -- ATRIBUI O VALOR DE DIN PARA 
RI
 RW <= '0'; -- DEIXA A MEMORIA EM MODO DE 
LEITURA (0)
 PC <= PC + 1; -- INCREMENTA O PC PARA ELE 
APONTAR PARA A PROXIMA INSTRUCAO NA MEMORIA --
 ESTADO <= "01"; --SETA O ESTADO PARA IR 
PARA A DECODIFICACAO/EXECUCAO --
 
 WHEN "01" => --DECODIFICACAO E EXECUCAO --
 -- DECODIFICADOR DE INSTRUCOES--
 CASE RI (7 DOWNTO 4) IS -- CASO O QUE 
ESTIVER NO RI(DE 7 A 4) FOR...-- 
 WHEN ADD => A <= A + B; -- 
INSTRUCAO ADD --
 WHEN SUB => A <= A - B; -- 
INSTRUCAO SUB --
 WHEN C_AND => A <= A AND B; -- 
INSTRUCAO AND --
 WHEN C_OR => A <= A OR B; -- 
INSTRUCAO OR --
 WHEN C_XOR => A <= A XOR B; -- 
INSTRUCAO XOR --
 WHEN INC => A <= A +1; -- 
INSTRUCAO INC --
 WHEN DEC => A <= A -1; -- 
INSTRUCAO DEC --
 WHEN LOAD =>
 IF RI(3) = '1' THEN
 A <= DIN;
 ELSE
 B <= DIN;
 END IF;
 PC <= PC+1;
 -- WHEN JUMP =>
 -- PC <= RI(3 DOWNTO 0);
 WHEN OTHERS => NULL;
 END CASE;
 ESTADO <= "00"; -- O ESTADO VOLTA PARA O 
MODO DE BUSCA, 
 -- PARA BUSCAR A PROXIMA INSTRUCAO 
QUE JA ESTA SETADA NO RI --
 WHEN OTHERS => NULL;
 END CASE;
 END IF;
 END PROCESS;
end cpu8_arch;

Outros materiais

Outros materiais