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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp/] [memblock.vhd] - Diff between revs 174 and 181

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

Rev 174 Rev 181
Line 38... Line 38...
                instrfifo_rd : in std_logic;
                instrfifo_rd : in std_logic;
                resultfifo_wr: in std_logic_vector(8-1 downto 0);
                resultfifo_wr: in std_logic_vector(8-1 downto 0);
                instrfifo_empty: out std_logic;
                instrfifo_empty: out std_logic;
                ext_rd,ext_wr: in std_logic;
                ext_rd,ext_wr: in std_logic;
                ext_wr_add : in std_logic_vector(4+widthadmemblock-1 downto 0);
                ext_wr_add : in std_logic_vector(4+widthadmemblock-1 downto 0);
                ext_rd_add : in std_logic_vector(2 downto 0);
                ext_rd_add : in std_logic_vector(3 downto 0);
                ext_d: in std_logic_vector(floatwidth-1 downto 0);
                ext_d: in std_logic_vector(floatwidth-1 downto 0);
                resultfifo_full  : out std_logic_vector(3 downto 0);
                resultfifo_full  : out std_logic_vector(3 downto 0);
                int_d : in vectorblock08;
                int_d : in vectorblock08;
 
 
                --!Python
                status_register : in std_logic_vector(3 downto 0);
 
 
                ext_q,instrfifo_q : out std_logic_vector(floatwidth-1 downto 0);
                ext_q,instrfifo_q : out std_logic_vector(floatwidth-1 downto 0);
                int_q : out vectorblock12;
                int_q : out vectorblock12;
                int_rd_add : in std_logic_vector(2*widthadmemblock-1 downto 0);
                int_rd_add : in std_logic_vector(2*widthadmemblock-1 downto 0);
                dpfifo_d : in std_logic_vector(floatwidth*2-1 downto 0);
                dpfifo_d : in std_logic_vector(floatwidth*2-1 downto 0);
                normfifo_d : in std_logic_vector(floatwidth*3-1 downto 0);
                normfifo_d : in std_logic_vector(floatwidth*3-1 downto 0);
Line 70... Line 71...
        --!TBXEND
        --!TBXEND
        --! Señal de soporte
        --! Señal de soporte
        signal s0ext_wr_add_choice      : std_logic_vector(3 downto 0);
        signal s0ext_wr_add_choice      : std_logic_vector(3 downto 0);
 
 
        --!TXBXSTART:MEMBLOCK_EXTERNAL_READ
        --!TXBXSTART:MEMBLOCK_EXTERNAL_READ
        signal s0ext_rd_add                     : std_logic_vector(2 downto 0);
        signal s0status_register        : std_logic_vector(7 downto 0);
 
        signal s0ext_rd_add                     : std_logic_vector(3 downto 0);
        signal s0ext_rd                         : std_logic;
        signal s0ext_rd                         : std_logic;
        signal s0ext_rd_ack                     : std_logic_vector(8-1 downto 0);
        signal s0ext_rd_ack                     : std_logic_vector(8-1 downto 0);
        signal s0ext_q                          : vectorblock08;
        signal s0ext_q                          : vectorblock08;
        --!TBXEND
        --!TBXEND
        --! Señal de soporte
 
        signal s0ext_rd_add_choice      : std_logic_vector(3 downto 0);
 
 
 
 
 
        --!TBXSTART:MEMBLOCK_INTERNAL_READ
        --!TBXSTART:MEMBLOCK_INTERNAL_READ
        signal sint_rd_add                      : vectorblockadd02;
        signal sint_rd_add                      : vectorblockadd02;
        signal s1int_q                          : vectorblock12;
        signal s1int_q                          : vectorblock12;
Line 91... Line 91...
        signal sresultfifo_full         : std_logic_vector(7 downto 0);
        signal sresultfifo_full         : std_logic_vector(7 downto 0);
        --!TBXEND
        --!TBXEND
 
 
