2021-10-26 19:06:02 +02:00
|
|
|
library ieee;
|
|
|
|
use ieee.math_real.all;
|
|
|
|
use ieee.numeric_std.all;
|
|
|
|
use ieee.std_logic_1164.all;
|
|
|
|
|
2021-10-27 11:20:58 +02:00
|
|
|
entity ALU is
|
|
|
|
port (
|
|
|
|
op1 : IN std_logic_vector(31 downto 0);
|
|
|
|
op2 : IN std_logic_vector(31 downto 0);
|
|
|
|
cin : IN std_logic;
|
|
|
|
cmd : IN std_logic_vector(1 downto 0);
|
|
|
|
res : out std_logic_vector(31 downto 0);
|
|
|
|
cout : out std_logic;
|
|
|
|
z : out std_logic;
|
|
|
|
n : out std_logic;
|
|
|
|
v : out std_logic;
|
|
|
|
vdd : IN bit;
|
|
|
|
vss : IN bit
|
|
|
|
);
|
|
|
|
end ALU;
|
2021-10-26 19:06:02 +02:00
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
2021-10-27 11:20:58 +02:00
|
|
|
architecture ALU_bhvr of ALU is
|
|
|
|
signal cout_temp, add_cout : std_logic;
|
|
|
|
signal res_temp, add : std_logic_vector(31 downto 0);
|
2021-10-26 19:06:02 +02:00
|
|
|
|
2021-10-27 11:20:58 +02:00
|
|
|
begin
|
2021-10-26 19:06:02 +02:00
|
|
|
|
2021-10-27 11:20:58 +02:00
|
|
|
adder_0: entity work.adder32_ent
|
|
|
|
port map(
|
|
|
|
cin => cin,
|
|
|
|
i0 => op1,
|
|
|
|
i1 => op2,
|
|
|
|
q => add,
|
|
|
|
cout => add_cout
|
|
|
|
);
|
|
|
|
|
|
|
|
process(op1, op2, cin, cmd, vss , vdd, add, add_cout)
|
|
|
|
begin
|
|
|
|
case cmd is
|
|
|
|
when "00" =>
|
2021-12-07 23:21:37 +01:00
|
|
|
-- report "ADD";
|
2021-10-26 19:06:02 +02:00
|
|
|
res_temp <= add;
|
|
|
|
cout_temp <= add_cout;
|
2021-10-27 11:20:58 +02:00
|
|
|
|
|
|
|
when "01" =>
|
2021-12-07 23:21:37 +01:00
|
|
|
-- report "AND";
|
2021-10-26 19:06:02 +02:00
|
|
|
res_temp <= op1 and op2 ;
|
|
|
|
cout_temp <= '0';
|
2021-10-27 11:20:58 +02:00
|
|
|
when "10" =>
|
2021-12-07 23:21:37 +01:00
|
|
|
-- report "OR ";
|
2021-10-26 19:06:02 +02:00
|
|
|
res_temp <= op1 or op2;
|
|
|
|
cout_temp <= '0';
|
2021-10-27 11:20:58 +02:00
|
|
|
when "11" =>
|
2021-12-07 23:21:37 +01:00
|
|
|
-- report "XOR";
|
2021-10-26 19:06:02 +02:00
|
|
|
res_temp <= op1 xor op2 ;
|
|
|
|
cout_temp <= '0';
|
2021-10-27 11:20:58 +02:00
|
|
|
when others =>
|
2021-12-07 23:21:37 +01:00
|
|
|
report "[ERROR] SWITCH CASE UNREACHABLE (Alu::cmd not initialised ?)";
|
2021-10-27 11:20:58 +02:00
|
|
|
end case;
|
|
|
|
end process;
|
|
|
|
|
|
|
|
process(res_temp, cout_temp)
|
|
|
|
begin
|
2021-10-26 19:06:02 +02:00
|
|
|
|
2021-10-27 11:20:58 +02:00
|
|
|
if (res_temp="00000000000000000000000000000000")
|
|
|
|
then z <= '1';
|
|
|
|
else z <= '0';
|
|
|
|
end if;
|
2021-10-26 19:06:02 +02:00
|
|
|
|
2021-10-27 11:20:58 +02:00
|
|
|
n <= res_temp(31);
|
|
|
|
v <= res_temp(31) xor cout_temp;
|
2021-10-26 19:06:02 +02:00
|
|
|
cout <= cout_temp;
|
|
|
|
res <= res_temp;
|
2021-10-27 11:20:58 +02:00
|
|
|
end process;
|
2021-10-26 19:06:02 +02:00
|
|
|
|
2021-10-27 11:20:58 +02:00
|
|
|
end ALU_bhvr;
|
2021-10-26 19:06:02 +02:00
|
|
|
|