projet-vlsi/alu.vhdl

80 lines
1.5 KiB
VHDL
Raw Permalink Normal View History

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