AMBPEX5_v20_SX50T_CORE
adm/trd_test_ctrl/trd_test_ctrl_m1.vhd
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;