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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [mul/] [mul2.vhd] - Diff between revs 93 and 94

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

Rev 93 Rev 94
Line 1... Line 1...
------------------------------------------------
------------------------------------------------
--! @file mmp.vhd
--! @file mul2.vhd
--! @brief RayTrac Mantissa Multiplier  
--! @brief RayTrac Mantissa Multiplier  
--! @author Julián Andrés Guarín Reyes
--! @author Julián Andrés Guarín Reyes
--------------------------------------------------
--------------------------------------------------
 
 
 
 
Line 52... Line 52...
                lpm_widtha                      : natural;
                lpm_widtha                      : natural;
                lpm_widthb                      : natural;
                lpm_widthb                      : natural;
                lpm_widthp                      : natural
                lpm_widthp                      : natural
        );
        );
        port (
        port (
                dataa   : in std_logic_vector ( 17 downto 0 );
                dataa   : in std_logic_vector ( lpm_widtha-1 downto 0 );
                datab   : in std_logic_vector ( 17 downto 0 );
                datab   : in std_logic_vector ( lpm_widthb-1 downto 0 );
--              clock   : in std_logic;
                result  : out std_logic_vector ( lpm_widthp-1 downto 0 )
                result  : out std_logic_vector ( 35 downto 0 )
 
        );
        );
        end component;
        end component;
 
 
        signal s0sga,s0sgb,s1sg,s0significandMSB:std_logic;
        --Stage 0 signals
        signal s0exa,s0exb,s1ex:std_logic_vector(7 downto 0);
 
        signal s0ex : std_logic_vector(8 downto 0);
 
        signal s0uma,s0umb:std_logic_vector(16 downto 0);
 
        signal s0map:std_logic_vector(35 downto 0);
        signal s0sga,s0sgb,s0zrs,s1sgr,s2sgr:std_logic;
        signal s1map:std_logic_vector(24 downto 0);
        signal s0exa,s0exb,s1exp,s2exp:std_logic_vector(7 downto 0);
 
        signal s0exp : std_logic_vector(8 downto 0);
 
        signal s0uma,s0umb:std_logic_vector(22 downto 0);
 
        signal s0ad,s0bc,s1ad,s1bc:std_logic_vector(23 downto 0);
 
        signal s0ac:std_logic_vector(35 downto 0);
 
 
 
 
 
        signal s1ac,s1umu:std_logic_vector(35 downto 0);
 
        signal s2umu:std_logic_vector(24 downto 0);
 
 
begin
begin
 
 
        process(clk)
        process(clk)
        begin
        begin
Line 77... Line 84...
                        --! Registro de entrada
                        --! Registro de entrada
                        s0sga <= a32(31);
                        s0sga <= a32(31);
                        s0sgb <= b32(31);
                        s0sgb <= b32(31);
                        s0exa <= a32(30 downto 23);
                        s0exa <= a32(30 downto 23);
                        s0exb <= b32(30 downto 23);
                        s0exb <= b32(30 downto 23);
                        s0uma <= a32(22 downto 6);
                        s0uma <= a32(22 downto 0);
                        s0umb <= b32(22 downto 6);
                        s0umb <= b32(22 downto 0);
                        --! Etapa 0 multiplicacion de la mantissa, suma de los exponentes y multiplicaci&oacute;n de los signos.
                        --! Etapa 0 multiplicacion de la mantissa, suma de los exponentes y multiplicaci&oacute;n de los signos.
                        s1map <= s0map(35 downto 11);
                        s1sgr <= s0sga xor s0sgb;
                        s1ex <= s0ex(7 downto 0);
                        s1ad <= s0ad;
                        s1sg <= s0sga xor s0sgb;
                        s1bc <= s0bc;
                        --! Etapa 1 entregar el resultado
                        s1ac <= s0ac;
                        p32(31) <= s1sg;
                        s1exp <= s0exp(7 downto 0);
                        p32(30 downto 23) <= s1ex+s1map(24);
 
                        if s1map(24) ='1' then
                        --! Etapa 1 Sumas parciales
                                p32(22 downto 0) <= s1map(23 downto 1);
                        s2umu <= s1umu(35 downto 11);
 
                        s2sgr <= s1sgr;
 
                        s2exp <= s1exp;
 
 
 
                        --! Etapa 2 entregar el resultado
 
                        p32(31) <= s2sgr;
 
                        p32(30 downto 23) <= s2exp+s2umu(24);
 
                        if s2umu(24) ='1' then
 
                                p32(22 downto 0) <= s2umu(23 downto 1);
                        else
                        else
                                p32(22 downto 0) <= s1map(22 downto 0);
                                p32(22 downto 0) <= s2umu(22 downto 0);
                        end if;
                        end if;
                end if;
                end if;
        end process;
        end process;
 
 
        --! Combinatorial Gremlin
        --! Combinatorial Gremlin Etapa 0 : multiplicacion de la mantissa, suma de los exponentes y multiplicaci&oacute;n de los signos.
        mult:lpm_mult
 
 
        --! Multipliers
 
        mult18x18ac:lpm_mult
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",0,"UNSIGNED","LPM_MULT",18,18,36)
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",0,"UNSIGNED","LPM_MULT",18,18,36)
        port    map (s0significandMSB&s0uma,s0significandMSB&s0umb,s0map);
        port    map (s0zrs&s0uma(22 downto 6),s0zrs&s0umb(22 downto 6),s0ac);
 
        mult18x6ad:lpm_mult
 
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",0,"UNSIGNED","LPM_MULT",18,6,24)
 
        port    map (s0zrs&s0uma(22 downto 6),s0umb(5 downto 0),s0ad);
 
        mult18x6bc:lpm_mult
 
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",0,"UNSIGNED","LPM_MULT",18,6,24)
 
        port    map (s0zrs&s0umb(22 downto 6),s0uma(5 downto 0),s0bc);
 
 
        process (s0sga,s0sgb,s0exa,s0exb,s0uma,s0umb)
        --! Exponent Addition 
 
        process (s0sga,s0sgb,s0exa,s0exb)
                variable i8s0exa,i8s0exb: integer range 0 to 255;
                variable i8s0exa,i8s0exb: integer range 0 to 255;
        begin
        begin
                i8s0exa:=conv_integer(s0exa);
                i8s0exa:=conv_integer(s0exa);
                i8s0exb:=conv_integer(s0exb);
                i8s0exb:=conv_integer(s0exb);
                if i8s0exa = 0 or i8s0exb = 0  then
                if i8s0exa = 0 or i8s0exb = 0  then
                        s0ex <= (others => '0');
                        s0exp <= (others => '0');
                        s0significandMSB <= '0';
                        s0zrs <= '0';
                else
                else
                        s0significandMSB<='1';
                        s0zrs<='1';
                        s0ex <= conv_std_logic_vector(i8s0exb+i8s0exa+129,9);
                        s0exp <= conv_std_logic_vector(i8s0exb+i8s0exa+129,9);
                end if;
                end if;
        end process;
        end process;
 
 
 
        --! Etapa 1: Suma parcial de la multiplicacion. Suma del exponente      
 
        process(s1ac,s1ad,s1bc)
 
        begin
 
                s1umu <= s1ac+s1ad(23 downto 6)+s1bc(23 downto 6);
 
        end process;
 
 
 
 
 
 
 
 
 
 
 
 
end mul2_arch;
end mul2_arch;
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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