28 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			28 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
 | 
						|
ARCHITECTURE rtl OF aluDecoder IS
 | 
						|
    signal lsig_rTypeSub : std_ulogic;
 | 
						|
BEGIN
 | 
						|
    lsig_rTypeSub <= funct7 and op; -- true for R-type substract
 | 
						|
 | 
						|
    decode : process(op, funct3, funct7, ALUOp, lsig_rTypeSub)
 | 
						|
    begin
 | 
						|
        case ALUOp is
 | 
						|
            when "00" => ALUControl <= "000" after g_tDec; -- addition
 | 
						|
            when "01" => ALUControl <= "001" after g_tDec; -- substraction
 | 
						|
            when others =>
 | 
						|
                case funct3 is -- R-type or I-type
 | 
						|
                    when "000" =>
 | 
						|
                        if lsig_rTypeSub = '1' then
 | 
						|
                            ALUControl <= "001" after g_tDec; -- sub
 | 
						|
                        else
 | 
						|
                            ALUControl <= "000" after g_tDec; -- add, addi
 | 
						|
                        end if;
 | 
						|
                    when "010" => ALUControl <= "101" after g_tDec; -- slt, slti
 | 
						|
                    when "110" => ALUControl <= "011" after g_tDec; -- or, ori
 | 
						|
                    when "111" => ALUControl <= "010" after g_tDec; -- and, andi
 | 
						|
                    when others => ALUControl <= "---" after g_tDec; -- unknown
 | 
						|
                end case;
 | 
						|
        end case;
 | 
						|
    end process decode;
 | 
						|
END ARCHITECTURE rtl;
 |