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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp/] [sm.vhd] - Diff between revs 139 and 142

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

Rev 139 Rev 142
Line 26... Line 26...
use ieee.std_logic_unsigned.all;
use ieee.std_logic_unsigned.all;
 
 
 
 
 
 
entity sm is
entity sm is
 
        generic (
 
                width : integer := 32;
 
                widthadmemblock : integer := 9
 
                --!external_readable_widthad :                          
 
        )
        port (
        port (
 
 
                clk,rst:in std_logic;
                clk,rst:in std_logic;
                add0,add1:out std_logic_vector (8 downto 0);
 
                iq:in std_logic_vector(31 downto 0);
 
                read_memory,ird_ack:out std_logic;
 
                ucsa:out std_logic(3 downto 0);
 
                iempty ,  rfull, opq_empty : in std_logic;
 
        );
 
end entity;
 
 
 
architecture sm_arch of sm is
                adda,addb:out std_logic_vector (widthadmemblock-1 downto 0);
 
                sync_chain_d:out std_logic;
 
 
        type macState is (IDLE,EXECUTING,FLUSHING);
                --! Instruction Q, instruction.
        signal state : macState;
                instrQq:in std_logic_vector(width-1 downto 0);
        constant rstMasterValue : std_logic:='0';
 
 
 
 
 
 
 
 
                --! apempty, arithmetical pipeline empty.
 
                arithPbusy, instrQempty ,resultQfull: in std_logic;
 
 
        signal sadd0,sadd1:std_logic_vector (8 downto 0);
                --! DataPath Control uca code.
        signal schunk0o,schunk0f,schunk1o,schunk1f: std_logic_vector (3 downto 0);
                dpc_uca : out std_logic_vector (2 downto 0);
        signal sadd0_now,sadd0_next,sadd0_reg:std_logic_vector(8 downto 0);
 
        signal sadd1_now,sadd1_next,sadd1_reg:std_logic_vector(8 downto 0);
 
        signal sadd0_adder_bit,sadd1_adder_bit,sena:std_logic;
 
 
 
 
 
begin
        );
 
end entity;
 
 
 
architecture sm_arch of sm is
 
 
        schunk0o(3 downto 0) <=  iq(19 downto 16);
        type macState is (FLUSH_TO_NEXT_INSTRUCTION,EXECUTE_INSTRUCTION);
        schunk0f(3 downto 0) <=  iq(15 downto 12);
        signal state : macState;
        schunk1o(3 downto 0) <= iq(11 downto 8);
        constant rstMasterValue : std_logic:='0';
        schunk1f(3 downto 0) <= iq(7 downto 4);
 
 
 
        ucsa <= iq(3 downto 0);
        component customCounter
 
        generic (
 
                width : integer
 
 
 
        );
 
        port (
 
                clk,rst,go,set  : in std_logic;
 
                setValue                : in std_Logic_vector(width-1 downto 0);
 
                count                   : out std_logic_vector(width-1 downto 0)
 
        )
 
 
 
        signal addt0_blocka,addt0_blockb,set_Value_A,set_Value_B : std_logic_vector(widthadmemblock-1 downto 0);
 
        signal add_condition_a, add_condition_b,set_a,set_b : std_logic;
 
        signal s_dpc_uca, s_instrQ_uca : std_logic_vector(2 downto 0);
 
        signal s_block_start_a, s_block_start_b, s_block_end_a, s_block_end_b : std_logic_vector(4 downto 0);
 
 
        sadd0_next <= sadd0_now+sadd0_adder_bit;
 
        sadd1_next <= sadd1_now+sadd1_adder_bit;
 
 
 
 
 
        sm_comb:
 
        process (state)
 
        begin
        begin
                case state is
 
                        when IDLE =>
 
                                sadd0_now <= schunk0o(3 downto 0)&x"0";
 
                                sadd1_now <= schunk1o(3 downto 0)&x"0";
 
                        when others =>
 
                                sadd0_now <= sadd0_next;
 
                                sadd1_now <= sadd1_next;
 
                end case;
 
 
 
        end process;
        --! Bloques asignados
 
        s_block_start_a <= instrQq(width-4 downto width-8);
 
        s_block_start_b <= instrQq(width-14 downto width-18);
 
        s_block_end_a <= instrQq(width-9 downto width-13);
 
        s_block_end_b <= instrQq(width-19 downto width-)
 
 
 
        --! Address Counters
 
        counterA:customCounter
 
        port map (clk,rst,add_condition_a,set_a,instrQq(width-4 downto width-8)&x"0",addt0_blocka);
 
        counterB:customCounter
 
        port map (clk,rst,add_condition_b,set_b,instrQq(width-9 downto width-12)&x"0",addt0_blockb);
 
        adda <= addt0_blocka;
 
        addb <= addt0_blockb;
 
 
 
        --! uca code 
 
        s_instrQ_uca <= instrQq(31 downto 29);
 
 
 
 
        sm_proc:
        sm_proc:
        process (clk,rst)
        process (clk,rst)
        begin
        begin
                if rst=rstMasterValue then
                if rst=rstMasterValue then
                        state <= IDLE;
                        state <= IDLE;
                        ird_ack <= '0';
                        ird_ack <= '0';
                elsif clk='1' and clk'event and sena='1' then
                elsif clk='1' and clk'event then
 
 
                        case state is
                        case state is
                                when IDLE =>
                                when FLUSH_TO_NEXT_INSTRUCTION =>
                                        if rfull='0' and iempty='0' then
 
                                                state <= EXECUTING;
 
                                                read_memory <= '1';
 
                                        end if;
 
                                when EXCUTING =>
 
                                        if rfull='0' then
 
                                                if sadd1_now=schunk1f&"11111" then
 
                                                        if sadd0_now=schunk0f&"11111" then
 
                                                                state <= FLUSHING;
 
 
 
                                                        end if;
                                        --! Chequear si hay una instruccion en la salida de la cola de instruccioens.
                                                end if;
                                        if instrQempty='0' then
                                        end if;
 
                                when FLUSHING =>
                                                --! Chequear si la cola de resultados tiene espacio.
                                        if opq_empty='1' then
                                                if resultQfull='0' then
 
 
 
                                                        --! Si el codigo de instruccion (uca) que se encuentra en el DPC es igual al que se encuentra en la instruccion de la salida de la cola de instrucciones, entonces no hay mas validaciones que hacer. 
 
 
 
 
 
                                                                --! Now check that arithmetic pipline is not busy 
 
                                                                if arithPbusy='0' then
 
 
 
 
 
                                when EXECUTE_INSTRUCTION =>
 
                                        if addt1_blockb(4 downto 0)=x"1f" and addt1_blocka=x"1f" then
 
                                                if addt1_blockb(8 downto )
 
                                        else
 
 
                                        end if;
                                        end if;
                        end case;
                        end case;
                end if;
                end if;
 
 
        end process;
        end process;
 
 
 
        nxtadda_proc:
 
        process ()
end architecture;
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.