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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [unrm/] [shftr.vhd] - Diff between revs 110 and 111

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

Rev 110 Rev 111
Line 41... Line 41...
        signal xplaces,s1udelta : std_logic_vector (4 downto 0);
        signal xplaces,s1udelta : std_logic_vector (4 downto 0);
        signal sign : std_logic;
        signal sign : std_logic;
 
 
 
 
begin
begin
 
 
 
--! ******************************************************************************************************************************
        --! Pipeline
        --! Pipeline
        pipeline:
        pipeline:
        process(clk)
        process(clk)
        begin
        begin
 
 
Line 100... Line 102...
                        s2udelta                <= s1udelta(4 downto 3);
                        s2udelta                <= s1udelta(4 downto 3);
                        s2zero                  <= s1zero;
                        s2zero                  <= s1zero;
 
 
 
 
                        --! Etapa 2 Realizar los corrimientos, denormalizacion parcial
                        --! Etapa 2 Realizar los corrimientos, denormalizacion parcial
 
                        s2asm0          <= (s2xorslab(23)&(('1'&s2um0(22 downto 0))xor(s2xorslab)))+(x"000000"&s2xorslab(23));
 
                        case s2udelta is
 
                                when "00" =>
 
                                        s2aum1(23 downto 06)    <= s2psh(25 downto 08);
 
                                        s2aum1(05 downto 00)    <= s2psh(07 downto 02) or (s2psl(16 downto 11));
 
                                when "01" =>
 
                                        s2aum1(23 downto 06)    <= x"00"&s2psh(25 downto 17);
 
                                        s2aum1(05 downto 00)    <= s2sph(16 downto 11);
 
                                when "10" =>
 
                                        s2aum1(23 downto 06)    <= x"0000"&s2psh(25);
 
                                        s2aum1(05 downto 00)    <= s2sph(24 downto 19);
 
                                when others =>
 
                                        s2aum1                                  <= (others => '0');
 
                        end case;
 
                        s2asign         <= (s2bgta and s2signa) or (not(s2bgta) and s2signb);
 
 
 
 
 
                        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));
                        s3sma                   <= s2pha(24 downto 0) + (s2slaba&s2pla(17 downto 8));
                        s3smb                   <= s2phb(24 downto 0) + (s2slabb&s2plb(17 downto 8));
                        s3smb                   <= s2phb(24 downto 0) + (s2slabb&s2plb(17 downto 8));
                        s3expnurm       <= s2expnurm;
                        s3expnurm       <= s2expnurm;
                        s3zero                  <= s2zero;
                        s3zero                  <= s2zero;
                        s3bgta          <= s2bgta;
                        s3bgta          <= s2bgta;
                        s3udelta                <= s2udelta;
                        s3udelta                <= s2udelta;
 
 
                        --! Etapa 3, finalizar la denormalizacion y realizar la suma
                        --! Etapa 3, finalizar la denormalizacion y realizar la suma
                        s4ssm                   <= s3ssm;
                        s4ssm                   <= s3ssm;
                        s4expnurm       <= s3expnurm;
                        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
 
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
 
        port    map (s1sdelta(7)&x"80",s1sdelta(7)&s1sdelta,s1pudelta);
 
        s1udelta(4 downto 0) <= s1pudelta(11 downto 7);
        denormshiftmagnitude:
        denormshiftmagnitude:
        process (s1sdelta(7),s1sdelta(4 downto 0),s1signa,s1signb)
 
        begin
 
                for i in 4 downto 0 loop
 
                        s1xdelta(i) <= s1sdelta(i) xor s1sdelta(7);
 
                end loop;
 
                s1udelta  <= s1xdelta+("0000"&s1sdelta(7));
 
                if s1sdelta(7) = '1' then
 
                        s1shiftslab     <=      (others=> s1signa);--!b>a
 
                else
 
                        s1shiftslab     <=      (others=> s1signb);--!a>=b
 
                end if;
 
        end process;
 
        --! Decodificar el factor de corrimiento
        --! Decodificar el factor de corrimiento
        denormfactor:
        denormfactor:
        process (s1shiftslab,s1udelta)
        process (s1shiftslab,s1udelta)
        begin
        begin
 
                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) <= s1shiftslab(0 downto 0) & "10000000";
                        when x"0" => s1factor(8 downto 0)         <= "100000000";
                        when x"1" => s1factor(8 downto 0) <= s1shiftslab(1 downto 0) & "1000000";
                        when x"1" => s1factor(8 downto 0)        <= "010000000";
                        when x"2" => s1factor(8 downto 0) <= s1shiftslab(2 downto 0) & "100000";
                        when x"2" => s1factor(8 downto 0)        <= "001000000";
                        when x"3" => s1factor(8 downto 0) <= s1shiftslab(3 downto 0) & "10000";
                        when x"3" => s1factor(8 downto 0)        <= "000100000";
                        when x"4" => s1factor(8 downto 0) <= s1shiftslab(4 downto 0) & "1000";
                        when x"4" => s1factor(8 downto 0)        <= "000010000";
                        when x"5" => s1factor(8 downto 0) <= s1shiftslab(5 downto 0) & "100";
                        when x"5" => s1factor(8 downto 0)        <= "000001000";
                        when x"6" => s1factor(8 downto 0) <= s1shiftslab(6 downto 0) & "10";
                        when x"6" => s1factor(8 downto 0)        <= "000000100";
                        when others => s1factor(8 downto 0) <=s1shiftslab(7 downto 0) &"1";
                        when others => s1factor(0)                       <= "000000010";
                end case;
                end case;
        end process;
        end process;
 
