DS_DMA
pcie_src/pcie_core64_m1/pcie_ctrl/core64_interrupt.vhd
00001 -------------------------------------------------------------------------------
00002 --
00003 -- Title       : core64_interrupt
00004 -- Author      : Dmitry Smekhov
00005 -- Company     : Instrumental Systems
00006 -- E-mail      : dsmv@insys.ru
00007 --
00008 -- Version     : 1.0
00009 --
00010 -------------------------------------------------------------------------------
00011 --
00012 -- Description : Узел формирования прерываний 
00013 --
00014 -------------------------------------------------------------------------------
00015 
00016 
00017 
00018 library ieee;
00019 use ieee.std_logic_1164.all;  
00020 
00021 package core64_interrupt_pkg is
00022 
00023 component core64_interrupt is
00024         port(
00025         
00026                 rstp                                    : in std_logic;         --! 1 - сброс
00027                 clk                                             : in std_logic;         --! Тактовая частота ядра 250 МГц
00028                 
00029                 irq                                             : in std_logic;         --! 1 - запрос прерывания
00030                 
00031                 cfg_command10                   : in  std_logic;        --! 1 - прерывания запрещены 
00032                 cfg_interrupt                   : out std_logic;        --! 0 - изменение состояния прерывания
00033                 cfg_interrupt_assert    : out std_logic;        --! 0 - формирование прерывания, 1 - сниятие прерывания 
00034                 cfg_interrupt_rdy               : in  std_logic         --! 0 - подтверждение изменения прерывания 
00035         
00036         );
00037 end component;
00038 
00039 end package;
00040 
00041 library ieee;
00042 use ieee.std_logic_1164.all;  
00043 use ieee.std_logic_arith.all;
00044 use ieee.std_logic_unsigned.all;
00045 
00046 entity core64_interrupt is
00047         port(
00048         
00049                 rstp                                    : in std_logic;         --! 1 - сброс
00050                 clk                                             : in std_logic;         --! Тактовая частота ядра 250 МГц
00051                 
00052                 irq                                             : in std_logic;         --! 1 - запрос прерывания
00053                 
00054                 cfg_command10                   : in  std_logic;        --! 1 - прерывания запрещены 
00055                 cfg_interrupt                   : out std_logic;        --! 0 - изменение состояния прерывания
00056                 cfg_interrupt_assert    : out std_logic;        --! 0 - формирование прерывания, 1 - сниятие прерывания 
00057                 cfg_interrupt_rdy               : in  std_logic         --! 0 - подтверждение изменения прерывания 
00058         
00059         );
00060 end core64_interrupt;
00061 
00062 
00063 architecture core64_interrupt of core64_interrupt is
00064 
00065 type stp_type   is ( s0, s1, s2, s3 );
00066 
00067 signal  stp                     : stp_type;
00068 signal  cnt                     : std_logic_vector( 4 downto 0 );
00069 signal  irq_en          : std_logic;
00070 
00071 begin
00072         
00073 pr_irq_en: process( clk ) begin
00074         if( rising_edge( clk ) ) then
00075                 if( rstp='1' or cfg_command10='1' ) then
00076                         irq_en <= '0' after 1 ns;
00077                 else
00078                         irq_en  <= irq after 1 ns;
00079                 end if;
00080         end if;
00081 end process;
00082 
00083 pr_state: process( clk ) begin
00084         if( rising_edge( clk ) ) then
00085                 
00086                 case( stp ) is
00087                         when s0 =>
00088                                 cfg_interrupt_assert <= '0' after 1 ns;
00089                                 cfg_interrupt <= '1' after 1 ns;
00090                                 if( irq_en='1' and cnt(4)='1' ) then
00091                                         stp <= s1 after 1 ns;
00092                                 end if;
00093                                 
00094                         when s1 =>
00095                                 
00096                                 if( cfg_interrupt_rdy='0' ) then
00097                                         cfg_interrupt <= '1' after 1 ns;        
00098                                         stp <= s2 after 1 ns;
00099                                 else
00100                                         cfg_interrupt <= '0' after 1 ns;
00101                                 end if;                         
00102                                 
00103                         when s2 =>
00104                                 cfg_interrupt <= '1' after 1 ns;                
00105                                 cfg_interrupt_assert <= '1' after 1 ns;
00106                                 if( irq_en='0' and cnt(4)='1' ) then
00107                                         stp <= s3 after 1 ns;
00108                                 end if;
00109                                 
00110                         when s3 =>
00111                                 if( cfg_interrupt_rdy='0' ) then
00112                                         cfg_interrupt <= '1' after 1 ns;        
00113                                         stp <= s0 after 1 ns;
00114                                 else
00115                                         cfg_interrupt <= '0' after 1 ns;
00116                                 end if;                         
00117                         
00118                 end case;               
00119                         
00120                 
00121                 
00122                 if( rstp='1' ) then
00123                         stp <= s0 after 1 ns;
00124                 end if;
00125                 
00126         end if;
00127 end process;
00128         
00129 pr_cnt: process( clk ) begin
00130         if( rising_edge( clk ) ) then
00131                 if( rstp='1' or stp=s1 or stp=s3 ) then
00132                         cnt <= "00000" after 1 ns;
00133                 elsif( cnt(4)='0' ) then
00134                         cnt <= cnt + 1 after 1 ns;
00135                 end if;
00136         end if;
00137 end process;
00138         
00139 
00140 end core64_interrupt;