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