--! ******************************************************************************************************************************
        --! Etapa2
        --! Etapa2
        --! Asignar el factor de corrimiento  las mantissas
        --! Correr las mantissas
        denomrselectmantissa2shift:
        denomrselectmantissa2shift:
        process (s2bgta,s2signa,s2signb,s2factor)
        process (s2bgta,s2signa,s2signb,s2factor,s2sma,s2smb)
        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
                                s2factorb <= s2signb&"10000000";
                                s2factorshift   <= s2factor;
                                s2factora <= s2factor;
                                s2um0                   <= s2umb;
 
                                s2smshift               <= s2uma;
 
                                s2xorslab               <= (others => s2signb);
                        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
                                s2factorb <= s2factor;
                                s2factorshift   <= s2factor;
                                s2factora <= s2signa&"10000000";
                                s2smshift               <= s2umb;
 
                                s2um0                   <= s2uma;
 
                                s2xorslab               <= (others => s2signa);
                end case;
                end case;
 
 
        end process;
        end process;
 
 
 
 
 
 
        --! Correr las mantissas y calcularlas.
        --! Correr las mantissas y calcularlas.
        hmulta: lpm_mult
        hshift: lpm_mult
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,18,27)
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,18,27)
        port    map (s2factora,s2signa&'1'&s2data24a(22 downto 0),s2pha);
        port    map (s2factorshift,"01"&s2smshift(22 downto 0),s2psh);
        lmulta: lpm_mult
        lshift: lpm_mult
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
        port    map (s2factora,s2signa&'1'&s2dataa(6 downto 0),s2pla);
        port    map (s2factorshift,"0"&s2smshift(06 downto 0)&'0,s2psl);
        hmultb: lpm_mult
 
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,18,27)
 
        port    map (s2factorb,s2signb&'1'&s2datab(22 downto 0),s2phb);
