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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp/] [sm.vhd] - Diff between revs 150 and 151

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

Rev 150 Rev 151
Line 23... Line 23...
 
 
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_unsigned.all;
 
 
 
use work.arithpack.all;
 
 
entity sm is
entity sm is
        generic (
        generic (
                width : integer := 32;
                width : integer := 32;
                widthadmemblock : integer := 9
                widthadmemblock : integer := 9
Line 51... Line 51...
 
 
 
 
                --! End Of Instruction Event
                --! End Of Instruction Event
                eoi     : out std_logic;
                eoi     : out std_logic;
 
 
 
                --! State Exposed for testbench purposes.
 
                state : out macState;
 
 
                --! DataPath Control uca code.
                --! DataPath Control uca code.
                dpc_uca : out std_logic_vector (2 downto 0)
                dpc_uca : out std_logic_vector (2 downto 0)
 
 
 
 
        );
        );
end entity;
end entity;
 
 
architecture sm_arch of sm is
architecture sm_arch of sm is
 
 
        type macState is (LOAD_INSTRUCTION,FLUSH_ARITH_PIPELINE,EXECUTE_INSTRUCTION);
 
        --! LOAD_INSTRUCTION: Estado en el que se espera que en la cola de instrucciones haya una instrucción para ejecutar.
        --! LOAD_INSTRUCTION: Estado en el que se espera que en la cola de instrucciones haya una instrucción para ejecutar.
        --! EXECUTE_INSTRUCTION: Estado en el que se ejecuta la instrucción de la cola de instrucciones.
        --! EXECUTE_INSTRUCTION: Estado en el que se ejecuta la instrucción de la cola de instrucciones.
        --! FLUSH_ARITH_PIPELINE: Estado en el que se espera un número específico de ciclos de reloj, para que se desocupe el pipeline aritmético.
        --! FLUSH_ARITH_PIPELINE: Estado en el que se espera un número específico de ciclos de reloj, para que se desocupe el pipeline aritmético.
 
 
        signal state : macState;
        signal s_state : macState;
        constant rstMasterValue : std_logic:='0';
 
 
 
        component customCounter
 
        generic (
 
                EOBFLAG         : string ;
 
                ZEROFLAG        : string ;
 
                BACKWARDS       : string ;
 
                EQUALFLAG       : string ;
 
                subwidth        : integer;
 
                width           : integer
 
 
 
        );
 
        port (
 
                clk,rst,go,set  : in std_logic;
 
                setValue,cmpBlockValue          : in std_Logic_vector(width-1 downto subwidth);
 
                zero_flag,eob_flag,eq_flag      : out std_logic;
 
                count                   : out std_logic_vector(width-1 downto 0)
 
        );
 
        end component;
 
 
 
        signal s_instr_uca:     std_logic_vector(2 downto 0);
        signal s_instr_uca:     std_logic_vector(2 downto 0);
        signal s_dpc_uca:               std_logic_vector(2 downto 0);
        signal s_dpc_uca:               std_logic_vector(2 downto 0);
        signal s_block_start_a: std_logic_vector(4 downto 0);
        signal s_block_start_a: std_logic_vector(4 downto 0);
        signal s_block_start_b: std_logic_vector(4 downto 0);
        signal s_block_start_b: std_logic_vector(4 downto 0);
Line 105... Line 91...
        signal s_zeroFlag_delay:std_logic;                                              --! Bandera de cero del contador delay. 
        signal s_zeroFlag_delay:std_logic;                                              --! Bandera de cero del contador delay. 
        signal s_eq_b,s_eq_a:   std_logic;      --! Indica cuando se está leyendo el último bloque de memoria con operandos de entrada de a y de b respectivamente. 
        signal s_eq_b,s_eq_a:   std_logic;      --! Indica cuando se está leyendo el último bloque de memoria con operandos de entrada de a y de b respectivamente. 
        signal s_eb_b,s_eb_a:   std_logic;      --! Indica que se está leyendo en memoria el último operando del bloque actual, b o a, respectivamente.
        signal s_eb_b,s_eb_a:   std_logic;      --! Indica que se está leyendo en memoria el último operando del bloque actual, b o a, respectivamente.
 
 
