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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [uf.vhd] - Diff between revs 3 and 8

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

Rev 3 Rev 8
Line 1... Line 1...
 
-- RAYTRAC
 
-- Author Julian Andres Guarin
 
-- uf.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;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use work.arithpack.all;
use work.arithpack.all;
 
 
-- 
 
 
 
 
 
entity uf is
entity uf is
        port (
        port (
                opcode          : in std_logic;
                opcode          : in std_logic;
                v0,v1,v2,v3     : in std_logic_vector (6*18-1 downto 0);
                m0f0,m0f1,m1f0m1f1,m2f0,m2f1,m3f0,m3f1,m4f0,m4f1,m5f0,m5f1 : in std_logic_vector(17 downto 0);
                cp
                cpx,cpy,cpz,dp0,dp1 : out std_logic_vector(31 downto 0)
 
                clk,rst         : in std_logic
                clk,rst, ena : in std_logic
 
        );
        );
end uf;
end uf;
 
 
architecture uf_arch of uf is
architecture uf_arch of uf is
 
 
        s_prod          : signal
        -- Stage 0 signals
 
 
 
        signal s0mf00,s0mf01,s0mf10,s0mf11,s0mf20,s0mf21,s0mf30,s0mf31,s0mf40,s0mf41,s0mf50,s0mf51 : std_logic_vector(17 downto 0);
 
        signal s0p0,s0p1, s0p2, s0p3, s0p4, s0p5 : std_logic_vector(31 downto 0);
 
        signal s0opcode;
 
 
 
        --Stage 1 signals 
 
 
        s0_opcode : signal std_logic;
        signal s1p0, s1p1, s1p2, s1p3, s1p4, s1p5 : std_logic_vector (31 downto 0);
 
        signal s1a0, s1a1, s1a2 : std_logic_vector (31 downto 0);
 
        signal s1opcode;
 
 
        s1_opcode: signal std_logic;
        -- Some support signals
 
        signal s1_internalCarry : std_logic_vector(2 downto 0);
 
        signal s2_internalCarry : std_logic_vector(1 downto 0);
 
 
        s2_opcode : signal std_logic;
        --Stage 2 signals
        s2_prod0,s2_prod1,s2_prod2,s2_prod3,s2_prod4,s2_prod5,s2_sum0,s2_sum1,s2_sum2 : signal std_logic_vector (31 downto 0);
 
 
        signal s2a0, s2a2, s2a3, s2a4, s2p2, s2p3 : std_logic_vector (31 downto 0);
 
 
        s3_sum04,s3_sum25,s3_prod2,s3_prod3,s3_sum4,s3_sum5 : signal std_logic_vector ( 31 downto 0);
 
 
 
 
 
