Baixe o app para aproveitar ainda mais
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;
Compartilhar