OpenCores
URL https://opencores.org/ocsvn/raytrac/raytrac/trunk

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [unrm/] [shftr.vhd] - Rev 108

Go to most recent revision | Compare with Previous | Blame | View Log

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
 
 
 
entity fadd32 is 
	port (
		a32,b32: in std_logic_vector(31 downto 0);
		dpc:in std_logic;
		c32:out std_logic_vector(31 downto 0);
	);
end fadd32;
 
 
architecture fadd32_arch of fadd32 is
 
	component lpm_mult 
	generic (
		lpm_hint			: string;
		lpm_representation	: string;
		lpm_type			: string;
		lpm_widtha			: natural;
		lpm_widthb			: natural;
		lpm_widthp			: natural
	);
	port (
		dataa	: in std_logic_vector ( lpm_widtha-1 downto 0 );
		datab	: in std_logic_vector ( lpm_widthb-1 downto 0 );
		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,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
	denormshiftmagnitude:
	process (sdelta(7),sdelta(4 downto 0),signa,signb)
	begin
		for i in 4 downto 0 loop
			xplaces(i) <= sdelta(i) xor sdelta(7);
		end loop;
		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
	denormfactor:
	process (shiftslab,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 process;
	--! Asignar el factor de corrimiento  las mantissas
	denomrselectmantissa2shift:
	process (sdelta(7),signa,signb)
	begin
		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;
			when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
				sfactorb <= sfactor;
				sfactora <= signa&"10000000";
		end case;
		slaba <= (others => signa);
		slabb <= (others => signb);
	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);
	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;
 
	--! Sumar las mantissas signadas y colocar los 0's que hagan falta 
	mantissaadding:
	process (sdelta(7),sma,smb,splaces(4 downto 3),zero)
	begin
 
		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
					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
				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));
					when x"1" => ssmb <= (smb(24)&shiftslab(7 downto 0)&smb(23 downto 8));
					when others => ssmb <= smb;
				end case;
		end case;
		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;
 
	--!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 fadd32_arch;
 
 
 
 
 
 
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.