begin
begin
 
 
 
        -- Multiplicator Instantiation (StAgE 0)
 
 
        mx : for i in 0 to 5 generate
        m0 : r_a18_b18_smul_sc32_r
                mi : r_a18_b18_smul_c32_r port map (
        port map (
 
                aclr    => rst,
 
                clock   => clk,
 
                dataa   => s0mf00,
 
                datab   => s0mf01,
 
                result  => s0p0
 
        );
 
        m1 : r_a18_b18_smul_sc32_r
 
        port map (
 
                aclr    => rst,
 
                clock   => clk,
 
                dataa   => s0mf10,
 
                datab   => s0mf11,
 
                result  => s0p1
 
        );
 
        m2 : r_a18_b18_smul_sc32_r
 
        port map (
 
                aclr    => rst,
 
                clock   => clk,
 
                dataa   => s0mf20,
 
                datab   => s0mf21,
 
                result  => s0p2
 
        );
 
        m3 : r_a18_b18_smul_sc32_r
 
        port map (
                        aclr    => rst,
                        aclr    => rst,
                        clock   => clk,
                        clock   => clk,
                        dataa   => v0 (i*18+17 downto i*18);
                dataa   => s0mf30,
                        datab   => v1 (i*18+17 downto i*18);
                datab   => s0mf31,
 
                result  => s0p3
 
        );
 
        m4 : r_a18_b18_smul_sc32_r
 
        port map (
 
                aclr    => rst,
 
                clock   => clk,
 
                dataa   => s0mf40,
 
                datab   => s0mf41,
 
                result  => s0p4
 
        );
 
        m5 : r_a18_b18_smul_sc32_r
 
        port map (
 
                aclr    => rst,
 
                clock   => clk,
 
                dataa   => s0mf50,
 
                datab   => s0mf51,
 
                result  => s0p5
 
        );
 
 
 
        -- Adder Instantiation (sTaGe 1)
 
 
 
        --Adder 0, low adder 
 
        a0low : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "YES"        --Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
 
        )
 
        port map        (
 
                a => s1p0(15 downto 0),
 
                b => s1p1(15 downto 0),
 
                s => s1opcode,
 
                ci => '0',
 
                result => s1a0(15 downto 0),
 
                cout => s1_internalCarry(0)
 
        );
 
        --Adder 0, high adder
 
        a0high : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "YES"        --Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
 
        )
 
        port map        (
 
                a => s1p0(31 downto 16),
 
                b => s1p1(31 downto 16),
 
                s => s1opcode,
 
                ci => s1_internalCarry(0),
 
                result => s1a0(31 downto 16),
 
                cout => open
 
        );
 
        --Adder 1, low adder 
 
        a1low : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "YES"        --Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
 
        )
 
        port map        (
 
                a => s1p2(15 downto 0),
 
                b => s1p3(15 downto 0),
 
                s => s1opcode,
 
                ci => '0',
 
                result => s1a1(15 downto 0),
 
                cout => s1_internalCarry(1)
 
        );
 
        --Adder 1, high adder
 
        a1high : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "YES"        --Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
 
        )
 
        port map        (
 
                a => s1p2(31 downto 16),
 
                b => s1p3(31 downto 16),
 
                s => s1opcode,
 
                ci => s1_internalCarry(1),
 
                result => s1a1(31 downto 16),
 
                cout => open
 
        );
 
        --Adder 2, low adder 
 
        a1low : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "YES"        --Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
 
        )
 
        port map        (
 
                a => s1p4(15 downto 0),
 
                b => s1p5(15 downto 0),
 
                s => s1opcode,
 
                ci => '0',
 
                result => s1a2(15 downto 0),
 
                cout => s1_internalCarry(2)
 
        );
 
        --Adder 2, high adder
 
        a1high : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "YES"        --Yes instantiate Xor gates stage in the adder so we can substract on the opcode signal command.
 
        )
 
        port map        (
 
                a => s1p4(31 downto 16),
 
                b => s1p5(31 downto 16),
 
                s => s1opcode,
 
                ci => s1_internalCarry(2),
 
                result => s1a2(31 downto 16),
 
                cout => open
 
        );
 
 
 
 
 
        -- Adder Instantiation (Stage 2)
 
        --Adder 3, low adder 
 
        a3low : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "NO"         --No Just Add.
 
        )
 
        port map        (
 
                a => s2a0(15 downto 0),
 
                b => s2p2(15 downto 0),
 
                s => open,
 
                ci => '0',
 
                result => s2a3(15 downto 0),
 
                cout => s2_internalCarry(0)
 
        );
 
        --Adder 3, high adder
 
        a3high : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "NO"         --No Just Add.
 
        )
 
        port map        (
 
                a => s2a0(31 downto 16),
 
                b => s2p2(31 downto 16),
 
                s => open,
 
                ci => s2_internalCarry(0),
 
                result => s2a3(31 downto 16),
 
                cout => open
 
        );
 
        --Adder 4, low adder 
 
        a4low : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "NO"         --No Just Add.
 
        )
 
        port map        (
 
                a => s2p3(15 downto 0),
 
                b => s2a2(15 downto 0),
 
                s => open,
 
                ci => '0',
 
                result => s2a4(15 downto 0),
 
                cout => s2_internalCarry(1)
 
        );
 
        --Adder 4, high adder
 
        a4high : adder
 
        generic map (
 
                w => 16,
 
                carry_logic             => "CLA",       --Carry Look Ahead Logic (More Gates Used, But Less Time)
 
                subtractor_selector     => "NO"         --No Just Add.
 
        )
 
        port map        (
 
                a => s2p3(31 downto 16),
 
                b => s2a2(31 downto 16),
 
                s => open,
 
                ci => s2_internalCarry(1),
 
                result => s2a4(31 downto 16),
 
                cout => open
 
        );
 
 
 
        -- Incoming from opcoder.vhd signals into pipeline's stage 0.
 
        s0mf00 <= m0f0;
 
        s0mf01 <= m0f1;
 
        s0mf10 <= m1f0;
 
        s0mf11 <= m1f1;
 
        s0mf20 <= m2f0;
 
        s0mf21 <= m2f1;
 
        s0mf30 <= m3f0;
 
        s0mf31 <= m3f1;
 
        s0mf40 <= m4f0;
 
        s0mf41 <= m4f1;
 
        s0mf50 <= m5f0;
 
        s0mf51 <= m5f1;
 
 
 
        -- Signal sequencing: as the multipliers use registered output and registered input is not necessary to write the sequence of stage 0 signals to stage 1 signals.
 
        -- so the simplistic path is taken: simply connect stage 0 to stage 1 lines. However this would not apply for the opcode signal
 
        s1p0 <= s0p0;
 
        s1p1 <= s0p1;
 
        s1p2 <= s0p2;
 
        s1p3 <= s0p3;
 
        s1p4 <= s0p4;
 
        s1p5 <= s0p5;
 
 
 
 
 
        --Outcoming to the rest of the system (by the time i wrote this i dont know where this leads to... jeje)
 
        cpx <= s1a0;
 
        cpy <= s1a1;
 
        cpz <= s1a2;
 
        dp0 <= s2a3;
 
        dp1 <= s2a4;
 
 
 
        -- Looking into the design the stage 1 to stage 2 are the sequences pipe stages that must be controlled in this particular HDL.
 
        uf_seq: process (clk,rst)
 
        begin
 
 
 
                if rst=rstMasterValue then
 
                        s0opcode        <= (others => '0');
 
                        s1opcode        <= (others => '0');
 
 
 
                        s2a2 <= (others => '0');
 
                        s2p3 <= (others => '0');
 
                        s2p2 <= (others => '0');
 
                        s2a0 <= (others => '0');
 
 
 
                elsif clk'event and clk = '1' then
 
 
 
                        s2a2 <= s1a2;
 
                        s2p3 <= s1p3;
 
                        s2p2 <= s1p2;
 
                        s2a0 <= s1a0;
 
 
 
                        -- Opcode control sequence
 
                        s0opcode <= opcode;
 
                        s1opcode <= s0opcode;
 
 
 
                end if;
 
        end process uf_seq;
end uf_arch;
end uf_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.