DS_DMA
|
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;