begin
begin
 
 
 
 
 
 
 
 
 
 
        --! Colas internas de producto punto, ubicada en el pipe line aritméco. Paralelo a los sumadores a0 y a2.  
        --! Colas internas de producto punto, ubicada en el pipe line aritméco. Paralelo a los sumadores a0 y a2.  
        q0q1 : scfifo --! Debe ir registrada la salida.
        q0q1 : scfifo --! Debe ir registrada la salida.
        generic map (
        generic map (
                add_ram_output_register => "OFF",
                add_ram_output_register => "OFF",
                allow_rwcycle_when_full => "OFF",
                allow_rwcycle_when_full => "OFF",
Line 310... Line 314...
                end case;
                end case;
 
 
        end process;
        end process;
 
 
        --! Decodificación para seleccionar que cola de resultados se conectar´ a la salida del RayTrac. 
        --! Decodificación para seleccionar que cola de resultados se conectar´ a la salida del RayTrac. 
        s0ext_rd_add_choice <= '0'&s0ext_rd_add;
 
        results_block_proc: process(clk,rst)
        results_block_proc: process(clk,rst)
        begin
        begin
                if rst=rstMasterValue then
                if rst=rstMasterValue then
                        s0ext_rd_add    <= (others => '0');
                        s0ext_rd_add    <= (others => '0');
                        s0ext_rd                <= '0';
                        s0ext_rd                <= '0';
                elsif clk'event and clk='1' then
                elsif clk'event and clk='1' then
                        --!Registrar entrada
                        --!Registrar entrada
                        s0ext_rd_add    <= ext_rd_add;
                        s0ext_rd_add    <= ext_rd_add;
                        s0ext_rd                <= ext_rd;
                        s0ext_rd                <= ext_rd;
                        --!Etapa 0: Decodificar la cola que se va a mover (rdack! fifo showahead mode) y por ende leer ese dato.
                        --!Etapa 0: Decodificar la cola que se va a mover (rdack! fifo showahead mode) y por ende leer ese dato.
                        case s0ext_rd_add_choice is
                        case s0ext_rd_add is
                                when x"0" => ext_q <= s0ext_q(0);
                                when x"0" => ext_q <= s0ext_q(0);
                                when x"1" => ext_q <= s0ext_q(1);
                                when x"1" => ext_q <= s0ext_q(1);
                                when x"2" => ext_q <= s0ext_q(2);
                                when x"2" => ext_q <= s0ext_q(2);
                                when x"3" => ext_q <= s0ext_q(3);
                                when x"3" => ext_q <= s0ext_q(3);
                                when x"4" => ext_q <= s0ext_q(4);
                                when x"4" => ext_q <= s0ext_q(4);
                                when x"5" => ext_q <= s0ext_q(5);
                                when x"5" => ext_q <= s0ext_q(5);
                                when x"6" => ext_q <= s0ext_q(6);
                                when x"6" => ext_q <= s0ext_q(6);
                                when others => ext_q <= s0ext_q(7);
                                when x"7" => ext_q <= s0ext_q(7);
 
                                when others => ext_q <= x"000000"&s0status_register;
                        end case;
                        end case;
                end if;
                end if;
        end process;
        end process;
 
 
        --! rdack decoder para las colas de resultados de salida.
        --! rdack decoder para las colas de resultados de salida.
        results_block_proc_combinatorial_stage: process(s0ext_rd,s0ext_rd_add_choice)
        results_block_proc_combinatorial_stage: process(s0ext_rd,s0ext_rd_add)
        begin
        begin
                case s0ext_rd_add_choice is
                case s0ext_rd_add(3 downto 0) is
                        when x"0" => s0ext_rd_ack <= x"0"&"000"&s0ext_rd;
                        when x"0" => s0ext_rd_ack <= x"0"&"000"&s0ext_rd;
                        when x"1" => s0ext_rd_ack <= x"0"&"00"&s0ext_rd&'0';
                        when x"1" => s0ext_rd_ack <= x"0"&"00"&s0ext_rd&'0';
                        when x"2" => s0ext_rd_ack <= x"0"&"0"&s0ext_rd&"00";
                        when x"2" => s0ext_rd_ack <= x"0"&"0"&s0ext_rd&"00";
                        when x"3" => s0ext_rd_ack <= x"0"&s0ext_rd&"000";
                        when x"3" => s0ext_rd_ack <= x"0"&s0ext_rd&"000";
                        when x"4" => s0ext_rd_ack <= "000"&s0ext_rd&x"0";
                        when x"4" => s0ext_rd_ack <= "000"&s0ext_rd&x"0";
                        when x"5" => s0ext_rd_ack <= "00"&s0ext_rd&'0'&x"0";
                        when x"5" => s0ext_rd_ack <= "00"&s0ext_rd&'0'&x"0";
                        when x"6" => s0ext_rd_ack <= "0"&s0ext_rd&"00"&x"0";
                        when x"6" => s0ext_rd_ack <= "0"&s0ext_rd&"00"&x"0";
                        when others => s0ext_rd_ack <= s0ext_rd&"000"&x"0";
                        when x"7" => s0ext_rd_ack <= s0ext_rd&"000"&x"0";
 
                        when others => s0ext_rd_ack <= (others => '0');
                end case;
                end case;
        end process;
        end process;
 
 
 
        --!Proceso para escribir el status register.
 
 
 
        --!Independiente del valor rfull(i) o si se lee o no, los bits correspondientes a los eventos de cola de resultados llena, se escriben reloj a reloj.
 
        --!Final de Instrucci&oacute;n: Si ocurre un evento de final de instrucci&oacute;n se escribe el bit de registro correspondiente. 
 
        --!Si no hay un evento de final de instrucci&oacute;n entonces se verifica si hay un evento de lectura del status register, si es asi todos los bits correspondientes dentro del registro al evento de fin de instrucci&oacute;n se borran y quedan en cero.
 
        --!Si no hay un evento de final de instrucci&oacite;n y tampoco de lectura del status register entonces se deja el mismo valor del estatus register.
 
        sreg_proc: process (clk,rst,s0ext_rd_add,status_register(3 downto 0))
 
        begin
 
                if rst=rstMasterValue then
 
                        s0status_register(7 downto 0) <= (others => '0');
 
                elsif clk'event and clk='1' then
 
 
 
                        --!Sin importar el valor de las se&ntilde;ales de cola de resultados llena, escribir el registro.
 
                        s0status_register(7) <= sresultfifo_full(7) or sresultfifo_full(6) or sresultfifo_full(5);
 
                        s0status_register(6) <= sresultfifo_full(4) or sresultfifo_full(2);
 
                        s0status_register(5) <= sresultfifo_full(3) or sresultfifo_full(2) or sresultfifo_full(1);
 
                        s0status_register(4) <= sresultfifo_full(0);
 
 
 
                        for i in 3 downto 0 loop
 
                                --! Si hay evento de fin de instrucci&oacute;n entonces escribir en el bit correspondiente un uno.
 
                                if status_register(i)='1' then
 
                                        s0status_register(i) <= '1';
 
                                --! Como no hubo final de instrucci&oacute;n revisar si hay lectura de Status Register y borrarlo.
 
                                elsif s0ext_rd_add(3)='1' then
 
                                        s0status_register(i) <= '0';
 
                                --! No ocurrio nada de lo anterior, dejar entonces en el mismo valor el Status Register.
 
                                else
 
                                        s0status_register(i) <= s0status_register(i);
 
                                end if;
 
                        end loop;
 
                end if;
 
        end 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.