Line 3... |
Line 3... |
|
|
|
|
|
|
entity shftr is
|
entity shftr is
|
port (
|
port (
|
dir : in std_logic;
|
sgndelta,signa,sgnb : in std_logic;
|
places : in std_logic_vector (3 downto 0);
|
places : in std_logic_vector (4 downto 0);
|
data24 : in std_logic_vector (23 downto 0);
|
data24a,data24b : in std_logic_vector (22 downto 0);
|
data40 : out std_logic_vector (39 downto 0)
|
data40 : out std_logic_vector (39 downto 0)
|
);
|
);
|
end shftr;
|
end shftr;
|
|
|
|
|
Line 29... |
Line 29... |
datab : in std_logic_vector ( lpm_widthb-1 downto 0 );
|
datab : in std_logic_vector ( lpm_widthb-1 downto 0 );
|
result : out std_logic_vector( lpm_widthp-1 downto 0 )
|
result : out std_logic_vector( lpm_widthp-1 downto 0 )
|
);
|
);
|
end component;
|
end component;
|
|
|
signal splaces : std_logic_vector (8 downto 0);
|
signal pha,phb : std_logic_vector(26 downto 0);
|
signal sdata24 : std_logic_vector (26 downto 0);
|
signal sfactora,sfactorb,sfactor : std_logic_vector(8 downto 0);
|
signal sdata32 : std_logic_vector (31 downto 0);
|
signal sma,smb,ssma,ssmb,ssm : std_logic_vector(24 downto 0);
|
signal sresult : std_logic_vector (53 downto 0);
|
signal slaba,slabb : std_logic_vector(14 downto 0);
|
|
signal shiftslab : std_logic_vector(23 downto 0);
|
|
signal xplaces,splaces : std_logic_vector (4 downto 0);
|
|
|
begin
|
begin
|
|
|
process (places(2 downto 0))
|
--! Decodificar la magnitud del corrimiento
|
|
process (sgndelta,places,signa,signb)
|
begin
|
begin
|
case places(2 downto 0) is
|
for i in 4 downto 0 loop
|
when "000" => splaces <= "000000001";
|
xplaces(i) <= places(i) xor sgndelta;
|
when "001" => splaces <= "000000010";
|
end loop;
|
when "010" => splaces <= "000000100";
|
splaces <= xplaces+("0000"&sgndelta);
|
when "011" => splaces <= "000001000";
|
if sgndelta='1' then
|
when "100" => splaces <= "000010000";
|
shiftslab <= signa;
|
when "101" => splaces <= "000100000";
|
else
|
when "110" => splaces <= "001000000";
|
shiftslab <= signb;
|
when others => splaces <="010000000";
|
end if;
|
|
end process;
|
|
--! Decodificar el factor de corrimiento
|
|
process (shftslab,splaces)
|
|
begin
|
|
case splaces(2 downto 0) is
|
|
when x"0" => sfactor(8 downto 0) <= shiftslab(0 downto 0) & "10000000";
|
|
when x"1" => sfactor(8 downto 0) <= shiftslab(1 downto 0) & "1000000";
|
|
when x"2" => sfactor(8 downto 0) <= shiftslab(2 downto 0) & "100000";
|
|
when x"3" => sfactor(8 downto 0) <= shiftslab(3 downto 0) & "10000";
|
|
when x"4" => sfactor(8 downto 0) <= shiftslab(4 downto 0) & "1000";
|
|
when x"5" => sfactor(8 downto 0) <= shiftslab(5 downto 0) & "100";
|
|
when x"6" => sfactor(8 downto 0) <= shiftslab(6 downto 0) & "10";
|
|
when others => sfactor(8 downto 0) <=shiftslab(7 downto 0) &"1";
|
end case;
|
end case;
|
end process;
|
end process;
|
sdata24(26 downto 24) <= (others => '0');
|
--! Asignar el factor de corrimiento las mantissas
|
process (dir,data24,sdata32)
|
process (sgndelta,signa,signb)
|
variable offset : integer;
|
|
begin
|
begin
|
|
|
if places(3) ='1' then
|
|
offset:=8;
|
|
else
|
|
offset:=0;
|
|
end if;
|
|
|
|
data40 <= (others => '0');
|
|
|
|
if dir='1' then --! Corrimiento a la derecha
|
case sgndelta is
|
for i in 23 downto 0 loop
|
when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto
|
sdata24(i) <= data24(23-i);
|
sfactorb <= signb&"10000000";
|
end loop;
|
sfactora <= sfactor;
|
for i in 31 downto 0 loop
|
when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
|
data40(i+8-offset) <= sdata32(31-i);
|
sfactorb <= sfactor;
|
end loop;
|
sfactora <= signa&"10000000";
|
else
|
end case;
|
sdata24(23 downto 0) <= data24;
|
|
for i in 31 downto 0 loop
|
slaba <= (others => signa);
|
data40(i+offset) <= sdata32(i);
|
slabb <= (others => signb);
|
end loop;
|
|
end if;
|
|
|
end process
|
|
|
|
|
|
|
|
--! Correr las mantissas y calcularlas.
|
|
|
|
hmulta: lpm_mult
|
|
generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,18,27)
|
|
port map (sfactora,signa&'1'&data24a(22 downto 0),pha);
|
|
lmulta: lpm_mult
|
|
generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
|
|
port map (sfactora,signa&'1'&data24a(6 downto 0),pla);
|
|
hmultb: lpm_mult
|
|
generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,18,27)
|
|
port map (sfactorb,signb&'1'&data24b(22 downto 0),phb);
|
|
lmultb: lpm_mult
|
|
generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
|
|
port map (sfactorb,signb&'1'&data24b(6 downto 0),plb);
|
|
|
|
sma <= pha(24 downto 0) + (slaba&pla(17 downto 8));
|
|
smb <= phb(24 downto 0) + (slabb&plb(17 downto 8));
|
|
|
|
--! Sumar las mantissas signadas y colocar los 0's que hagan falta
|
|
process (sgndelta,sma,smb,splaces(4 downto 3))
|
|
begin
|
|
splaces <= places+sgndelta;
|
|
|
|
case sgndelta is
|
|
when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto
|
|
ssmb <= smb;
|
|
case splaces(4 downto 3) is
|
|
when x"3" => ssma <= (sma(24)&shiftslab(23 downto 0));
|
|
when x"2" => ssma <= (sma(24)&shiftslab(15 downto 0)&sma(23 downto 16));
|
|
when x"1" => ssma <= (sma(24)&shiftslab(7 downto 0)&sma(23 downto 8));
|
|
when others => ssma <= sma;
|
|
end case;
|
|
when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
|
|
case splaces(4 downto 3) is
|
|
when x"3" => ssmb <= (smb(24)&shiftslab(23 downto 0));
|
|
when x"2" => ssmb <= (smb(24)&shiftslab(15 downto 0)&smb(23 downto 16));
|
|
when x"1" => ssmb <= (smb(24)&shiftslab(7 downto 0)&smb(23 downto 8));
|
|
when others => ssmb <= smb;
|
|
end case;
|
|
end case;
|
|
ssm <= ssma+ssmb;
|
|
|
end process;
|
end process;
|
|
|
the_shifter:
|
--! Mantissas sumadas, denormalizar
|
for i in 2 downto 0 generate
|
|
shiftermultiplier: lpm_mult
|
|
generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
|
|
port map (splaces,sdata24(i*9+8 downto i*9),sresult(i*18+17 downto i*18));
|
|
end generate;
|
|
|
|
sdata32(31 downto 27) <= sresult(49 downto 45);
|
|
sdata32(26 downto 18) <= sresult(44 downto 36) or sresult(35 downto 27);
|
|
sdata32(17 downto 09) <= sresult(26 downto 18) or sresult(17 downto 09);
|
|
sdata32(08 downto 00) <= sresult(08 downto 00);
|
|
|
|
|
|
|
|
end shftr_arch;
|
end shftr_arch;
|
|
|