--! ******************************************************************************************************************************
        lmultb: lpm_mult
        --! Etapa2a signar las mantissas y sumarlas.
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
        signmantissa:
        port    map (s2factorb,s2signb&'1'&s2datab(6 downto 0),s2plb);
        process(s2asign,s2aum1,s2asm0,s2azero)
        mantissadenormslabcalc:
        begin
        process(s2signa,s2signb)
                s2axorslab      <= (others => s2asign);
        begin
                s2asm1          <= (s2axorslab(23)&((s2um1(23 downto 0))xor(s2axorslab)))+(x"000000"&s2axorslab(23));
                s2slaba <= (others => s2signa);
                case s2azero is
                s2slabb <= (others => s2signb);
                        when '0'         => s2asm <= (s2asm1(s2asm1'high)&s2asm1) +  (s2asm0(s2asm0'high)&s2asm0);
        end process;
                        when others     => s2asm <= (s2asm1(s2asm1'high)&s2asm1) or (s2asm0(s2asm0'high)&s2asm0);
 
 
        --! Sumar las mantissas signadas y colocar los 0's que hagan falta 
 
        mantissaadding:
 
        process (s3bgta,s3sma,s3smb,s3udelta,zero)
 
        begin
 
 
 
                case s3bgta is
 
                        when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto 
 
                                s3ssmb <= s3smb;
 
                                s3shiftslab(23 downto 0)<=(others=>s3sma(24));
 
                                case s3udelta is
 
                                        when x"3" => s3ssma <= (s3sma(24)&s3shiftslab(23 downto 0));
 
                                        when x"2" => s3ssma <= (s3sma(24)&s3shiftslab(15 downto 0)&s3sma(23 downto 16));
 
                                        when x"1" => s3ssma <= (s3sma(24)&s3shiftslab(7 downto 0)&s3sma(23 downto 8));
 
                                        when others => s3ssma <= s3sma;
 
                                end case;
 
                        when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
 
                                s3ssma <= s3sma;
 
                                shiftslab(23 downto 0)<=(others=>s3smb(24));
 
                                case s3udelta is
 
                                        when x"3" => s3ssmb <= (s3smb(24)&s3shiftslab(23 downto 0));
 
                                        when x"2" => s3ssmb <= (s3smb(24)&s3shiftslab(15 downto 0)&s3smb(23 downto 16));
 
                                        when x"1" => s3ssmb <= (s3smb(24)&s3shiftslab(7 downto 0)&s3smb(23 downto 8));
 
                                        when others => s3ssmb <= s3smb;
 
                                end case;
                                end case;
                end case;
 
                if s3zero='0' then
 
                        s3ssm <= (s3ssma(24)&s3ssma)+(s3ssmb(24)&s3ssmb);
 
                else
 
                        s3ssm <= (s3ssma(24)&s3ssma)or(s3ssmb(24)&s3ssmb);
 
                end if;
 
        end process;
        end process;
 
 
        --! Mantissas sumadas, designar
 
 
        --! Mantissas sumadas, designar y normalizar
        unsignmantissa:
        unsignmantissa:
        process(s4ssm)
        process(s3sm)
 
 
        begin
        begin
 
                s3xorslab       <= ( others => s3sm(s3sm'high) );
 
                s3um(24 downto 0)        <= ( s3sm(24 downto 0) xor s3xorslab ) + (x"000000"&s3xorslab(24));
 
                s3sign <= s3sm(s3sm'high);
 
                s3factor <= x"000000"&'0';
 
                s3count  <= '1'&x"f";
 
                s3unrmexp <=
                for i in 24 downto 0 loop
                for i in 24 downto 0 loop
                        s4usm(i) <= s4ssm(25) xor s4ssm(i);
                        if s3sm(i)='1' then
 
                                s3factor(24-i)<='1';
 
                                exit;
 
                        end if;
 
                        s3count<=s3count+1;
                end loop;
                end loop;
                s4sign <=s4ssm(25);
                s3nrmexpo<=s3unrmexpo+s3count;
                s4uxm <= s4usm+(x"000000"&s4ssm(25));
        end process;
 
 
 
 
 
 
        end process;
        end process;
 
 
        --!Normalizar el  exponente y calcular el factor de corrimiento para la normalizaci&oacute;n de la mantissa
        --!Normalizar el  exponente y calcular el factor de corrimiento para la normalizaci&oacute;n de la mantissa
        process (s4uxm,expunrm)
        process (s4uxm,expunrm)
                variable xshift : integer range 24 downto 0;
                variable xshift : integer range 24 downto 0;

powered by: WebSVN 2.1.0

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