AMBPEX5_v20_SX50T_CORE
|
00001 --------------------------------------------------------------------------------------------------- 00002 -- 00003 -- Title : ctrl_start_v2 00004 -- Author : Dmitry Smekhov 00005 -- Company : Instrumental System 00006 -- 00007 -- Version : 1.6 00008 -- 00009 --------------------------------------------------------------------------------------------------- 00010 -- 00011 -- Каталог : rtl_s2e - Реализация для Spartan-2E 00012 -- rtl_v2 - Реализация для Virtex-II 00013 -- 00014 --------------------------------------------------------------------------------------------------- 00015 -- 00016 -- Description : Выбор тактовой частоты и сигнала старта 00017 -- 00018 -- Модификация 2. Не используются счётчики CNT0, CNT1, CNT2 00019 -- 00020 --------------------------------------------------------------------------------------------------- 00021 -- 00022 -- Version 1.6 28.11.2006 00023 -- Исправлено формирование сигналов start_a_tr_clr и start_a_tr (по аналогии с ctrl_start_v4) 00024 -- (Соколов) 00025 -- 00026 -- Version 1.5 16.02.2006 00027 -- Исправлено формирование сигнала старта в программном режиме 00028 -- и установленным битом триггерного старта 00029 -- 00030 -- 00031 -- Version 1.4 28.04.2004 00032 -- Исправлено формирование сигнала старта в программном режиме 00033 -- и установленным битом инверсии старта. 00034 -- Добавлено описание пакета ctrl_start_v2_pkg. 00035 -- 00036 -- Version 1.3 19.01.2004 00037 -- Исправлено формирование тактовой частоты в режиме ADM_MSYNC 00038 -- 00039 -- Version 1.2 25.12.2003 00040 -- Исправлено формирование сигнала старта в режиме Slave 00041 -- 00042 -- Version 1.1 22.12.2003 00043 -- Исправлена схема формирования триггерного старта 00044 -- 00045 --------------------------------------------------------------------------------------------------- 00046 00047 library IEEE; 00048 use IEEE.STD_LOGIC_1164.all; 00049 use ieee.std_logic_unsigned.all; 00050 00051 00052 package ctrl_start_v2_pkg is 00053 00054 component ctrl_start_v2 is 00055 port( 00056 00057 reset: in std_logic; -- 0 - сброс 00058 mode0: in std_logic_vector( 15 downto 0 ); -- регистр MODE0 00059 stmode: in std_logic_vector( 15 downto 0 ); -- регистр STMODE 00060 fmode: in std_logic_vector( 5 downto 0 ); -- регистр FMODE 00061 fdiv: in std_logic_vector( 15 downto 0 ); -- регистр FDIV 00062 fdiv_we: in std_logic; -- 1 - запись в регистр FDIV 00063 00064 b_clk: in std_logic_vector( 15 downto 0 ); -- входы тактовой частоты 00065 b_start: in std_logic_vector( 15 downto 0 ); -- входы сигнала START 00066 00067 bx_clk: out std_logic; -- выход тактовой частоты 00068 bx_start: out std_logic; -- выход сигнала start синхронный с bx_clk 00069 bx_start_a: out std_logic; -- асинхронный выход сигнала start 00070 bx_start_sync: out std_logic; -- импульс синхронизации 00071 00072 goe0: out std_logic; -- включение генератора 60MHz 00073 goe1: out std_logic -- включение генератора 50MHz 00074 00075 ); 00076 00077 end component; 00078 00079 end package ctrl_start_v2_pkg; 00080 00081 00082 library IEEE; 00083 use IEEE.STD_LOGIC_1164.all; 00084 use ieee.std_logic_unsigned.all; 00085 00086 00087 00088 entity ctrl_start_v2 is 00089 port( 00090 00091 reset: in std_logic; -- 0 - сброс 00092 mode0: in std_logic_vector( 15 downto 0 ); -- регистр MODE0 00093 stmode: in std_logic_vector( 15 downto 0 ); -- регистр STMODE 00094 fmode: in std_logic_vector( 5 downto 0 ); -- регистр FMODE 00095 fdiv: in std_logic_vector( 15 downto 0 ); -- регистр FDIV 00096 fdiv_we: in std_logic; -- 1 - запись в регистр FDIV 00097 00098 b_clk: in std_logic_vector( 15 downto 0 ); -- входы тактовой частоты 00099 b_start: in std_logic_vector( 15 downto 0 ); -- входы сигнала START 00100 00101 bx_clk: out std_logic; -- выход тактовой частоты 00102 bx_start: out std_logic; -- выход сигнала start синхронный с bx_clk 00103 bx_start_a: out std_logic; -- асинхронный выход сигнала start 00104 bx_start_sync: out std_logic; -- импульс синхронизации 00105 00106 goe0: out std_logic; -- включение генератора 60MHz 00107 goe1: out std_logic -- включение генератора 50MHz 00108 00109 ); 00110 00111 end ctrl_start_v2; 00112 00113 00114 architecture ctrl_start_v2 of ctrl_start_v2 is 00115 00116 00117 00118 signal clki: std_logic; -- выбранный опорный сигнал 00119 signal clko_cnt: std_logic; -- сигнал с выхода счётчика 00120 signal clko: std_logic; -- сформированный сигнал 00121 00122 signal clk_cnt: std_logic_vector( 15 downto 0 ); -- счётчик тактовой частоты 00123 signal clk_cnt_z, clk_cnt_z1 : std_logic; -- 1 - clk_cnt=0 00124 signal clk_cnt_half: std_logic; -- 1 - clk_cnt = fdiv/2 00125 signal clk_div1: std_logic; -- 1 - fdiv=1 00126 signal xcnt0: std_logic_vector( 15 downto 0 ); -- счётчик начальной задержки 00127 signal xcnt1: std_logic_vector( 15 downto 0 ); -- счётчик принимаемых слов 00128 signal xcnt2: std_logic_vector( 15 downto 0 ); -- счётчик пропускаемых слов 00129 00130 signal xcnt0_z: std_logic; -- 1 - xcnt0=x"0000" 00131 signal xcnt1_z: std_logic; -- 1 - xcnt1=x"0000" 00132 signal xcnt2_z: std_logic; -- 1 - xcnt2=x"0000" 00133 00134 signal start_a: std_logic; -- 0 - асинхронный старт 00135 signal start_a_tr, start_a_tr1: std_logic; -- 0 - асинхронный триггерный страт 00136 signal start_a_tr_clr: std_logic; 00137 signal start_i, start_i1: std_logic; -- 0 - выбранный источник сторта 00138 signal stop_i, stop_i1: std_logic; -- 0 - выбранный источник останова 00139 signal start_s, start_si: std_logic; -- 0 - синхронный старт 00140 signal start_cnt0: std_logic; -- 1 - блокировка на время работы счётчика 0 00141 signal start_cnt12: std_logic; -- 1 - блокировка на время работы счётчиков 1 и 2 00142 signal xcnt1_start: std_logic; -- 1 - разрешение работы счётчика xcnt1 00143 signal xcnt2_start: std_logic; -- 1 - разрешение работы счётчика xcnt2 00144 signal adcen: std_logic; -- 1 - программный старт 00145 signal start_o: std_logic; -- сформированный сигнал синхронного старта 00146 signal clk_clr: std_logic; -- 1 - сброс счётчика тактовой частоты 00147 signal clk_clr_cl0: std_logic; -- 1 - сброс clk_clr 00148 signal clk_clr_block: std_logic; -- 1 - блокировка сброса 00149 signal start_prog: std_logic; 00150 signal prog_start: std_logic; -- 1 - выбран программный старт 00151 00152 begin 00153 00154 adcen <= mode0(5); 00155 00156 00157 pr_clk: process( b_clk, fmode ) is 00158 begin 00159 case fmode( 3 downto 0 ) is 00160 when "0000" => clki <= b_clk(0); 00161 when "0001" => clki <= b_clk(1); 00162 when "0010" => clki <= b_clk(2); 00163 when "0011" => clki <= b_clk(3); 00164 when "0100" => clki <= b_clk(4); 00165 when "0101" => clki <= b_clk(5); 00166 when "0110" => clki <= b_clk(6); 00167 when "0111" => clki <= b_clk(7); 00168 when "1000" => clki <= b_clk(8); 00169 when "1001" => clki <= b_clk(9); 00170 when "1010" => clki <= b_clk(10); 00171 when "1011" => clki <= b_clk(11); 00172 when "1100" => clki <= b_clk(12); 00173 when "1101" => clki <= b_clk(13); 00174 when "1110" => clki <= b_clk(14); 00175 when "1111" => clki <= b_clk(15); 00176 when others => null; 00177 end case; 00178 end process; 00179 00180 goe0<='1' when fmode( 3 downto 0 )="0001" else '0'; 00181 goe1<='1' when fmode( 3 downto 0 )="0010" else '0'; 00182 00183 00184 pr_cnt_clk: process( reset, start_a, fdiv_we, fmode, clki ) is 00185 begin 00186 if( reset='0' or ( clk_clr='1' and fmode(5)='1' ) or fdiv_we='1' ) then 00187 --clk_cnt<=(others=>'0'); 00188 clk_cnt<=x"0001"; 00189 elsif( rising_edge( clki ) ) then 00190 if( clk_cnt_z='1' ) then 00191 clk_cnt<=fdiv; 00192 else 00193 clk_cnt<=clk_cnt-1; 00194 end if; 00195 end if; 00196 end process; 00197 00198 clk_div1<='1' when fdiv=x"0001" else '0'; 00199 clk_cnt_z<='1' when clk_cnt=x"0001" else '0'; 00200 clk_cnt_half<='1' when clk_cnt( 14 downto 0 )=fdiv( 15 downto 1 ) else '0'; 00201 00202 pr_clk_cnt_z1: process( clki ) begin 00203 if( rising_edge( clki ) ) then 00204 clk_cnt_z1<=clk_cnt_z; 00205 end if; 00206 end process; 00207 00208 pr_clko_cnt: process( clki, clk_cnt, clk_div1, clk_cnt_half ) is 00209 begin 00210 if( clk_div1='1' ) then 00211 clko_cnt<=clki; 00212 elsif( rising_edge( clki ) ) then 00213 if( clk_cnt_z1='1' ) then clko_cnt<='0'; 00214 elsif( clk_cnt_half='1' ) then clko_cnt<='1'; 00215 end if; 00216 end if; 00217 end process; 00218 00219 pr_clko: process( mode0, b_clk, clko_cnt ) is 00220 begin 00221 if( mode0(4)='0' ) then 00222 clko<=b_clk(4); 00223 elsif( mode0(6)='1' ) then 00224 clko<=b_clk(7); 00225 else 00226 clko<=clko_cnt; 00227 end if; 00228 end process; 00229 00230 bx_clk<=clko; 00231 00232 -- Старт 00233 00234 pr_starto: process( mode0, b_start, start_s ) is 00235 begin 00236 if( mode0(4)='0' ) then -- SLAVE 00237 start_o<=b_start(4) or not mode0(5); 00238 else 00239 start_o<=start_s; 00240 end if; 00241 end process; 00242 00243 bx_start<=start_o; 00244 00245 pr_start_i: process( stmode, b_start, start_prog ) is 00246 begin 00247 case stmode( 3 downto 0 ) is 00248 when "0000" => start_i <= start_prog; 00249 when "0001" => start_i <= b_start(1); 00250 when "0010" => start_i <= b_start(2); 00251 when "0011" => start_i <= b_start(3); 00252 when "0100" => start_i <= b_start(4); 00253 when "0101" => start_i <= b_start(5); 00254 when "0110" => start_i <= b_start(6); 00255 when "0111" => start_i <= b_start(7); 00256 when "1000" => start_i <= b_start(8); 00257 when "1001" => start_i <= b_start(9); 00258 when "1010" => start_i <= b_start(10); 00259 when "1011" => start_i <= b_start(11); 00260 when "1100" => start_i <= b_start(12); 00261 when "1101" => start_i <= b_start(13); 00262 when "1110" => start_i <= b_start(14); 00263 when "1111" => start_i <= b_start(15); 00264 when others => null; 00265 end case; 00266 end process; 00267 start_prog<=( not mode0(5) ) xor stmode(6) when rising_edge(b_clk(0) ); 00268 --start_i1<= ( start_i xor stmode(6) ) or ( not mode0(5) ); 00269 start_i1<= ( start_i xor stmode(6) ); 00270 00271 pr_stop_i: process( stmode, b_start, mode0(5) ) is 00272 begin 00273 case stmode( 11 downto 8 ) is 00274 when "0000" => stop_i <= ( not mode0(5) ) xor stmode(14); 00275 when "0001" => stop_i <= b_start(1); 00276 when "0010" => stop_i <= b_start(2); 00277 when "0011" => stop_i <= b_start(3); 00278 when "0100" => stop_i <= b_start(4); 00279 when "0101" => stop_i <= b_start(5); 00280 when "0110" => stop_i <= b_start(6); 00281 when "0111" => stop_i <= b_start(7); 00282 when "1000" => stop_i <= b_start(8); 00283 when "1001" => stop_i <= b_start(9); 00284 when "1010" => stop_i <= b_start(10); 00285 when "1011" => stop_i <= b_start(11); 00286 when "1100" => stop_i <= b_start(12); 00287 when "1101" => stop_i <= b_start(13); 00288 when "1110" => stop_i <= b_start(14); 00289 when "1111" => stop_i <= b_start(15); 00290 when others => null; 00291 end case; 00292 end process; 00293 00294 stop_i1<= stop_i xor stmode(14); 00295 00296 pr_start_a_tr: process( mode0, start_a_tr_clr, start_i1 ) 00297 begin 00298 if( mode0(5)='0' or start_a_tr_clr='1' ) then 00299 start_a_tr<='1'; 00300 elsif( prog_start='1' and mode0(5)='1' ) then 00301 start_a_tr<='0'; 00302 elsif( falling_edge( start_i1 ) ) then 00303 start_a_tr<='0'; 00304 end if; 00305 end process; 00306 00307 00308 pr_start_a_tr1: process( b_clk ) begin 00309 if( rising_edge( b_clk(0) ) ) then 00310 start_a_tr1<=start_a_tr; 00311 end if; 00312 end process; 00313 00314 pr_start_a_tr_clr: process( mode0, prog_start, start_a_tr1, stop_i1 ) begin 00315 if( start_a_tr1='1' or mode0(5)='0' or prog_start='1' ) then 00316 start_a_tr_clr<='0'; 00317 elsif( rising_edge( stop_i1 ) ) then 00318 start_a_tr_clr<='1'; 00319 end if; 00320 end process; 00321 00322 00323 --start_a<=start_a_tr when stmode(7)='1' else start_i1; 00324 start_a<=start_a_tr when stmode(7)='1' else start_i1 or ( not mode0(5) ); 00325 bx_start_a<=start_a; 00326 00327 pr_start_si: process( clko ) begin 00328 if( rising_edge( clko ) ) then 00329 start_si<=start_a; 00330 end if; 00331 end process; 00332 00333 start_s<=start_si; 00334 00335 00336 00337 pr_clk_clr: process( reset, clk_clr_cl0, start_a ) begin 00338 if( reset='0' or clk_clr_cl0='1' ) then 00339 clk_clr<='0'; 00340 elsif( falling_edge( start_a ) ) then 00341 clk_clr<='1'; 00342 end if; 00343 end process; 00344 00345 bx_start_sync <= clk_clr; 00346 00347 pr_clk_cl0: process( reset, b_clk(0) ) begin 00348 if( reset='0' ) then 00349 clk_clr_cl0<='0'; 00350 elsif( rising_edge( b_clk(0) ) ) then 00351 if( clk_clr='1' and clk_clr_block='0' ) then 00352 clk_clr_cl0<='1'; 00353 else 00354 clk_clr_cl0<='0'; 00355 end if; 00356 end if; 00357 end process; 00358 00359 00360 pr_clk_clr_block: process( reset, b_clk(0) ) 00361 begin 00362 if( reset='0' ) then 00363 clk_clr_block<='0'; 00364 elsif( rising_edge( b_clk(0) ) ) then 00365 if( clk_cnt_half='1' and clk_clr_block='0' ) then 00366 clk_clr_block<='1'; 00367 else 00368 clk_clr_block<='0'; 00369 end if; 00370 end if; 00371 end process; 00372 00373 00374 end ctrl_start_v2;