AMBPEX5_v20_SX50T_CORE
|
00001 --------------------------------------------------------------------------------------------------- 00002 -- 00003 -- Title : cl_chn_v3 00004 -- Author : Ilya Ivanov 00005 -- Company : Instrumental System 00006 -- 00007 -- Version : 3.0 00008 --------------------------------------------------------------------------------------------------- 00009 -- 00010 -- Description : Реализация общих регистров управления, 00011 -- формирование прерывания и запроса DMA 00012 -- Для дешифрации адреса используются только разряды 3..0. 00013 -- Добавлена дешифрация регистров MODE3 и SFLAG 00014 -- 00015 --------------------------------------------------------------------------------------------------- 00016 -- 00017 -- Version 3.1 05.04.2010 00018 -- Добавлены триггеры на сигналы rst, fifo_rst 00019 -- 00020 --------------------------------------------------------------------------------------------------- 00021 00022 library IEEE; 00023 use IEEE.STD_LOGIC_1164.all; 00024 00025 use work.adm2_pkg.all; 00026 00027 package cl_chn_v3_pkg is 00028 00029 component cl_chn_v3 is 00030 generic ( 00031 -- 2 - out - для тетрады вывода 00032 -- 1 - in - для тетрады ввода 00033 chn_type : integer 00034 ); 00035 00036 port( 00037 reset: in std_logic; -- 0 - общий сброс 00038 clk: in std_logic; -- тактовая частота 00039 00040 -- Флаги 00041 cmd_rdy : in std_logic; -- 1 - готовность тетрады 00042 rdy : in std_logic; -- 1 - готовность FIFO 00043 fifo_flag : in bl_fifo_flag; -- флаги FIFO 00044 st9 : in std_logic:='0'; -- Разряды регистры STATUS 00045 st10 : in std_logic:='0'; 00046 st11 : in std_logic:='0'; 00047 st12 : in std_logic:='0'; 00048 st13 : in std_logic:='0'; 00049 st14 : in std_logic:='0'; 00050 st15 : in std_logic:='0'; 00051 00052 -- Тетрада 00053 data_in : in std_logic_vector( 15 downto 0 ); -- шина данных 00054 cmd : in bl_cmd; -- команда 00055 bx_irq : out std_logic; -- 1 - прерывание от тетрады 00056 bx_drq : out bl_drq; -- запрос DMA 00057 00058 status : out std_logic_vector( 15 downto 0 ); -- регистр STATUS 00059 00060 -- Управление 00061 mode0 : out std_logic_vector( 15 downto 0 ); -- регистры тетрады 00062 mode1 : out std_logic_vector( 15 downto 0 ); 00063 mode2 : out std_logic_vector( 15 downto 0 ); 00064 mode3 : out std_logic_vector( 15 downto 0 ); 00065 sflag : out std_logic_vector( 15 downto 0 ); 00066 fdiv : out std_logic_vector( 15 downto 0 ); 00067 fdiv_we : out std_logic; -- 1 - в регистре FDIV новое значение 00068 fmode : out std_logic_vector( 15 downto 0 ); 00069 stmode : out std_logic_vector( 15 downto 0 ); 00070 cnt0 : out std_logic_vector( 15 downto 0 ); 00071 cnt1 : out std_logic_vector( 15 downto 0 ); 00072 cnt2 : out std_logic_vector( 15 downto 0 ); 00073 rst : out std_logic; -- 0 - сброс тетрады 00074 fifo_rst : out std_logic -- 0 - сброс FIFO 00075 ); 00076 end component; 00077 00078 end cl_chn_v3_pkg; 00079 00080 library IEEE; 00081 use IEEE.STD_LOGIC_1164.all; 00082 00083 use work.adm2_pkg.all; 00084 00085 entity cl_chn_v3 is 00086 generic ( 00087 -- 2 - out - для тетрады вывода 00088 -- 1 - in - для тетрады ввода 00089 chn_type : integer 00090 ); 00091 00092 port( 00093 reset: in std_logic; -- 0 - общий сброс 00094 clk: in std_logic; -- тактовая частота 00095 00096 -- Флаги 00097 cmd_rdy : in std_logic; -- 1 - готовность тетрады 00098 rdy : in std_logic; -- 1 - готовность FIFO 00099 fifo_flag : in bl_fifo_flag; -- флаги FIFO 00100 st9 : in std_logic:='0'; -- Разряды регистры STATUS 00101 st10 : in std_logic:='0'; 00102 st11 : in std_logic:='0'; 00103 st12 : in std_logic:='0'; 00104 st13 : in std_logic:='0'; 00105 st14 : in std_logic:='0'; 00106 st15 : in std_logic:='0'; 00107 00108 -- Тетрада 00109 data_in : in std_logic_vector( 15 downto 0 ); -- шина данных 00110 cmd : in bl_cmd; -- команда 00111 bx_irq : out std_logic; -- 1 - прерывание от тетрады 00112 bx_drq : out bl_drq; -- запрос DMA 00113 00114 status : out std_logic_vector( 15 downto 0 ); -- регистр STATUS 00115 00116 -- Управление 00117 mode0 : out std_logic_vector( 15 downto 0 ); -- регистры тетрады 00118 mode1 : out std_logic_vector( 15 downto 0 ); 00119 mode2 : out std_logic_vector( 15 downto 0 ); 00120 mode3 : out std_logic_vector( 15 downto 0 ); 00121 sflag : out std_logic_vector( 15 downto 0 ); 00122 fdiv : out std_logic_vector( 15 downto 0 ); 00123 fdiv_we : out std_logic; -- 1 - в регистре FDIV новое значение 00124 fmode : out std_logic_vector( 15 downto 0 ); 00125 stmode : out std_logic_vector( 15 downto 0 ); 00126 cnt0 : out std_logic_vector( 15 downto 0 ); 00127 cnt1 : out std_logic_vector( 15 downto 0 ); 00128 cnt2 : out std_logic_vector( 15 downto 0 ); 00129 rst : out std_logic; -- 0 - сброс тетрады 00130 fifo_rst : out std_logic -- 0 - сброс FIFO 00131 ); 00132 end cl_chn_v3; 00133 00134 architecture cl_chn_v3 of cl_chn_v3 is 00135 00136 signal c_mode0, c_mode1, c_mode2, c_mode3 : std_logic_vector( 15 downto 0 ); 00137 signal c_mask, c_inv, c_sflag, c_flag, c_irq : std_logic_vector( 15 downto 0 ); 00138 signal c_fmode, c_fdiv, c_stmode, c_cnt0, c_cnt1, c_cnt2: std_logic_vector( 15 downto 0 ); 00139 signal c_status: std_logic_vector( 15 downto 0 ); 00140 signal c_drq_en: std_logic; 00141 signal c_rst: std_logic; -- 0 - сброс тетрады 00142 00143 00144 begin 00145 00146 00147 00148 mode0<=c_mode0; 00149 mode1<=c_mode1; 00150 mode2<=c_mode2; 00151 mode3<=c_mode3; 00152 sflag<=c_sflag; 00153 status<=c_status; 00154 fmode<=c_fmode; 00155 fdiv<=c_fdiv; 00156 stmode<=c_stmode; 00157 cnt0<=c_cnt0; 00158 cnt1<=c_cnt1; 00159 cnt2<=c_cnt2; 00160 00161 00162 pr_mode0: process( reset, clk ) begin 00163 if( reset='0' ) then 00164 c_mode0<=(others=>'0'); 00165 elsif( rising_edge( clk ) ) then 00166 if( cmd.cmd_data_we='1' ) then 00167 if( cmd.adr(9)='0' and cmd.adr(8)='0' ) then 00168 case cmd.adr( 3 downto 0 ) is 00169 when "0000" => c_mode0<=data_in; 00170 when others=>null; 00171 end case; 00172 end if; 00173 end if; 00174 end if; 00175 end process; 00176 00177 00178 pr_reg: process( c_rst, clk ) 00179 variable v: std_logic; 00180 begin 00181 if( c_rst='0' ) then 00182 c_mode1<=(others=>'0'); 00183 c_mode2<=(others=>'0'); 00184 c_mode3<=(others=>'0'); 00185 c_sflag<=(others=>'0'); 00186 c_mask<=(others=>'0'); 00187 c_inv<=(others=>'0'); 00188 c_fmode<=(others=>'0'); 00189 c_fdiv <=(others=>'0'); 00190 c_stmode<=(others=>'0'); 00191 c_cnt0<=(others=>'0'); 00192 c_cnt1<=(others=>'0'); 00193 c_cnt2<=(others=>'0'); 00194 fdiv_we<='0'; 00195 elsif( rising_edge( clk ) ) then 00196 v:='0'; 00197 if( cmd.cmd_data_we='1' ) then 00198 if( cmd.adr(9)='0' and cmd.adr(8)='0' ) then 00199 case cmd.adr( 3 downto 0 ) is 00200 when x"1" => c_mask<=data_in; 00201 when x"2" => c_inv<=data_in; 00202 when x"3" => c_fmode<=data_in; 00203 when x"4" => c_fdiv<=data_in; v:='1'; 00204 when x"5" => c_stmode<=data_in; 00205 when x"6" => c_cnt0<=data_in; 00206 when x"7" => c_cnt1<=data_in; 00207 when x"8" => c_cnt2<=data_in; 00208 when x"9" => c_mode1<=data_in; 00209 when x"a" => c_mode2<=data_in; 00210 when x"b" => c_mode3<=data_in; 00211 when x"c" => c_sflag<=data_in; 00212 when others=>null; 00213 end case; 00214 end if; 00215 end if; 00216 fdiv_we<=v; 00217 end if; 00218 end process; 00219 00220 pr_status: process( clk ) begin 00221 if( rising_edge( clk ) ) then 00222 c_status(0)<=cmd_rdy; 00223 c_status(1)<=rdy; 00224 c_status(2)<=fifo_flag.ef; 00225 c_status(3)<=fifo_flag.pae; 00226 c_status(4)<=fifo_flag.hf; 00227 c_status(5)<=fifo_flag.paf; 00228 c_status(6)<=fifo_flag.ff; 00229 c_status(7)<=fifo_flag.ovr; 00230 c_status(8)<=fifo_flag.und; 00231 c_status(9)<=st9; 00232 c_status(10)<=st10; 00233 c_status(11)<=st11; 00234 c_status(12)<=st12; 00235 c_status(13)<=st13; 00236 c_status(14)<=st14; 00237 c_status(15)<=st15; 00238 end if; 00239 end process; 00240 00241 c_flag<=c_status xor c_inv; 00242 c_irq<= c_flag and c_mask; 00243 00244 pr_irq: process( c_irq, clk ) 00245 variable v: std_logic; 00246 begin 00247 v:='0'; 00248 for i in 0 to 15 loop 00249 v:=v or c_irq( i ); 00250 end loop; 00251 if( rising_edge( clk ) ) then 00252 bx_irq<=v and c_mode0(2); 00253 end if; 00254 end process; 00255 00256 00257 c_rst<=reset and ( not c_mode0(0) ); 00258 rst <= c_rst after 1 ns when rising_edge( clk ); 00259 00260 fifo_rst<=reset and ( not c_mode0(0) ) and ( not c_mode0(1) ) after 1 ns when rising_edge( clk ); 00261 00262 c_drq_en<=c_mode0( 3 ); 00263 00264 bx_drq.en<=c_drq_en; 00265 00266 gen_out: if chn_type=2 generate 00267 00268 pr_bx_drq: process( c_mode0, fifo_flag, c_drq_en, rdy ) 00269 00270 begin 00271 case c_mode0( 13 downto 12 ) is 00272 when "00" => bx_drq.req <= fifo_flag.paf and c_drq_en; -- PAF = 1 00273 when "01" => bx_drq.req <= rdy and c_drq_en; -- RDY = 1 00274 when "10" => bx_drq.req <= fifo_flag.hf and c_drq_en; -- HF = 1 00275 when others => bx_drq.req<='0'; 00276 end case; 00277 end process; 00278 00279 bx_drq.ack <= cmd.data_we and c_drq_en; 00280 00281 end generate; 00282 00283 gen_in: if chn_type=1 generate 00284 00285 pr_bx_drq: process( c_mode0, fifo_flag, c_drq_en, rdy ) 00286 00287 begin 00288 case c_mode0( 13 downto 12 ) is 00289 when "00" => bx_drq.req <= fifo_flag.pae and c_drq_en; -- PAE = 1 00290 when "01" => bx_drq.req <= rdy and c_drq_en; -- RDY = 1 00291 when "10" => bx_drq.req <= ( not fifo_flag.hf ) and c_drq_en; -- HF = 0 00292 when others => bx_drq.req<='0'; 00293 end case; 00294 end process; 00295 00296 bx_drq.ack <= ( not cmd.data_cs ) and c_drq_en; 00297 00298 end generate; 00299 00300 end cl_chn_v3; 00301