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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [unrm/] [shftr.vhd] - Diff between revs 106 and 107

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

Rev 106 Rev 107
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;
 
 

powered by: WebSVN 2.1.0

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