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