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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp_sgdma/] [arith/] [single/] [fmul32.vhd] - Diff between revs 219 and 238

Show entire file | Details | Blame | View Log

Rev 219 Rev 238
Line 1... Line 1...
 
------------------------------------------------
 
--! @file fmul32.vhd
 
--! @brief RayTrac Mantissa Multiplier  
 
--! @author Julián Andrés Guarín Reyes
 
--------------------------------------------------
 
 
 No newline at end of file
 No newline at end of file
 
 
 
-- RAYTRAC (FP BRANCH)
 
-- Author Julian Andres Guarin
 
-- fmul32.vhd
 
-- This file is part of raytrac.
 
-- 
 
--     raytrac is free software: you can redistribute it and/or modify
 
--     it under the terms of the GNU General Public License as published by
 
--     the Free Software Foundation, either version 3 of the License, or
 
--     (at your option) any later version.
 
-- 
 
--     raytrac is distributed in the hope that it will be useful,
 
--     but WITHOUT ANY WARRANTY; without even the implied warranty of
 
--     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
--     GNU General Public License for more details.
 
-- 
 
--     You should have received a copy of the GNU General Public License
 
--     along with raytrac.  If not, see <http://www.gnu.org/licenses/>
 
library ieee;
 
use ieee.std_logic_1164.all;
 
use ieee.std_logic_unsigned.all;
 
use work.arithpack.all;
 
 
 
 
 
entity fmul32 is
 
 
 
        port (
 
                clk             : in std_logic;
 
                a32,b32         : in xfloat32;
 
                p32                     : out xfloat32
 
 
 
        );
 
end entity;
 
architecture fmul32_arch of fmul32 is
 
 
 
 
 
 
 
        --Stage 0 signals
 
        signal s0dataa_alfa,s0dataa_beta,s0dataa_gama,s0datab : std_logic_vector(17 downto 0);
 
        --!TXBXSTART:MULT_STAGE0        
 
        signal s0sga,s0sgb,s0zrs : std_logic;
 
        signal s0exp : std_logic_vector(7 downto 0);
 
        signal s0uma,s0umb : std_logic_vector(22 downto 0);
 
        signal s0ac : std_logic_vector(35 downto 0);
 
        --!TBXEND
 
        signal s1sgr,s2sgr:std_logic;
 
        signal s0exa,s0exb,s1exp,s2exp:std_logic_vector(7 downto 0);
 
        signal s0ad,s0bc,s1ad,s1bc:std_logic_vector(23 downto 0);
 
 
 
 
 
        signal s1ac,s1umu:std_logic_vector(35 downto 0);
 
        signal s2umu:std_logic_vector(24 downto 0);
 
        signal sxprop : std_logic_vector(2 downto 0);
 
 
 
        --! LPM_MULTIPLIER
 
        component lpm_mult
 
        generic (
 
                lpm_hint                        : string;
 
                lpm_pipeline            : natural;
 
                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;
 
 
 
 
 
begin
 
 
 
 
 
        process(clk)
 
        begin
 
 
 
                if clk'event and clk='1'  then
 
                        --! Registro de entrada
 
                        s0sga <= a32(31);
 
                        s0sgb <= b32(31);
 
                        s0exa <= a32(30 downto 23);
 
                        s0exb <= b32(30 downto 23);
 
                        s0uma <= a32(22 downto 0);
 
                        s0umb <= b32(22 downto 0);
 
                        --! Etapa 0 multiplicacion de la mantissa, suma de los exponentes y multiplicaci&oacute;n de los signos.
 
                        s1sgr <= s0sga xor s0sgb;
 
                        s1ad <= s0ad;
 
                        s1bc <= s0bc;
 
                        s1ac <= s0ac;
 
                        s1exp <= s0exp;
 
 
 
                        --! Etapa 1 Sumas parciales
 
                        s2umu <= s1umu(35 downto 11);
 
                        s2sgr <= s1sgr;
 
                        s2exp <= s1exp;
 
 
 
 
 
                end if;
 
        end process;
 
        --! Etapa 2 entregar el resultado
 
        p32(31) <= s2sgr;
 
        process (s2exp,s2umu)
 
        begin
 
                p32(30 downto 23) <= s2exp+s2umu(24);
 
                if s2umu(24) ='1' then
 
                        p32(22 downto 0) <= s2umu(23 downto 1);
 
                else
 
                        p32(22 downto 0) <= s2umu(22 downto 0);
 
                end if;
 
        end process;
 
 
 
        --! Combinatorial Gremlin Etapa 0 : multiplicacion de la mantissa, suma de los exponentes y multiplicaci&oacute;n de los signos.
 
 
 
        --! Multipliers
 
        s0dataa_alfa <= s0zrs&s0uma(22 downto 6);
 
        s0datab <= s0zrs&s0umb(22 downto 6);
 
        mult18x18ac:lpm_mult
 
        generic map (
 
                lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",
 
                lpm_pipeline => 0,
 
                lpm_representation => "UNSIGNED",
 
                lpm_type => "LPM_MULT",
 
                lpm_widtha => 18,
 
                lpm_widthb => 18,
 
                lpm_widthp => 36
 
        )
 
        port map (
 
                dataa => s0dataa_alfa,
 
                datab => s0datab,
 
                result => s0ac
 
        );
 
        s0dataa_beta <= s0zrs&s0uma(22 downto 6);
 
        mult18x6ad:lpm_mult
 
        generic map (
 
                lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",
 
                lpm_pipeline => 0,
 
                lpm_representation => "UNSIGNED",
 
                lpm_type => "LPM_MULT",
 
                lpm_widtha => 18,
 
                lpm_widthb => 6,
 
                lpm_widthp => 24
 
        )
 
        port map (
 
                dataa => s0dataa_beta,
 
                datab => s0umb(5 downto 0),
 
                result => s0ad
 
        );
 
        s0dataa_gama <= s0zrs&s0umb(22 downto 6);
 
        mult18x6bc:lpm_mult
 
        generic map (
 
                lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",
 
                lpm_pipeline => 0,
 
                lpm_representation => "UNSIGNED",
 
                lpm_type => "LPM_MULT",
 
                lpm_widtha => 18,
 
                lpm_widthb => 6,
 
                lpm_widthp => 24
 
        )
 
        port map (
 
                dataa => s0dataa_gama,
 
                datab => s0uma(5 downto 0),
 
                result => s0bc
 
        );
 
 
 
        --! Exponent Addition 
 
        process (s0sga,s0sgb,s0exa,s0exb)
 
 
 
        begin
 
 
 
                if s0exa=x"00" or s0exb=x"00" then
 
                        s0exp <= (others => '0');
 
                        s0zrs <= '0';
 
                else
 
                        s0zrs<='1';
 
                        s0exp <= s0exa+s0exb+x"81";
 
                end if;
 
        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 architecture;
 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.