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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [unrm/] [shftr.vhd] - Diff between revs 113 and 114

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 113 Rev 114
Line 1... Line 1...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_unsigned.all;
 
use ieee.std_logic_arith.all;
 
 
 
 
 
 
 
 
entity fadd32 is
entity fadd32 is
        port (
        port (
                a32,b32: in std_logic_vector(31 downto 0);
                a32,b32: in std_logic_vector(31 downto 0);
                dpc:in std_logic;
                dpc,clk:in std_logic;
                c32:out std_logic_vector(31 downto 0);
                c32:out std_logic_vector(31 downto 0)
        );
        );
end fadd32;
end fadd32;
 
 
 
 
architecture fadd32_arch of fadd32 is
architecture fadd32_arch of fadd32 is
 
 
        component lpm_mult
        component lpm_mult
        generic (
        generic (
                lpm_hint                        : string;
                lpm_hint                        : string;
Line 28... Line 53...
                dataa   : in std_logic_vector ( lpm_widtha-1 downto 0 );
                dataa   : in std_logic_vector ( lpm_widtha-1 downto 0 );
                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 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,s1udelta : std_logic_vector (4 downto 0);
 
        signal sign : std_logic;
 
 
 
 
        signal s0signa,s0signb : std_logic;
 
        signal s0ea,s0eb: std_logic_vector(7 downto 0);
 
        signal s0uma,s0umb:std_logic_vector(22 downto 0);
 
 
 
        signal s1signa, s1signb: std_logic;
 
        signal s1sdelta,s1expunrm: std_logic_vector(7 downto 0);
 
        signal s1udelta,s1xorslab: std_logic_vector(4 downto 0);
 
        signal s1uma,s1umb:std_logic_vector(22 downto 0);
 
        signal s1factor: std_logic_vector(8 downto 0);
 
 
 
        signal s2signa,s2signb,s2bgta : std_logic;
 
        signal s2exp : std_logic_vector(7 downto 0);
 
        signal s2udelta : std_logic_vector (1 downto 0);
 
        signal s2um0,s2uma,s2umb,s2smshift : std_logic_vector(22 downto 0);
 
        signal s2xorslab : std_logic_vector(23 downto 0);
 
        signal s2factor : std_logic_vector(8 downto 0);
 
        signal s2psh:std_logic_vector(26 downto 0);
 
        signal s2psl:std_logic_vector(17 downto 0);
 
 
 
        signal s2asign,s2azero,s2abgta:std_logic;
 
        signal s2asm0,s2asm1 : std_logic_vector(24 downto 0);
 
        signal s2asm : std_logic_vector(25 downto 0);
 
        signal s2aum1 : std_logic_vector(23 downto 0);
 
        signal s2aexp : std_logic_vector(7 downto 0);
 
        signal s2audelta : std_logic_vector (1 downto 0);
 
        signal s2axorslab: std_logic_vector(23 downto 0);
 
 
 
        signal s3sign: std_logic;
 
        signal s3um,s3xorslab: std_logic_vector(24 downto 0);
 
        signal s3sm: std_logic_vector(25 downto 0);
 
        signal s3exp:std_logic_vector(7 downto 0);
 
 
 
        signal s3asign:std_logic;
 
        signal s3ashift:std_logic_vector(7 downto 0);
 
        signal s3afactor,s3aexp: std_logic_vector(7 downto 0);
 
        signal s3aum,s3afactorhot:std_logic_vector(24 downto 0);
 
 
 
        signal s4sign: std_logic;
 
        signal s4shift: std_logic_vector(7 downto 0);
 
        signal s4exp: std_logic_vector(7 downto 0);
 
        signal s4factorhot9: std_logic_vector(8 downto 0);
 
        signal s4pl: std_logic_vector(17 downto 0);
 
        signal s4postshift: std_logic_vector(22 downto 0);
 
        signal s4um,s4factorhot: std_logic_vector(24 downto 0);
 
        signal s4ph: std_logic_vector(26 downto 0);
 
 
begin
begin
 
 
--! ******************************************************************************************************************************
--! ******************************************************************************************************************************
        --! Pipeline
        --! Pipeline
Line 74... Line 134...
                        else
                        else
                                s1signb <= s0signb;
                                s1signb <= s0signb;
                                s1expunrm <= s0eb;
                                s1expunrm <= s0eb;
                        end if;
                        end if;
                        if s0ea=x"00" or s0eb=x"00" then
                        if s0ea=x"00" or s0eb=x"00" then
                                s1zero='1';
 
                                s1sdelta <= x"00";
                                s1sdelta <= x"00";
                        else
                        else
                                s1zero='0';
 
                                s1sdelta <= s0ea-s0eb;
                                s1sdelta <= s0ea-s0eb;
                        end if;
                        end if;
                        --! Buffers
                        --! Buffers
                        s1uma           <=      s0uma;
                        s1uma           <=      s0uma;
                        s1umb           <=      s0umb;
                        s1umb           <=      s0umb;
 
 
 
 
                        --! Etapa 1
                        --! Etapa 1
                        --! Manejo de exponente, previo a la denormalizacion
                        --! Manejo de exponente, previo a la denormalizacion
                        --! Calulo del Factor de corrimiento 
                        --! Calulo del Factor de corrimiento 
                        s2expunrm       <= s1expunrm+s1sdelta;
                        s2exp   <= s1expunrm+s1sdelta;
                        s2factor        <= s1factor;
                        s2factor        <= s1factor;
 
 
                        --! Otras se&ntilde;ales de soporte
                        --! Otras se&ntilde;ales de soporte
                        s2signa         <= s1signa;
                        s2signa         <= s1signa;
                        s2signb         <= s1signb;
                        s2signb         <= s1signb;
                        s2bgta          <= s1sdelta(7);
                        s2bgta          <= s1sdelta(7);
                        s2uma           <= s1uma;
                        s2uma           <= s1uma;
                        s2umb           <= s1umb;
                        s2umb           <= s1umb;
                        s2udelta        <= s1udelta(4 downto 3);
                        s2udelta        <= s1udelta(4 downto 3);
                        s2zero          <= s1zero;
 
 
 
 
 
                        --! Etapa 2 Realizar los corrimientos, denormalizacion parcial
                        --! Etapa 2 Realizar los corrimientos, denormalizacion parcial y signar la mantissa que se queda fija
 
                        --! Mantissa Fija
                        s2asm0          <= (s2xorslab(23)&(('1'&s2um0(22 downto 0))xor(s2xorslab)))+(x"000000"&s2xorslab(23));
                        s2asm0          <= (s2xorslab(23)&(('1'&s2um0(22 downto 0))xor(s2xorslab)))+(x"000000"&s2xorslab(23));
 
                        --! Mantissa Corrida no signada
                        case s2udelta is
                        case s2udelta is
                                when "00" =>
                                when "00" =>
                                        s2aum1(23 downto 06)    <= s2psh(25 downto 08);
                                        s2aum1(23 downto 06)    <= s2psh(25 downto 08);
                                        s2aum1(05 downto 00)    <= s2psh(07 downto 02) or (s2psl(16 downto 11));
                                        s2aum1(05 downto 00)    <= s2psh(07 downto 02) or (s2psl(16 downto 11));
                                when "01" =>
                                when "01" =>
                                        s2aum1(23 downto 06)    <= x"00"&s2psh(25 downto 17);
                                        s2aum1(23 downto 06)    <= x"00"&s2psh(25 downto 16);
                                        s2aum1(05 downto 00)    <= s2sph(16 downto 11);
                                        s2aum1(05 downto 00)    <= s2psh(15 downto 10);
                                when "10" =>
                                when "10" =>
                                        s2aum1(23 downto 06)    <= x"0000"&s2psh(25);
                                        s2aum1(23 downto 06)    <= x"0000"&s2psh(25 downto 24);
                                        s2aum1(05 downto 00)    <= s2sph(24 downto 19);
                                        s2aum1(05 downto 00)    <= s2psh(23 downto 18);
                                when others =>
                                when others =>
                                        s2aum1                                  <= (others => '0');
                                        s2aum1                                  <= (others => '0');
                        end case;
                        end case;
                        s2asign         <= (s2bgta and s2signa) or (not(s2bgta) and s2signb);
                        s2asign         <= (s2bgta and s2signa) or (not(s2bgta) and s2signb);
 
                        --! Exponente normalizado
 
                        s2aexp          <= s2exp;
 
                        --! Uno de los sumandos es 0.
 
                        s2azero         <= (not(s2signb)) or (not(s2signa));
 
 
 
 
 
                        --! Etapa 2a signar la mantissa corrida y sumarlas con la no corrida
 
                        s3sm <= s2asm;
 
                        s3exp <= s2aexp;
 
 
 
 
 
                        --! Etapa 3 quitar el signo a la mantissa.
 
                        s3asign <= s3sign;
 
                        s3aum <= s3um;
 
                        s3aexp <= s3exp;
 
 
 
 
 
                        --! Eatapa 3a calcular el factor de corrimiento para la normalizacion y el delta del exponente.
 
                        s4sign <= s3asign;
 
                        s4exp  <= s3aexp;
 
                        s4shift<= s3ashift;
 
                        s4factorhot <= s3afactorhot;
 
                        s4um <= s3aum;
 
 
 
                        --! Etapa 4 Normalizar la mantissa resultado y renormalizar el exponente. Entregar el resultado!
 
                        c32(31) <= s4sign;
 
                        c32(30 downto 23) <= s4exp-s4shift;
 
                        case s4shift(4 downto 3) is
 
                                when "01"  =>  c32(22 downto 0) <= x"00"&s4postshift(22 downto 8);
 
                                when "10"  =>  c32(22 downto 0) <= x"0000"&s4postshift(22 downto 16);
 
                                when others => c32(22 downto 0) <= s4postshift(22 downto 0);
                        end case;
                        end case;
                        s2aexpnurm      <= s2expnurm;
 
                        s2azero         <= s2zero;
 
                        s2abgta         <= s2bgta;
 
                        s2audelta       <= s2udelta;
 
                        --! Etapa 2 Realizar los corrimientos, denormalizacion parcial
 
                        s3sma           <= s2pha(24 downto 0) + (s2slaba&s2pla(17 downto 8));
 
                        s3smb           <= s2phb(24 downto 0) + (s2slabb&s2plb(17 downto 8));
 
                        s3expnurm       <= s2expnurm;
 
                        s3zero          <= s2zero;
 
                        s3bgta          <= s2bgta;
 
                        s3udelta        <= s2udelta;
 
 
 
                        --! Etapa 3, finalizar la denormalizacion y realizar la suma
 
                        s4ssm           <= s3ssm;
 
                        s4expnurm       <= s3expnurm;
 
                end if;
                end if;
        end process;
        end process;
 
 
--! ******************************************************************************************************************************
--! ******************************************************************************************************************************
 
 
        --! Etapa 1
        --! Etapa 1
        --! Decodificar la magnitud del corrimiento
        --! Decodificar la magnitud del corrimiento
        unsigneddelta: lpm_mult
        decodermag:
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
        process (s1udelta(7), s1udelta(4 downto 0))
        port    map (s1sdelta(7)&x"80",s1sdelta(7)&s1sdelta,s1pudelta);
        begin
        s1udelta(4 downto 0) <= s1pudelta(11 downto 7);
                s1xorslab       <= (others => s1sdelta(7));
        denormshiftmagnitude:
                s1udelta        <= (s1sdelta(4 downto 0) xor s1xorslab)+(x"0"&s1sdelta(7));
 
        end process;
 
 
        --! Decodificar el factor de corrimiento
        --! Decodificar el factor de corrimiento
        denormfactor:
        denormfactor:
        process (s1shiftslab,s1udelta)
        process (s1udelta(2 downto 0),s1sdelta(7))
        begin
        begin
                s1factor(8 downto 0) <= (others => s1sdelta(7));
                s1factor(8 downto 0) <= (others => s1sdelta(7));
                case s1udelta(2 downto 0) is
                case s1udelta(2 downto 0) is
                        when x"0" => s1factor(8 downto 0)         <= "100000000";
                        when "000" => s1factor(8 downto 0)       <= "100000000";
                        when x"1" => s1factor(8 downto 0)        <= "010000000";
                        when "001" => s1factor(8 downto 0)       <= "010000000";
                        when x"2" => s1factor(8 downto 0)        <= "001000000";
                        when "010" => s1factor(8 downto 0)       <= "001000000";
                        when x"3" => s1factor(8 downto 0)        <= "000100000";
                        when "011" => s1factor(8 downto 0)       <= "000100000";
                        when x"4" => s1factor(8 downto 0)        <= "000010000";
                        when "100" => s1factor(8 downto 0)       <= "000010000";
                        when x"5" => s1factor(8 downto 0)        <= "000001000";
                        when "101" => s1factor(8 downto 0)       <= "000001000";
                        when x"6" => s1factor(8 downto 0)        <= "000000100";
                        when "110" => s1factor(8 downto 0)       <= "000000100";
                        when others => s1factor(0)                       <= "000000010";
                        when others => s1factor(8 downto 0) <= "000000010";
                end case;
                end case;
        end process;
        end process;
--! ******************************************************************************************************************************
--! ******************************************************************************************************************************
        --! Etapa2
        --! Etapa2
        --! Correr las mantissas
        --! Correr las mantissas
        denomrselectmantissa2shift:
        denomrselectmantissa2shift:
        process (s2bgta,s2signa,s2signb,s2factor,s2sma,s2smb)
        process (s2bgta,s2signa,s2signb,s2uma,s2umb)
        begin
        begin
 
 
                case s2bgta is
                case s2bgta is
                        when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto
                        when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto
                                s2factorshift   <= s2factor;
 
                                s2um0                   <= s2umb;
                                s2um0                   <= s2umb;
                                s2smshift               <= s2uma;
 
                                s2xorslab               <= (others => s2signb);
                                s2xorslab               <= (others => s2signb);
 
 
 
                                s2smshift               <= s2uma;
 
 
                        when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
                        when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
                                s2factorshift   <= s2factor;
 
                                s2smshift               <= s2umb;
 
                                s2um0                   <= s2uma;
                                s2um0                   <= s2uma;
                                s2xorslab               <= (others => s2signa);
                                s2xorslab               <= (others => s2signa);
 
 
 
                                s2smshift               <= s2umb;
 
 
                end case;
                end case;
        end process;
        end process;
 
 
 
 
        --! Correr las mantissas y calcularlas.
        --! Correr las mantissas y calcularlas.
        hshift: lpm_mult
        hshiftdenorm: lpm_mult
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,18,27)
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,18,27)
        port    map (s2factorshift,"01"&s2smshift(22 downto 0),s2psh);
        port    map (s2factor,'1'&s2smshift(22 downto 06),s2psh);
        lshift: lpm_mult
        lshiftdenorm: lpm_mult
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
        port    map (s2factorshift,"0"&s2smshift(06 downto 0)&'0,s2psl);
        port    map (s2factor,s2smshift(05 downto 00)&"000",s2psl);
 
 
 
 
--! ******************************************************************************************************************************
--! ******************************************************************************************************************************
        --! Etapa2a signar las mantissas y sumarlas.
        --! Etapa2a signar las mantissas y sumarlas.
        signmantissa:
        signmantissa:
        process(s2asign,s2aum1,s2asm0,s2azero)
        process(s2asign,s2aum1,s2asm0,s2azero)
        begin
        begin
                s2axorslab      <= (others => s2asign);
                s2axorslab      <= (others => s2asign);
                s2asm1          <= (s2axorslab(23)&((s2um1(23 downto 0))xor(s2axorslab)))+(x"000000"&s2axorslab(23));
                s2asm1          <= (s2axorslab(23)&(s2aum1 xor (s2axorslab)))+(x"000000"&s2axorslab(23));
                case s2azero is
                case s2azero is
                        when '0'         => s2asm <= (s2asm1(s2asm1'high)&s2asm1) +  (s2asm0(s2asm0'high)&s2asm0);
                        when '0'         => s2asm <= (s2asm1(s2asm1'high)&s2asm1) +  (s2asm0(s2asm0'high)&s2asm0);
                        when others     => s2asm <= (s2asm1(s2asm1'high)&s2asm1) or (s2asm0(s2asm0'high)&s2asm0);
                        when others     => s2asm <= (s2asm1(s2asm1'high)&s2asm1) or (s2asm0(s2asm0'high)&s2asm0);
                end case;
                end case;
        end process;
        end process;
 
 
--! ******************************************************************************************************************************
--! ******************************************************************************************************************************
        --! Etapa3 : Quitar el signo a las mantissas y  calcular el factor 
        --! Etapa3 : Quitar el signo a las mantissa.
 
--! ******************************************************************************************************************************
        unsignmantissa:
        unsignmantissa:
        process(s3sm)
        process(s3sm)
        begin
        begin
                s3xorslab       <= ( others => s3sm(s3sm'high) );
                s3xorslab       <= ( others => s3sm(s3sm'high) );
                s3um(24 downto 0)        <= ( s3sm(24 downto 0) xor s3xorslab ) + (x"000000"&s3xorslab(24));
                s3um(24 downto 0)        <= ( s3sm(24 downto 0) xor s3xorslab ) + (x"000000"&s3xorslab(24));
                s3sign <= s3sm(s3sm'high);
                s3sign <= s3sm(s3sm'high);
                s3count <= "00000";
        end process;
 
--! ******************************************************************************************************************************
 
        --! Etapa3a : Decodificar el factor de corrimiento y calcular el exponente normalizado. 
 
--! ******************************************************************************************************************************
 
        redentioform:
 
        process(s3aum,s3asign)
 
        begin
 
                s3ashift <= s3aexp;
 
                s3afactorhot <= (others => '0');
                for i in 24 downto 0 loop
                for i in 24 downto 0 loop
                        if s3um(i)='1' then
                        if s3aum(i)='1' then
                                s3count <= conv_std_logic_vector(24-i,8)+x"ff";
                                s3ashift <= conv_std_logic_vector(24-i,8)+x"ff";
 
                                s3afactorhot(24-i) <= '1';
                                exit;
                                exit;
                        end if;
                        end if;
                end loop;
                end loop;
        end process;
        end process;
--! ******************************************************************************************************************************
--! ******************************************************************************************************************************
        --! Etapa3a : Decodificar el factor de corrimiento y calcular el exponente normalizado. 
        --! Etapa4 : Normalizar la mantissa y calcular el exponente. Entregar el resultado 
--! ******************************************************************************************************************************
--! ******************************************************************************************************************************
        redentioform:
        --!Normalizacion mediante multiplicacion
        process(s4count)
        process (s4ph,s4pl,s4factorhot,s4um)
        begin
        begin
                s4exp <= s4expunrm + s4count;
                s4postshift(22 downto 15) <= s4ph(16 downto 9);
 
                s4postshift(14 downto 06) <= s4ph(08 downto 0) or s4pl(17 downto 9);
                case s4count(4 downto 3) is
                s4postshift(05 downto 00) <= s4pl(08 downto 3);
                        when "11" => s4factor <= '0'&x"01";
                case s4shift(4 downto 3) is
                        when others
                        when "00"  =>
                                case s4count(2 downto 0) is
                                s4factorhot9 <= s4factorhot(08 downto 01)&'0';
                                        when x"0" => s4factor <= '0'&x"02";
                        when "01"  =>
                                        when x"1" => s4factor <= '0'&x"04";
                                s4factorhot9 <= s4factorhot(16 downto 09)&'0';
                                        when x"2" => s4factor <= '0'&x"08";
                        when "10"  =>
                                        when x"3" => s4factor <= '0'&x"10";
                                s4factorhot9 <= s4factorhot(24 downto 17)&'0';
                                        when x"4" => s4factor <= '0'&x"20";
                        when others =>
                                        when x"5" => s4factor <= '0'&x"40";
                                s4factorhot9 <= s4factorhot(08 downto 00);
                                        when x"6" => s4factor <= '0'&x"80";
 
                                        when others  => s4factor <= '1'&x"00";
 
                                end case;
 
                end case;
                end case;
        end process;
        end process;
 
        hshiftnorm: lpm_mult
        --! Etapa4 : Mantissas sumadas, designar y normalizar
 
        hshift: lpm_mult
 
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,18,27)
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,18,27)
        port    map (s4factor,"01"&s2smshift(22 downto 0),s2psh);
        port    map (s4factorhot9,s4um(24 downto 07),s4ph);
        lshift: lpm_mult
        lshiftnorm: lpm_mult
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
        port    map (s2factorshift,"0"&s2smshift(06 downto 0)&'0,s2psl);
        port    map (s4factorhot9,s4um(06 downto 00)&"00",s4pl);
 
 
 
 
 
 
 
 
 
 
 
 
 
 

powered by: WebSVN 2.1.0

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