Creato modulo CarryLookAhead

This commit is contained in:
2019-08-29 18:08:25 +02:00
parent f4f0989ac4
commit f8ee1d5e27
13 changed files with 224 additions and 117 deletions

View File

@@ -2,41 +2,80 @@ library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity PrepareForShift is
port(
X, Y: in std_logic_vector(31 downto 0);
DIFF_EXP: out std_logic_vector(8 downto 0);
SW: out std_logic
X, Y : in std_logic_vector(30 downto 0);
DIFF_EXP : out std_logic_vector(8 downto 0);
NEED_SWAP : out std_logic
);
end PrepareForShift;
architecture PrepareForShiftArch of PrepareForShift is
signal LT: std_logic;
signal EQ: std_logic;
signal LT : std_logic;
signal EQ : std_logic;
signal RESULT : std_logic_vector(7 downto 0);
signal OVERFLOW : std_logic;
component Comparator is
generic( BITCOUNT: integer := 8 );
port(
xT, yT: in std_logic_vector((BITCOUNT-1) downto 0);
needSwap: out std_logic
);
generic(
BITCOUNT: integer := 8
);
port(
X_MANT, Y_MANT : in std_logic_vector((BITCOUNT-1) downto 0);
NEED_SWAP : out std_logic
);
end component;
component AddSub is
generic(
BITCOUNT : integer := 8
);
port(
X, Y : in std_logic_vector((BITCOUNT-1) downto 0);
IS_SUB : in std_logic := '0';
RESULT : out std_logic_vector((BITCOUNT-1) downto 0);
OVERFLOW : out std_logic
);
end component;
begin
C: Comparator
port map (xT => X(22 downto 0), yT => Y(22 downto 0), needSwap => LT);
--istaziare sommatore la cui uscita va mappata in X(31 downto 23), Y(31 downto 23), DIFF_EXP
C : Comparator
generic map (BITCOUNT => 23)
port map (X_MANT => X(22 downto 0), Y_MANT => Y(22 downto 0), NEED_SWAP => LT);
EQ <= '0';
ADD_SUB : AddSub
generic map (BITCOUNT => 8)
port map (X => X(30 downto 23), Y => Y(30 downto 23), IS_SUB => '1', RESULT => RESULT, OVERFLOW => OVERFLOW);
EQUAL_EXP_PROCESS : process (RESULT, OVERFLOW)
variable EQ_TMP : std_logic;
O: process (DIFF_EXP)
begin
for i in 8 downto 0 loop
EQ <= EQ or DIFF_EXP(i);
EQ_TMP := '0';
for i in 7 downto 0 loop
EQ_TMP := EQ_TMP or RESULT(i);
end loop;
EQ_TMP := EQ_TMP or OVERFLOW;
EQ_TMP := not EQ_TMP;
EQ <= EQ_TMP;
end process;
SW <= DIFF_EXP(8) or (EQ and LT);
NEED_SWAP <= OVERFLOW or (EQ and LT);
DIFF_EXP <= OVERFLOW & RESULT;
end PrepareForShiftArch;