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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp/] [im.vhd] - Blame information for rev 219

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 147 jguarin200
--! @file im.vhd
2
--! @brief Maquina de Interrupciones. Circuito que detecta eventos que generan interrupciones para que el usuario externo del RayTrac detecte eventos como el final de una instrucción.  
3
--! @author Julián Andrés Guarín Reyes
4
--------------------------------------------------------------
5
-- RAYTRAC
6
-- Author Julian Andres Guarin
7
-- sm.vhd
8
-- This file is part of raytrac.
9
-- 
10
--     raytrac is free software: you can redistribute it and/or modify
11
--     it under the terms of the GNU General Public License as published by
12
--     the Free Software Foundation, either version 3 of the License, or
13
--     (at your option) any later version.
14
-- 
15
--     raytrac is distributed in the hope that it will be useful,
16
--     but WITHOUT ANY WARRANTY; without even the implied warranty of
17
--     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
--     GNU General Public License for more details.
19
-- 
20
--     You should have received a copy of the GNU General Public License
21
--     along with raytrac.  If not, see <http://www.gnu.org/licenses/>.
22
 
23
--! 
24
 
25
library ieee;
26
use ieee.std_logic_1164.all;
27
use ieee.std_logic_unsigned.all;
28 151 jguarin200
use work.arithpack.all;
29 147 jguarin200
entity im is
30
        generic (
31
                num_events : integer :=4;
32
                cycles_to_wait : integer := 1023
33
        );
34
        port (
35
                clk,rst:                in std_logic;
36 181 jguarin200
                rfull_event:    in std_logic;
37
                eoi_event:              in std_logic;   --! end of instruction related events
38
                int:                    out std_logic;  --! interruption
39 151 jguarin200
                state:                  out iCtrlState
40 147 jguarin200
 
41
        );
42
end entity;
43
 
44
architecture im_arch of im is
45
 
46 151 jguarin200
 
47
        signal s_state : iCtrlState;
48
 
49 147 jguarin200
 
50
begin
51 151 jguarin200
        state <= s_state;
52
 
53 181 jguarin200
        --! Existen 2 estados para disparar la se&ntilde;al de interrupci&oacute;n : WAITING_FOR_A_RFULL_EVENT y INHIBIT_RFULL_INT. Siempre que haya el final de una instrucci&oacute;n en cualquiera de los dos estados se notificar&aacute; el evento sin importar el estado en que se encuentre la m&aacute;quina.
54
        --! Si cualquiera de las se&ntilde;ales de cola llena se encuentra activa, el evento ser&aacute; notificado en el estado WAITING_FOR_A_RFULL_EVENT, inmediatamente se cambia al estado INHIBIT_RFULL_INT, donde durante un n&uacte;mero de ciclos (parametrizado) se ignora la se&ntilde;al de full de las colas de resultados.
55
        --! Despues que han transcurrido los ciclos mencionados, se vuelve al estado WAITING_FOR_A_RFULL_EVENT.
56 147 jguarin200
        sm_proc:
57 181 jguarin200
        process (clk,rst)
58 147 jguarin200
                variable tempo : integer range 0 to cycles_to_wait:=cycles_to_wait;
59
        begin
60
                if rst=rstMasterValue then
61
                        tempo := cycles_to_wait;
62 181 jguarin200
                        int <= '0';
63 147 jguarin200
                elsif clk'event and clk='1' then
64 181 jguarin200
 
65
                        case s_state is
66
                                when WAITING_FOR_A_RFULL_EVENT =>
67 147 jguarin200
 
68 181 jguarin200
                                        int <= rfull_event or eoi_event;
69
                                        if rfull_event='1' then
70
                                                s_state <= INHIBIT_RFULL_INT;
71
 
72 147 jguarin200
                                        end if;
73 181 jguarin200
 
74
                                when INHIBIT_RFULL_INT =>
75
 
76
                                        int <= eoi_event;
77 147 jguarin200
                                        if tempo=0 then
78 181 jguarin200
                                                s_state <= WAITING_FOR_A_RFULL_EVENT;
79
                                                tempo := cycles_to_wait;
80 147 jguarin200
                                        else
81
                                                tempo:=tempo-1;
82
                                        end if;
83
                                when others => null;
84
                        end case;
85
                end if;
86
        end process;
87
end architecture;
88
 
89
 

powered by: WebSVN 2.1.0

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