41 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| -- Risc-V ed. 2022 page 250 (pdf page 273)
 | |
| 
 | |
| ARCHITECTURE rtl OF ALU IS
 | |
| 
 | |
|     signal lvec_res : std_ulogic_vector(res'range);
 | |
| 	signal lsig_zero : std_ulogic;
 | |
| 
 | |
| BEGIN
 | |
| 
 | |
|     lsig_zero <= '1' when lvec_res = (lvec_res'range => '0') else '0';
 | |
| 	zero <= lsig_zero after g_tALU;
 | |
|     res <= lvec_res after g_tALU;
 | |
| 
 | |
|     alu : process(srcA, srcB, ctrl)
 | |
|     begin
 | |
|         case ctrl is
 | |
|             when "000" => -- add
 | |
|                 lvec_res <= std_ulogic_vector(resize(
 | |
|                     unsigned(srcA) + unsigned(srcB), lvec_res'length
 | |
|                 ));
 | |
|             when "001" => -- substract
 | |
|                 lvec_res <= std_ulogic_vector(resize(
 | |
|                     unsigned(srcA) - unsigned(srcB), lvec_res'length
 | |
|                 ));
 | |
|             when "010" => -- AND
 | |
|                 lvec_res <= srcA and srcB;
 | |
|             when "011" => -- OR
 | |
|                 lvec_res <= srcA or srcB;
 | |
|             when "101" => -- SLT
 | |
|                 if srcA < srcB then
 | |
|                     lvec_res <= (lvec_res'high downto 1 => '0') & '1';
 | |
|                 else
 | |
|                     lvec_res <= (lvec_res'high downto 1 => '0') & '0';
 | |
|                 end if;
 | |
|             when others => -- unknown
 | |
|                 lvec_res <= (others => '-');
 | |
|         end case;
 | |
|     end process alu;
 | |
| 
 | |
| END ARCHITECTURE rtl;
 |