URL
https://opencores.org/ocsvn/raytrac/raytrac/trunk
Subversion Repositories raytrac
Compare Revisions
- This comparison shows the changes necessary to convert path
/raytrac
- from Rev 107 to Rev 108
- ↔ Reverse comparison
Rev 107 → Rev 108
/trunk/fpbranch/unrm/shftr.vhd
1,19 → 1,19
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.std_logic_unsigned.all; |
|
|
|
entity shftr is |
entity fadd32 is |
port ( |
sgndelta,signa,sgnb : in std_logic; |
places : in std_logic_vector (4 downto 0); |
data24a,data24b : in std_logic_vector (22 downto 0); |
data40 : out std_logic_vector (39 downto 0) |
a32,b32: in std_logic_vector(31 downto 0); |
dpc:in std_logic; |
c32:out std_logic_vector(31 downto 0); |
); |
end shftr; |
end fadd32; |
|
|
architecture shftr_arch of shftr is |
architecture fadd32_arch of fadd32 is |
|
component lpm_mult |
generic ( |
30,31 → 30,74
result : out std_logic_vector( lpm_widthp-1 downto 0 ) |
); |
end component; |
|
signal sdelta,expunrm,expnrm: std_logic_vector(7 downto 0); |
signal pha,phb : std_logic_vector(26 downto 0); |
signal sfactora,sfactorb,sfactor : std_logic_vector(8 downto 0); |
signal sma,smb,ssma,ssmb,ssm : std_logic_vector(24 downto 0); |
signal sma,smb,ssma,ssmb,usm,uxm: std_logic_vector(24 downto 0); |
signal ssm: std_logic_vector(25 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); |
signal sign : std_logic; |
|
|
begin |
|
--! Manejo del cero |
i3e754zero: |
process (ea,eb) |
begin |
|
if ea="00" then |
signa <= '0'; |
else |
signa <= signa; |
end if; |
if eb="00" then |
signb <= '0'; |
expunrm <= ea; |
else |
signb <= signb; |
expunrm <= eb; |
end if; |
if ea=x"00" or eb=x"00" then |
zero='1'; |
sdelta <= x"00"; |
else |
zero='0'; |
sdelta <= ea-eb; |
end if; |
|
|
end process; |
|
--! Manejo del Exponente, sumar el delta |
unrmexpo: |
process(expunrm,sdelta) |
begin |
expunrm <= expunrm+sdelta; |
end process; |
|
|
--! Decodificar la magnitud del corrimiento |
process (sgndelta,places,signa,signb) |
denormshiftmagnitude: |
process (sdelta(7),sdelta(4 downto 0),signa,signb) |
begin |
for i in 4 downto 0 loop |
xplaces(i) <= places(i) xor sgndelta; |
xplaces(i) <= sdelta(i) xor sdelta(7); |
end loop; |
splaces <= xplaces+("0000"&sgndelta); |
if sgndelta='1' then |
shiftslab <= signa; |
else |
shiftslab <= signb; |
splaces <= xplaces+("0000"&sdelta(7)); |
if sdelta(7)='1' then |
shiftslab <= signa;--!b>a |
|
else |
shiftslab <= signb;--!a>=b |
end if; |
end process; |
--! Decodificar el factor de corrimiento |
process (shftslab,splaces) |
denormfactor: |
process (shiftslab,splaces) |
begin |
case splaces(2 downto 0) is |
when x"0" => sfactor(8 downto 0) <= shiftslab(0 downto 0) & "10000000"; |
68,12 → 111,10
end case; |
end process; |
--! Asignar el factor de corrimiento las mantissas |
process (sgndelta,signa,signb) |
denomrselectmantissa2shift: |
process (sdelta(7),signa,signb) |
begin |
|
|
|
case sgndelta is |
case sdelta(7) is |
when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto |
sfactorb <= signb&"10000000"; |
sfactora <= sfactor; |
81,17 → 122,13
sfactorb <= sfactor; |
sfactora <= signa&"10000000"; |
end case; |
|
slaba <= (others => signa); |
slabb <= (others => signb); |
|
|
end process |
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); |
104,16 → 141,19
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); |
mantissadenorm: |
process(pha,phb,slaba,slabb) |
begin |
sma <= pha(24 downto 0) + (slaba&pla(17 downto 8)); |
smb <= phb(24 downto 0) + (slabb&plb(17 downto 8)); |
end process; |
|
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)) |
mantissaadding: |
process (sdelta(7),sma,smb,splaces(4 downto 3),zero) |
begin |
splaces <= places+sgndelta; |
|
case sgndelta is |
case sdelta(7) 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 |
123,6 → 163,7
when others => ssma <= sma; |
end case; |
when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto |
ssma <= sma; |
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)); |
130,16 → 171,42
when others => ssmb <= smb; |
end case; |
end case; |
ssm <= ssma+ssmb; |
if zero='0' then |
ssm <= (ssma(24)&ssma)+(ssmb(24)&ssmb); |
else |
ssm <= (ssma(24)&ssma)or(ssmb(24)&ssmb); |
end if; |
end process; |
|
--! Mantissas sumadas, designar |
unsignmantissa: |
process(ssm) |
begin |
for i in 24 downto 0 loop |
usm(i) <= ssm(25) xor ssm(i); |
end loop; |
sign <= ssm(25); |
uxm <= usm+(x"000000"&sign); |
end process; |
|
--! Mantissas sumadas, denormalizar |
--!Normalizar Mantissa y exponente |
process (uxm,expunrm) |
variable xshift : integer range 24 downto 0; |
begin |
for i in 24 downto 0 loop |
if uxm(i)='1' then |
xshift:=24-i; |
end of; |
end loop; |
nplaces <= conv_std_logic_vector(xshift,5); |
expnrm <= expunrm-(("000"&nplaces)+x"ff"); |
end process; |
|
|
|
|
|
end shftr_arch; |
end fadd32_arch; |
|
|
|
147,3 → 214,4
|
|
|
|