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;
 |