Line 1... |
Line 1... |
------------------------------------------------
|
------------------------------------------------
|
--! @file mul2.vhd
|
--! @file fmul32.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
|
--------------------------------------------------
|
--------------------------------------------------
|
|
|
|
|
-- RAYTRAC (FP BRANCH)
|
-- RAYTRAC (FP BRANCH)
|
-- Author Julian Andres Guarin
|
-- Author Julian Andres Guarin
|
-- mmp.vhd
|
-- fmul32.vhd
|
-- This file is part of raytrac.
|
-- This file is part of raytrac.
|
--
|
--
|
-- raytrac is free software: you can redistribute it and/or modify
|
-- raytrac is free software: you can redistribute it and/or modify
|
-- it under the terms of the GNU General Public License as published by
|
-- it under the terms of the GNU General Public License as published by
|
-- the Free Software Foundation, either version 3 of the License, or
|
-- the Free Software Foundation, either version 3 of the License, or
|
Line 20... |
Line 20... |
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
-- GNU General Public License for more details.
|
-- GNU General Public License for more details.
|
--
|
--
|
-- You should have received a copy of the GNU General Public License
|
-- You should have received a copy of the GNU General Public License
|
-- along with raytrac. If not, see <http://www.gnu.org/licenses/>
|
-- along with raytrac. If not, see <http://www.gnu.org/licenses/>
|
|
|
|
|
library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_arith.all;
|
|
use ieee.std_logic_unsigned.all;
|
use ieee.std_logic_unsigned.all;
|
|
entity fmul32 is
|
entity mul2 is
|
|
port (
|
port (
|
clk : in std_logic;
|
clk : in std_logic;
|
a32,b32 : in std_logic_vector(31 downto 0);
|
a32,b32 : in std_logic_vector(31 downto 0);
|
p32 : out std_logic_vector(31 downto 0)
|
p32 : out std_logic_vector(31 downto 0)
|
|
|
);
|
);
|
end mul2;
|
end fmul32;
|
|
architecture fmul32_arch of fmul32 is
|
architecture mul2_arch of mul2 is
|
|
|
|
|
|
component lpm_mult
|
component lpm_mult
|
generic (
|
generic (
|
lpm_hint : string;
|
lpm_hint : string;
|
Line 62... |
Line 57... |
|
|
|
|
|
|
signal s0sga,s0sgb,s0zrs,s1sgr,s2sgr:std_logic;
|
signal s0sga,s0sgb,s0zrs,s1sgr,s2sgr:std_logic;
|
signal s0exa,s0exb,s1exp,s2exp:std_logic_vector(7 downto 0);
|
signal s0exa,s0exb,s1exp,s2exp:std_logic_vector(7 downto 0);
|
signal s0exp : std_logic_vector(8 downto 0);
|
signal s0exp : std_logic_vector(7 downto 0);
|
signal s0uma,s0umb:std_logic_vector(22 downto 0);
|
signal s0uma,s0umb:std_logic_vector(22 downto 0);
|
signal s0ad,s0bc,s1ad,s1bc:std_logic_vector(23 downto 0);
|
signal s0ad,s0bc,s1ad,s1bc:std_logic_vector(23 downto 0);
|
signal s0ac:std_logic_vector(35 downto 0);
|
signal s0ac:std_logic_vector(35 downto 0);
|
|
|
|
|
Line 89... |
Line 84... |
--! Etapa 0 multiplicacion de la mantissa, suma de los exponentes y multiplicación de los signos.
|
--! Etapa 0 multiplicacion de la mantissa, suma de los exponentes y multiplicación de los signos.
|
s1sgr <= s0sga xor s0sgb;
|
s1sgr <= s0sga xor s0sgb;
|
s1ad <= s0ad;
|
s1ad <= s0ad;
|
s1bc <= s0bc;
|
s1bc <= s0bc;
|
s1ac <= s0ac;
|
s1ac <= s0ac;
|
s1exp <= s0exp(7 downto 0);
|
s1exp <= s0exp;
|
|
|
--! Etapa 1 Sumas parciales
|
--! Etapa 1 Sumas parciales
|
s2umu <= s1umu(35 downto 11);
|
s2umu <= s1umu(35 downto 11);
|
s2sgr <= s1sgr;
|
s2sgr <= s1sgr;
|
s2exp <= s1exp;
|
s2exp <= s1exp;
|
Line 122... |
Line 117... |
generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",0,"UNSIGNED","LPM_MULT",18,6,24)
|
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);
|
port map (s0zrs&s0umb(22 downto 6),s0uma(5 downto 0),s0bc);
|
|
|
--! Exponent Addition
|
--! Exponent Addition
|
process (s0sga,s0sgb,s0exa,s0exb)
|
process (s0sga,s0sgb,s0exa,s0exb)
|
variable i8s0exa,i8s0exb: integer range 0 to 255;
|
|
begin
|
begin
|
i8s0exa:=conv_integer(s0exa);
|
|
i8s0exb:=conv_integer(s0exb);
|
if s0exa=x"00" or s0exb=x"00" then
|
if i8s0exa = 0 or i8s0exb = 0 then
|
|
s0exp <= (others => '0');
|
s0exp <= (others => '0');
|
s0zrs <= '0';
|
s0zrs <= '0';
|
else
|
else
|
s0zrs<='1';
|
s0zrs<='1';
|
s0exp <= conv_std_logic_vector(i8s0exb+i8s0exa+129,9);
|
s0exp <= s0exa+s0exb+x"81";
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
--! Etapa 1: Suma parcial de la multiplicacion. Suma del exponente
|
--! Etapa 1: Suma parcial de la multiplicacion. Suma del exponente
|
process(s1ac,s1ad,s1bc)
|
process(s1ac,s1ad,s1bc)
|
Line 146... |
Line 140... |
|
|
|
|
|
|
|
|
|
|
end mul2_arch;
|
|
No newline at end of file
|
No newline at end of file
|
|
end fmul32_arch;
|
No newline at end of file
|
No newline at end of file
|