begin
begin
 
 
 
        state <= s_state;
 
 
        --! Código UCA, pero en la etapa DPC: La diferencia es que UCA en la etapa DPC, decodifica el datapath dentro del pipeline aritmético.
        --! Código UCA, pero en la etapa DPC: La diferencia es que UCA en la etapa DPC, decodifica el datapath dentro del pipeline aritmético.
        dpc_uca <= s_dpc_uca;
        dpc_uca <= s_dpc_uca;
 
 
 
 
        --! Bloques asignados en la instrucci´øn
        --! Bloques asignados en la instrucci´øn
Line 138... Line 127...
        generic map("NO","YES","YES","NO",0,5)
        generic map("NO","YES","YES","NO",0,5)
        port map (clk,rst,s_go_delay,s_set_dly,s_delay_field(4 downto 0),"00000",s_zeroFlag_delay,open,open,open);
        port map (clk,rst,s_go_delay,s_set_dly,s_delay_field(4 downto 0),"00000",s_zeroFlag_delay,open,open,open);
 
 
 
 
        sm_comb:
        sm_comb:
        process (state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
        process (s_state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
        begin
        begin
                --!Se&ntilde;al de play/pause del contador de direcciones para el par&aacute;metro B/D.
                --!Se&ntilde;al de play/pause del contador de direcciones para el par&aacute;metro B/D.
                s_go_b <= not(full_r and s_eb_b);
                s_go_b <= not(full_r and s_eb_b);
 
 
                --!Se&ntilde;al de play/pause del contador de direcciones para el par&aacute;metro A/C.
                --!Se&ntilde;al de play/pause del contador de direcciones para el par&aacute;metro A/C.
Line 155... Line 144...
 
 
                --!Se&ntilde;al de play/pause del contador del arithmetic pipeline flush counter.
                --!Se&ntilde;al de play/pause del contador del arithmetic pipeline flush counter.
                s_go_delay  <= not(s_zeroFlag_delay);
                s_go_delay  <= not(s_zeroFlag_delay);
 
 
                --! Si estamos en el final de la instrucción, "descargamos" esta de la máquina de estados con acknowledge read.
                --! Si estamos en el final de la instrucción, "descargamos" esta de la máquina de estados con acknowledge read.
                if s_eb_b='1' and s_eq_b='1' and s_eb_a='1' and s_eq_a='1' and state=EXECUTE_INSTRUCTION then
                if s_eb_b='1' and s_eq_b='1' and s_eb_a='1' and s_eq_a='1' and s_state=EXECUTE_INSTRUCTION then
                        instrRdAckd <= '1';
                        instrRdAckd <= '1';
                else
                else
                        instrRdAckd <= '0';
                        instrRdAckd <= '0';
                end if;
                end if;
 
 
                if (s_eb_a='1' and s_eq_a='1') or state=LOAD_INSTRUCTION or state=FLUSH_ARITH_PIPELINE then
                if (s_eb_a='1' and s_eq_a='1') or s_state=LOAD_INSTRUCTION or s_state=FLUSH_ARITH_PIPELINE then
                        s_set_a <= '1';
                        s_set_a <= '1';
                else
                else
                        s_set_a <= '0';
                        s_set_a <= '0';
                end if;
                end if;
 
 
 
 
 
 
                if (s_eb_b='1' and s_eq_b='1') or state=LOAD_INSTRUCTION or state=FLUSH_ARITH_PIPELINE then
                if (s_eb_b='1' and s_eq_b='1') or s_state=LOAD_INSTRUCTION or s_state=FLUSH_ARITH_PIPELINE then
                        s_set_b <= '1';
                        s_set_b <= '1';
                else
                else
                        s_set_b <= '0';
                        s_set_b <= '0';
                end if;
                end if;
 
 
        end process;
        end process;
 
 
        sm_proc:
        sm_proc:
        process (clk,rst,state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
        process (clk,rst,s_state, full_r,s_eb_b,s_combinatory,s_zeroFlag_delay,s_eq_b,s_eb_a,s_eq_a,instrQ_empty)
        begin
        begin
 
 
                if rst=rstMasterValue then
                if rst=rstMasterValue then
 
 
                        state <= LOAD_INSTRUCTION;
                        s_state <= LOAD_INSTRUCTION;
                        s_set_dly <= '1';
                        s_set_dly <= '1';
                        sync_chain_0 <= '0';
                        sync_chain_0 <= '0';
                        eoi<='0';
                        eoi<='0';
                        s_dpc_uca <= (others => '0');
                        s_dpc_uca <= (others => '0');
 
 
 
 
                elsif clk='1' and clk'event then
                elsif clk='1' and clk'event then
 
 
                        case state is
                        case s_state is
 
 
                                --! Cargar la siguiente instrucción. 
                                --! Cargar la siguiente instrucción. 
                                when LOAD_INSTRUCTION =>
                                when LOAD_INSTRUCTION =>
 
 
                                        eoi <= '0';
                                        eoi <= '0';
 
 
                                        if instrQ_empty='0' and full_r='0' then
                                        if instrQ_empty='0' and full_r='0' then
 
 
                                                --! Siguiente estado: Ejecutar la instrucción.  
                                                --! Siguiente estado: Ejecutar la instrucción.  
                                                state <= EXECUTE_INSTRUCTION;
                                                s_state <= EXECUTE_INSTRUCTION;
 
 
                                                --! Asignar el código UCA para que comience la decodificación.
                                                --! Asignar el código UCA para que comience la decodificación.
                                                s_dpc_uca <= s_instr_uca;
                                                s_dpc_uca <= s_instr_uca;
 
 
                                                --! Validar el siguiente dato dentro del pipeline aritmético.
                                                --! Validar el siguiente dato dentro del pipeline aritmético.
Line 231... Line 220...
 
 
                                                if s_zeroFlag_delay='1' then
                                                if s_zeroFlag_delay='1' then
 
 
                                                        --! Notificar fin de procesamiento de la instruccion (End Of Instruction)
                                                        --! Notificar fin de procesamiento de la instruccion (End Of Instruction)
                                                        eoi <= '1';
                                                        eoi <= '1';
                                                        state <= LOAD_INSTRUCTION;
                                                        s_state <= LOAD_INSTRUCTION;
                                                        s_set_dly <= '1';
                                                        s_set_dly <= '1';
 
 
 
 
                                                else
                                                else
 
 
                                                        state <= FLUSH_ARITH_PIPELINE;
                                                        s_state <= FLUSH_ARITH_PIPELINE;
                                                        s_set_dly <= '0';
                                                        s_set_dly <= '0';
 
 
                                                end if;
                                                end if;
 
 
                                        --! Invalidar/validar datos dentro del pipeline aritmético.
                                        --! Invalidar/validar datos dentro del pipeline aritmético.
Line 257... Line 246...
                                        --! Este estado permanece así hasta que, haya una instrucción 
                                        --! Este estado permanece así hasta que, haya una instrucción 
                                        if s_zeroFlag_delay='1' then
                                        if s_zeroFlag_delay='1' then
 
 
                                                --! Notificar fin de procesamiento de la instruccion (End Of Instruction)
                                                --! Notificar fin de procesamiento de la instruccion (End Of Instruction)
                                                eoi <= '1';
                                                eoi <= '1';
                                                state <= LOAD_INSTRUCTION;
                                                s_state <= LOAD_INSTRUCTION;
                                                s_set_dly <= '1';
                                                s_set_dly <= '1';
 
 
                                        end if;
                                        end if;
 
 
                                when others => null;
                                when others => null;

powered by: WebSVN 2.1.0

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