12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- ----------------------------------------------------------------------------------
- -- Company:
- -- Engineer:
- --
- -- Create Date: 13.04.2021 10:07:41
- -- Design Name:
- -- Module Name: ALU - Behavioral
- -- Project Name:
- -- Target Devices:
- -- Tool Versions:
- -- Description:
- --
- -- Dependencies:
- --
- -- Revision:
- -- Revision 0.01 - File Created
- -- Additional Comments:
- --
- ----------------------------------------------------------------------------------
-
-
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.STD_LOGIC_UNSIGNED.ALL;
-
- -- Uncomment the following library declaration if using
- -- arithmetic functions with Signed or Unsigned values
- use IEEE.NUMERIC_STD.ALL;
-
- -- Uncomment the following library declaration if instantiating
- -- any Xilinx leaf cells in this code.
- --library UNISIM;
- --use UNISIM.VComponents.all;
-
- entity ALU is
- Generic (Nb_bits : Natural);
- Port ( A : in STD_LOGIC_VECTOR (Nb_bits-1 downto 0);
- B : in STD_LOGIC_VECTOR (Nb_bits-1 downto 0);
- OP : in STD_LOGIC_VECTOR (2 downto 0);
- S : out STD_LOGIC_VECTOR (Nb_bits-1 downto 0);
- N : out STD_LOGIC;
- O : out STD_LOGIC;
- Z : out STD_LOGIC;
- C : out STD_LOGIC);
- end ALU;
-
- architecture Behavioral of ALU is
- signal A9 : STD_LOGIC_VECTOR (Nb_bits downto 0);
- signal B9 : STD_LOGIC_VECTOR (Nb_bits downto 0);
- signal ADD : STD_LOGIC_VECTOR (Nb_bits downto 0);
- signal SUB : STD_LOGIC_VECTOR (Nb_bits downto 0);
- signal MUL : STD_LOGIC_VECTOR ((2*Nb_bits)-1 downto 0);
- signal intern_N : STD_LOGIC;
- signal intern_Z : STD_LOGIC;
- constant ZERO_N : STD_LOGIC_VECTOR (Nb_bits downto 0) := (others => '0');
- constant ZERO_N1 : STD_LOGIC_VECTOR (Nb_bits downto 0) := (others => '0');
-
-
- begin
- A9 <= '0' & A;
- B9 <= '0' & B;
- ADD <= A9 + B9;
- SUB <= A9 - B9;
- MUL <= A * B;
-
- S <= ADD (Nb_bits-1 downto 0) when OP = "001" else
- SUB (Nb_bits-1 downto 0) when OP = "010" else
- MUL (Nb_bits-1 downto 0) when OP = "011" else
- -- Add division
- (0 => intern_N, others => '0') when OP = "101" else
- (0 => '1', others => '0') when OP = "110" and intern_Z = '0' and intern_N = '0' else
- (0 => intern_Z, others => '0') when OP = "111" else
- (others => '0');
-
-
- intern_N <= SUB (Nb_bits);
- intern_Z <= '1' when (SUB = ZERO_N1) else
- '0';
-
- N <= intern_N;
- O <= '0' when (MUL ((2*Nb_bits)-1 downto Nb_bits) = ZERO_N) else
- '1';
- Z <= intern_Z;
- C <= ADD (Nb_bits);
- end Behavioral;
|