AMBPEX5_v20_SX50T_CORE
|
00001 --------------------------------------------------------------------------------------------------- 00002 -- 00003 -- Title : trd_test_ctrl_m1 00004 -- Author : Ilya Ivanov 00005 -- Company : Instrumental System 00006 -- 00007 -- Version : 1.3 00008 -------------------------------------------------------------------------------------------------- 00009 -- 00010 -- Description : Приём цифрового потока 00011 -- 00012 --------------------------------------------------------------------------------------------------- 00013 -- 00014 -- Version 1.3 11.06.2008 00015 -- Добавлена возможность измерения тактовой частоты 00016 -- 00017 --------------------------------------------------------------------------------------------------- 00018 -- 00019 -- Version 1.2 17.07.2007 00020 -- Добавлены выходы регистров MODE0, MODE1, MODE2, MODE3 00021 -- Добавлен выход счётчика слов 00022 -- 00023 --------------------------------------------------------------------------------------------------- 00024 -- 00025 -- Version 1.1 18.08.2006 00026 -- Используется FIFO cl_fifo1024x64_v2 00027 -- 00028 --------------------------------------------------------------------------------------------------- 00029 00030 library ieee; 00031 use ieee.std_logic_1164.all; 00032 00033 00034 00035 00036 00037 library work; 00038 use work.cl_chn_v3_pkg.all; 00039 use work.adm2_pkg.all; 00040 00041 package trd_test_ctrl_m1_pkg is 00042 00043 constant ID_TEST : std_logic_vector( 15 downto 0 ):=x"004F"; -- идентификатор тетрады 00044 constant ID_MODE_TEST : std_logic_vector( 15 downto 0 ):=x"0001"; -- модификатор тетрады 00045 constant VER_TEST : std_logic_vector( 15 downto 0 ):=x"0103"; -- версия тетрады 00046 constant RES_TEST : std_logic_vector( 15 downto 0 ):=x"0000"; -- ресурсы тетрады 00047 constant FIFO_TEST : std_logic_vector( 15 downto 0 ):=x"0000"; -- размер FIFO 00048 constant FTYPE_TEST : std_logic_vector( 15 downto 0 ):=x"0000"; -- ширина FIFO 00049 00050 component trd_test_ctrl_m1 is 00051 generic( 00052 SystemFreq : integer:= 500 -- значение системной тактовой частоты 00053 ); 00054 port( 00055 -- GLOBAL 00056 reset : in std_logic; -- 0 - сброс 00057 clk : in std_logic; -- тактовая частота 00058 00059 -- Управление тетрадой 00060 cmd_data_in : in std_logic_vector( 15 downto 0 ); -- шина данных CMD_DATA 00061 cmd : in bl_cmd; -- сигналы управления 00062 00063 cmd_data_out : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход через буфер 00064 cmd_data_out2 : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход без буфера 00065 00066 bx_irq : out std_logic; -- 1 - прерывание от тетрады 00067 bx_drq : out bl_drq; -- управление DMA 00068 00069 mode0 : out std_logic_vector( 15 downto 0 ); -- регистр MODE0 00070 mode1 : out std_logic_vector( 15 downto 0 ); -- регистр MODE1 00071 mode2 : out std_logic_vector( 15 downto 0 ); -- регистр MODE2 00072 mode3 : out std_logic_vector( 15 downto 0 ); -- регистр MODE3 00073 00074 ---- DIO_IN ---- 00075 di_clk : out std_logic; -- тактовая частота записи в FIFO 00076 di_data : out std_logic_vector( 63 downto 0 ); -- данные 00077 di_data_we : out std_logic; -- 1 - запись данных 00078 di_flag_wr : in bl_fifo_flag; -- флаги FIFO 00079 di_fifo_rst : in std_logic; -- 0 - сброс FIFO 00080 di_mode1 : in std_logic_vector( 15 downto 0 ); -- регистр MODE1 00081 di_start : in std_logic; -- 1 - разрешение работы (MODE0[5]) 00082 00083 ---- DIO_OUT ---- 00084 do_clk : out std_logic; -- тактовая частота чтения из FIFO 00085 do_data : in std_logic_vector( 63 downto 0 ); 00086 do_data_cs : out std_logic; -- 0 - чтение данных 00087 do_flag_rd : in bl_fifo_flag; -- флаги FIFO 00088 do_fifo_rst : in std_logic; -- 0 - сброс FIFO 00089 do_mode1 : in std_logic_vector( 15 downto 0 ); -- регистр MODE1 00090 do_start : in std_logic; -- 1 - разрешение работы (MODE0[5]) 00091 00092 ---- Определение тактовой частоты ---- 00093 clk_sys : in std_logic:='0'; -- опорная тактовая частота 00094 clk_check0 : in std_logic:='0'; -- измеряемая частота, вход 0 00095 clk_check1 : in std_logic:='0'; -- измеряемая частота, вход 1 00096 clk_check2 : in std_logic:='0' -- измеряемая частота, вход 2 00097 00098 -------------------------------------------- 00099 00100 00101 00102 ); 00103 end component; 00104 00105 end trd_test_ctrl_m1_pkg; 00106 00107 library ieee; 00108 use ieee.std_logic_1164.all; 00109 00110 library unisim; 00111 use unisim.vcomponents.all; 00112 00113 library work; 00114 use work.cl_chn_v3_pkg.all; 00115 use work.adm2_pkg.all; 00116 use work.cl_test_generate_pkg.all; 00117 use work.cl_test_check_pkg.all; 00118 use work.ctrl_freq_pkg.all; 00119 00120 entity trd_test_ctrl_m1 is 00121 generic( 00122 SystemFreq : integer:= 500 -- значение системной тактовой частоты 00123 ); 00124 port( 00125 -- GLOBAL 00126 reset : in std_logic; -- 0 - сброс 00127 clk : in std_logic; -- тактовая частота 00128 00129 -- Управление тетрадой 00130 cmd_data_in : in std_logic_vector( 15 downto 0 ); -- шина данных CMD_DATA 00131 cmd : in bl_cmd; -- сигналы управления 00132 00133 cmd_data_out : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход через буфер 00134 cmd_data_out2 : out std_logic_vector( 15 downto 0 ); -- выходы регистров, выход без буфера 00135 00136 bx_irq : out std_logic; -- 1 - прерывание от тетрады 00137 bx_drq : out bl_drq; -- управление DMA 00138 00139 mode0 : out std_logic_vector( 15 downto 0 ); -- регистр MODE0 00140 mode1 : out std_logic_vector( 15 downto 0 ); -- регистр MODE1 00141 mode2 : out std_logic_vector( 15 downto 0 ); -- регистр MODE2 00142 mode3 : out std_logic_vector( 15 downto 0 ); -- регистр MODE3 00143 00144 ---- DIO_IN ---- 00145 di_clk : out std_logic; -- тактовая частота записи в FIFO 00146 di_data : out std_logic_vector( 63 downto 0 ); -- данные 00147 di_data_we : out std_logic; -- 1 - запись данных 00148 di_flag_wr : in bl_fifo_flag; -- флаги FIFO 00149 di_fifo_rst : in std_logic; -- 0 - сброс FIFO 00150 di_mode1 : in std_logic_vector( 15 downto 0 ); -- регистр MODE1 00151 di_start : in std_logic; -- 1 - разрешение работы (MODE0[5]) 00152 00153 ---- DIO_OUT ---- 00154 do_clk : out std_logic; -- тактовая частота чтения из FIFO 00155 do_data : in std_logic_vector( 63 downto 0 ); 00156 do_data_cs : out std_logic; -- 0 - чтение данных 00157 do_flag_rd : in bl_fifo_flag; -- флаги FIFO 00158 do_fifo_rst : in std_logic; -- 0 - сброс FIFO 00159 do_mode1 : in std_logic_vector( 15 downto 0 ); -- регистр MODE1 00160 do_start : in std_logic; -- 1 - разрешение работы (MODE0[5]) 00161 00162 ---- Определение тактовой частоты ---- 00163 clk_sys : in std_logic:='0'; -- опорная тактовая частота 00164 clk_check0 : in std_logic:='0'; -- измеряемая частота, вход 0 00165 clk_check1 : in std_logic:='0'; -- измеряемая частота, вход 1 00166 clk_check2 : in std_logic:='0' -- измеряемая частота, вход 2 00167 00168 -------------------------------------------- 00169 00170 00171 00172 ); 00173 end trd_test_ctrl_m1; 00174 00175 architecture trd_test_ctrl_m1 of trd_test_ctrl_m1 is 00176 00177 00178 signal rst,fifo_rst0 : std_logic; 00179 signal flag_rdi : bl_fifo_flag; 00180 signal cmode0 : std_logic_vector( 15 downto 0 ); 00181 signal status : std_logic_vector( 15 downto 0 ); 00182 signal cmd_data_int : std_logic_vector( 15 downto 0 ); 00183 00184 signal test_check_ctrl : std_logic_vector( 15 downto 0 ); 00185 signal test_check_size : std_logic_vector( 15 downto 0 ); 00186 signal test_check_bl_rd : std_logic_vector( 31 downto 0 ); 00187 signal test_check_bl_ok : std_logic_vector( 31 downto 0 ); 00188 signal test_check_bl_err : std_logic_vector( 31 downto 0 ); 00189 signal test_check_error : std_logic_vector( 31 downto 0 ); 00190 signal test_check_err_adr : std_logic_vector( 15 downto 0 ); 00191 signal test_check_err_data : std_logic_vector( 15 downto 0 ); 00192 signal test_gen_ctrl : std_logic_vector( 15 downto 0 ); 00193 signal test_gen_size : std_logic_vector( 15 downto 0 ); 00194 signal test_gen_bl_wr : std_logic_vector( 31 downto 0 ); 00195 00196 signal di_gen_data : std_logic_vector( 63 downto 0 ); 00197 signal di_gen_data_we : std_logic; 00198 signal do_cs_rdy : std_logic; 00199 signal do_data_en : std_logic; 00200 signal mux_ctrl : std_logic_vector( 1 downto 0 ); 00201 00202 signal cmd_reg : std_logic_vector( 15 downto 0 ); 00203 signal cmd_reg0 : std_logic_vector( 15 downto 0 ); 00204 signal cmd_reg1 : std_logic_vector( 15 downto 0 ); 00205 signal cmd_reg_i0 : std_logic_vector( 15 downto 0 ); 00206 signal cmd_reg_i1 : std_logic_vector( 15 downto 0 ); 00207 00208 signal test_gen_cnt1 : std_logic_vector( 15 downto 0 ); 00209 signal test_gen_cnt2 : std_logic_vector( 15 downto 0 ); 00210 00211 signal freq0 : std_logic_vector( 15 downto 0 ); 00212 signal freq1 : std_logic_vector( 15 downto 0 ); 00213 signal freq2 : std_logic_vector( 15 downto 0 ); 00214 00215 begin 00216 00217 xstatus: ctrl_buft16 port map( 00218 t => cmd.status_cs, 00219 i => cmd_data_int, 00220 o => cmd_data_out ); 00221 00222 cmd_data_out2 <= cmd_data_int; 00223 00224 cmd_data_int <= status when cmd.status_cs='0' else 00225 cmd_reg; 00226 00227 chn: cl_chn_v3 00228 generic map( 00229 -- 2 - out - для тетрады вывода 00230 -- 1 - in - для тетрады ввода 00231 chn_type => 1 00232 ) 00233 port map ( 00234 reset => reset, 00235 clk => clk, 00236 -- Флаги 00237 cmd_rdy => '1', 00238 rdy => flag_rdi.ef, 00239 fifo_flag => flag_rdi, 00240 -- Тетрада 00241 data_in => cmd_data_in, 00242 cmd => cmd, 00243 bx_irq => bx_irq, 00244 bx_drq => bx_drq, 00245 status => status, 00246 -- Управление 00247 mode0 => cmode0, 00248 mode1 => mode1, 00249 mode2 => mode2, 00250 mode3 => mode3, 00251 rst => rst, 00252 fifo_rst => fifo_rst0 00253 ); 00254 00255 mode0 <= cmode0; 00256 00257 test_gen: cl_test_generate 00258 port map( 00259 00260 ---- Global ---- 00261 reset => rst, -- 0 - сброс 00262 clk => clk, -- тактовая частота 00263 00264 ---- DIO_IN ---- 00265 di_clk => clk, -- тактовая частота записи в FIFO 00266 di_data => di_gen_data, -- данные 00267 di_data_we => di_gen_data_we, -- 1 - запись данных 00268 di_flag_paf => di_flag_wr.paf, -- 1 - есть место для записи 00269 di_fifo_rst => di_fifo_rst, -- 0 - сброс FIFO 00270 di_start => di_start, -- 1 - разрешение работы (MODE0[5]) 00271 00272 00273 ---- Управление ---- 00274 test_gen_ctrl => test_gen_ctrl, 00275 test_gen_size => test_gen_size, -- размер в блоках по 512x64 (4096 байт) 00276 test_gen_bl_wr => test_gen_bl_wr, 00277 test_gen_cnt1 => test_gen_cnt1, -- Счётчик разрешения работы 00278 test_gen_cnt2 => test_gen_cnt2-- Счётчик запрещения работы 00279 00280 ); 00281 00282 00283 test_check: cl_test_check 00284 port map( 00285 00286 ---- Global ---- 00287 reset => rst, -- 0 - сброс 00288 clk => clk, -- тактовая частота 00289 00290 ---- DIO_OUT ---- 00291 do_clk => clk, -- тактовая частота чтения из FIFO 00292 do_data => do_data, 00293 do_data_en => do_data_en, -- 1 - передача данных из dio_out 00294 00295 00296 ---- Управление ---- 00297 test_check_ctrl => test_check_ctrl, 00298 test_check_size => test_check_size, 00299 test_check_bl_rd => test_check_bl_rd, 00300 test_check_bl_ok => test_check_bl_ok, 00301 test_check_bl_err => test_check_bl_err, 00302 test_check_error => test_check_error, 00303 test_check_err_adr => test_check_err_adr, 00304 test_check_err_data => test_check_err_data 00305 ); 00306 00307 ---- Мультиплексор для выходной последовательности ---- 00308 di_data <= do_data when mux_ctrl( 1 downto 0 )="00" else 00309 di_gen_data when mux_ctrl( 1 downto 0 )="01" else 00310 (others=>'0'); 00311 00312 di_data_we <= do_data_en when mux_ctrl( 1 downto 0 )="00" else 00313 di_gen_data_we when mux_ctrl( 1 downto 0 )="01" else 00314 '0'; 00315 00316 pr_do_cs_rdy: process( clk ) begin 00317 if( rising_edge( clk ) ) then 00318 if( mux_ctrl="00" ) then 00319 if( di_flag_wr.paf='1' and di_start='1' ) then 00320 do_cs_rdy <= '1' after 1 ns; 00321 else 00322 do_cs_rdy <= '0' after 1 ns; 00323 end if; 00324 else 00325 do_cs_rdy <= '1' after 1 ns; 00326 end if; 00327 00328 if( do_flag_rd.pae='1' and do_start='1' and do_cs_rdy='1' and rst='1') then 00329 do_data_en <= '1' after 1 ns; 00330 do_data_cs <= '0' after 1 ns; 00331 else 00332 do_data_en <= '0' after 1 ns; 00333 do_data_cs <= '1' after 1 ns; 00334 end if; 00335 00336 end if; 00337 end process; 00338 00339 00340 cmd_reg_i0 <= test_check_bl_rd( 15 downto 0 ) when cmd.adr( 3 downto 0 )=x"0" else 00341 test_check_bl_rd( 31 downto 16 ) when cmd.adr( 3 downto 0 )=x"1" else 00342 test_check_bl_ok( 15 downto 0 ) when cmd.adr( 3 downto 0 )=x"2" else 00343 test_check_bl_ok( 31 downto 16 ) when cmd.adr( 3 downto 0 )=x"3" else 00344 test_check_bl_err( 15 downto 0 ) when cmd.adr( 3 downto 0 )=x"4" else 00345 test_check_bl_err( 31 downto 16 ) when cmd.adr( 3 downto 0 )=x"5" else 00346 test_check_error( 15 downto 0 ) when cmd.adr( 3 downto 0 )=x"6" else 00347 test_check_error( 31 downto 16 ) when cmd.adr( 3 downto 0 )=x"7" else 00348 test_check_err_adr( 15 downto 0 ) when cmd.adr( 3 downto 0 )=x"8" else 00349 test_check_err_data( 15 downto 0 ) when cmd.adr( 3 downto 0 )=x"9" else 00350 test_gen_bl_wr( 15 downto 0 ) when cmd.adr( 3 downto 0 )=x"A" else 00351 test_gen_bl_wr( 31 downto 16 ) when cmd.adr( 3 downto 0 )=x"B" else 00352 (others=>'-'); 00353 00354 cmd_reg_i1 <= freq0 when cmd.adr( 3 downto 0 )=x"0" else 00355 freq1 when cmd.adr( 3 downto 0 )=x"1" else 00356 freq2; 00357 00358 cmd_reg0 <= cmd_reg_i0 after 1 ns when rising_edge( clk ); 00359 cmd_reg1 <= cmd_reg_i1 after 1 ns when rising_edge( clk ); 00360 00361 cmd_reg <= cmd_reg0 when cmd.adr( 5 )='0' else cmd_reg1; 00362 00363 pr_reg: process( clk ) begin 00364 if( rising_edge( clk ) ) then 00365 if( rst='0' ) then 00366 mux_ctrl <= (others=>'0') after 1 ns; 00367 test_check_ctrl <= (others=>'0') after 1 ns; 00368 test_check_size <= (others=>'0') after 1 ns; 00369 test_gen_ctrl <= (others=>'0') after 1 ns; 00370 test_gen_size <= (others=>'0') after 1 ns; 00371 elsif( cmd.cmd_data_we='1' and cmd.adr( 9 downto 8 )="00" ) then 00372 case( cmd.adr( 4 downto 0 ) ) is 00373 when "01111" => mux_ctrl <= cmd_data_in( 1 downto 0 ) after 1 ns; 00374 when "11010" => test_gen_cnt1 <= cmd_data_in after 1 ns; 00375 when "11011" => test_gen_cnt2 <= cmd_data_in after 1 ns; 00376 when "11100" => test_check_ctrl <= cmd_data_in after 1 ns; 00377 when "11101" => test_check_size <= cmd_data_in after 1 ns; 00378 when "11110" => test_gen_ctrl <= cmd_data_in after 1 ns; 00379 when "11111" => test_gen_size <= cmd_data_in after 1 ns; 00380 when others => null; 00381 end case; 00382 elsif( cmd.cmd_data_we='1' and cmd.adr( 9 downto 8 )="10" ) then 00383 case( cmd.adr( 4 downto 0 ) ) is 00384 when "11000" => test_check_err_adr <= cmd_data_in after 1 ns; 00385 when others => null; 00386 end case; 00387 end if; 00388 end if; 00389 end process; 00390 00391 do_clk <= clk; 00392 di_clk <= clk; 00393 00394 00395 fr0: ctrl_freq 00396 generic map( 00397 SystemFreq => SystemFreq , -- значение системной тактовой частоты 00398 FreqDiv => 1 -- коэффициент деления входной частоты 00399 -- ( 2 - на вход подаётся половина измеряемой частоты ) 00400 ) 00401 port map( 00402 reset => rst, -- 0 - сброс 00403 clk_sys => clk_sys, -- системная тактовая частота 00404 clk_in => clk_check0, -- входная тактовая частота АЦП 00405 freq_adc => freq0-- ориентировочное значение тактовой частоты АЦП в МГц 00406 ); 00407 00408 fr1: ctrl_freq 00409 generic map( 00410 SystemFreq => SystemFreq , -- значение системной тактовой частоты 00411 FreqDiv => 1 -- коэффициент деления входной частоты 00412 -- ( 2 - на вход подаётся половина измеряемой частоты ) 00413 ) 00414 port map( 00415 reset => rst, -- 0 - сброс 00416 clk_sys => clk_sys, -- системная тактовая частота 00417 clk_in => clk_check1, -- входная тактовая частота АЦП 00418 freq_adc => freq1-- ориентировочное значение тактовой частоты АЦП в МГц 00419 ); 00420 00421 fr2: ctrl_freq 00422 generic map( 00423 SystemFreq => SystemFreq , -- значение системной тактовой частоты 00424 FreqDiv => 1 -- коэффициент деления входной частоты 00425 -- ( 2 - на вход подаётся половина измеряемой частоты ) 00426 ) 00427 port map( 00428 reset => rst, -- 0 - сброс 00429 clk_sys => clk_sys, -- системная тактовая частота 00430 clk_in => clk_check2, -- входная тактовая частота АЦП 00431 freq_adc => freq2-- ориентировочное значение тактовой частоты АЦП в МГц 00432 ); 00433 00434 00435 00436 end trd_test_ctrl_m1;