----------------------------------------------------------- --Decode PC------------------------------------------------ ----------------------------------------------------------- library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use work.ESD2004_types.all; entity Decode_PC is port( ck, reset, enable : in std_logic; op : in Jump_op; Reg_in : in Std_logic_vector(7 downto 0); Immediate : in Std_logic_vector(7 downto 0); curr_pc : out Std_logic_vector(7 downto 0) ); end Decode_PC; architecture behavioral of Decode_PC is --next_pc : segnale che collega l'uscita del mux che seleziona il tipo di salto all'ingresso del pc signal next_pc, int_curr_pc : signed(7 downto 0); begin process(int_curr_pc,op,Reg_in,Immediate) begin case op is --In condizioni normali (operazioni alu) il pc viene incrementato di 1 istruzione when j_normal => next_pc <= signed(int_curr_pc) + conv_signed(2,8); --quando si esegue un salto j_reg il pc viene aggiornato al valore presente nel registro when j_reg => next_pc <= signed(Reg_in); --quando si esegue un salto incondizionato j_imm il pc viene aggiornato al valore presente --nel campo immediate dell'istruzione (per eseguire questa operazione si usa un formato RI --con il campo R uguale a 0) when j_imm => next_pc <= signed(Immediate); --quando si esegue un salto condizionato beq il pc viene portato al valore presente nel --campo immediate solo se il registro di ingresso è uguale a 0; in caso --contrario viene incrementato di 1 when j_beqz => if Reg_in = "00000000" then next_pc <= signed(Immediate); else next_pc <= signed(int_curr_pc) + conv_signed(2,8); end if; --quando si esegue un salto condizionato bneq il pc viene incrementato del valore presnte nel --campo immediate (salto pc relative) solo se il registro di ingresso è diverso da 0; in caso --contrario viene incrementato di 2 when j_bneqz => if Reg_in /= "00000000" then next_pc <= signed(Immediate); else next_pc <= signed(int_curr_pc) + conv_signed(2,8); end if; when others => next_pc <= signed(int_curr_pc) + conv_signed(2,8); end case; end process; --registro a 8 bit process(ck,reset) begin if reset='1' then int_curr_pc <= ( others => '0'); elsif ck'event and ck='1' then if enable='1' then int_curr_pc <= conv_signed(next_pc,8); end if; end if; end process; curr_pc <= conv_std_logic_vector(int_curr_pc,8); end behavioral;