AMBPEX5_v20_SX50T_CORE
|
00001 ------------------------------------------------------------------------------- 00002 -- 00003 -- Title : cl_ambpex5_m5 00004 -- Author : Dmitry Smekhov 00005 -- Company : Instrumental Systems 00006 -- E-mail : dsmv@insys.ru 00007 -- 00008 -- Version : 1.0 00009 -- 00010 ------------------------------------------------------------------------------- 00011 -- 00012 -- Description : Узел подключения тетрад для модуля AMBPEX5 00013 -- Модификация 5 - Используется pcie_core64_m2 00014 -- 00015 ------------------------------------------------------------------------------- 00016 -- 00017 -- Version 1.0 02.07.2011 00018 -- 00019 ------------------------------------------------------------------------------- 00020 00021 library ieee; 00022 use ieee.std_logic_1164.all; 00023 00024 library work; 00025 use work.adm2_pkg.all; 00026 00027 00028 package cl_ambpex5_m5_pkg is 00029 00030 constant rom_empty: bl_trd_rom:=(others=>x"0000"); 00031 00032 component cl_ambpex5_m5 is 00033 generic ( 00034 00035 ---- Параметры PLL ---- 00036 --- CLKOUT0 - 266 МГц --- 00037 --- CLKOUT1 - 200 МГц --- 00038 BANDWIDTH : string := "OPTIMIZED"; 00039 CLKFBOUT_MULT : integer := 16; 00040 CLKFBOUT_PHASE : real := 0.0; 00041 CLKIN_PERIOD : real := 0.000; 00042 CLKOUT0_DIVIDE : integer := 3; 00043 CLKOUT0_DUTY_CYCLE : real := 0.5; 00044 CLKOUT0_PHASE : real := 0.0; 00045 CLKOUT1_DIVIDE : integer := 4; 00046 CLKOUT1_DUTY_CYCLE : real := 0.5; 00047 CLKOUT1_PHASE : real := 0.0; 00048 CLKOUT2_DIVIDE : integer := 1; 00049 CLKOUT2_DUTY_CYCLE : real := 0.5; 00050 CLKOUT2_PHASE : real := 0.0; 00051 CLKOUT3_DIVIDE : integer := 1; 00052 CLKOUT3_DUTY_CYCLE : real := 0.5; 00053 CLKOUT3_PHASE : real := 0.0; 00054 CLKOUT4_DIVIDE : integer := 1; 00055 CLKOUT4_DUTY_CYCLE : real := 0.5; 00056 CLKOUT4_PHASE : real := 0.0; 00057 CLKOUT5_DIVIDE : integer := 1; 00058 CLKOUT5_DUTY_CYCLE : real := 0.5; 00059 CLKOUT5_PHASE : real := 0.0; 00060 CLK_FEEDBACK : string := "CLKFBOUT"; 00061 COMPENSATION : string := "SYSTEM_SYNCHRONOUS"; 00062 DIVCLK_DIVIDE : integer := 5; 00063 REF_JITTER : real := 0.100; 00064 RESET_ON_LOSS_OF_LOCK : boolean := FALSE; 00065 00066 00067 ---- Константы тетрад ---- 00068 trd_rom : in std_logic_array_16xbl_trd_rom:=(others=>(others=>(others=>'0'))); 00069 ---- Разрешение чтения из регистра DATA ---- 00070 trd_in : in std_logic_vector( 15 downto 0 ):=x"0000"; 00071 ---- Разрешение чтения из регистра STATUS ---- 00072 trd_st : in std_logic_vector( 15 downto 0 ):=x"0000"; 00073 00074 is_simulation : integer:=0 -- 0 - синтез, 1 - моделирование ADM 00075 ); 00076 port ( 00077 ---- PCI-Express ---- 00078 txp : out std_logic_vector( 7 downto 0 ); 00079 txn : out std_logic_vector( 7 downto 0 ); 00080 00081 rxp : in std_logic_vector( 7 downto 0 ); 00082 rxn : in std_logic_vector( 7 downto 0 ); 00083 00084 mgt251_p : in std_logic; -- тактовая частота 250 MHz от PCI_Express 00085 mgt251_n : in std_logic; 00086 00087 00088 bperst : in std_logic; -- 0 - сброс 00089 00090 p : out std_logic_vector( 3 downto 1 ); 00091 00092 led_h1 : out std_logic; -- 0 - светится светодиод H1 00093 led_h2 : out std_logic; -- 0 - светится светодиод H2 00094 led_h3 : out std_logic; -- 0 - светится светодиод H3 00095 led_h4 : out std_logic; -- 0 - светится светодиод H4 00096 00097 00098 ---- Внутренняя шина ---- 00099 clk_out : out std_logic; -- тактовая частота 00100 reset_out : out std_logic; -- 0 - сброс 00101 test_mode : in std_logic; -- 1 - тестовый режим 00102 clk30k : out std_logic; -- тактовая частота 30 кГц 00103 00104 clk200_out : out std_logic; -- тактовая частота 200 МГц 00105 clk2_pll : out std_logic; -- выход PLL CLKOUT2 00106 clk3_pll : out std_logic; -- выход PLL CLKOUT3 00107 clk4_pll : out std_logic; -- выход PLL CLKOUT4 00108 clk5_pll : out std_logic; -- выход PLL CLKOUT5 00109 clk_lock_out : out std_logic; -- 1 - частота установлена 00110 00111 ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ---- 00112 trd_host_adr : out std_logic_vector( 15 downto 0 ); 00113 00114 ---- Шина данных, через которую производиться запись в регистр DATA ---- 00115 trd_host_data : out std_logic_array_16x64; 00116 00117 ---- Шина данных, через которую производиться запись в регистры тетрады ---- 00118 trd_host_cmd_data : out std_logic_array_16x16; 00119 00120 ---- Комада управления для каждой тетрады ---- 00121 trd_host_cmd : out std_logic_array_16xbl_cmd; 00122 00123 ---- Выходы региста DATA от каждой тетрады ---- 00124 trd_data : in std_logic_array_16x64:=(others=>(others=>'0')); 00125 00126 ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ---- 00127 trd_cmd_data : in std_logic_array_16x16:=(others=>(others=>'0')); 00128 00129 ---- Запросы DMA от каждой тетрады ---- 00130 trd_drq : in std_logic_array_16xbl_drq:=(others=>(others=>'0')); 00131 00132 ---- Запросы DMA от тетрады MAIN (после маршрутизации) ---- 00133 trd_main_drq : in std_logic_array_16xbl_drq:=(others=>(others=>'0')); 00134 00135 ---- Регистры управления DMA ---- 00136 trd_main_sel_drq: in std_logic_array_16x6:=(others=>(others=>'0')); 00137 00138 ---- Сброс FIFO от каждой тетрады ---- 00139 trd_reset_fifo : in std_logic_array_16xbl_reset_fifo:=(others=>'0'); 00140 00141 ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ---- 00142 trd_main_irq : in std_logic_array_16xbl_irq:=(others=>'0') 00143 00144 00145 ); 00146 00147 end component; 00148 00149 end package; 00150 00151 00152 00153 library ieee; 00154 use ieee.std_logic_1164.all; 00155 use ieee.std_logic_arith.all; 00156 use ieee.std_logic_unsigned.all; 00157 00158 library unisim; 00159 use unisim.vcomponents.all; 00160 00161 library work; 00162 use work.adm2_pkg.all; 00163 00164 use work.pb_adm_ctrl_m2_pkg.all; 00165 use work.ctrl_blink_pkg.all; 00166 00167 00168 00169 entity cl_ambpex5_m5 is 00170 generic ( 00171 00172 ---- Параметры PLL ---- 00173 --- CLKOUT0 - 266 МГц --- 00174 --- CLKOUT1 - 200 МГц --- 00175 BANDWIDTH : string := "OPTIMIZED"; 00176 CLKFBOUT_MULT : integer := 16; 00177 CLKFBOUT_PHASE : real := 0.0; 00178 CLKIN_PERIOD : real := 0.000; 00179 CLKOUT0_DIVIDE : integer := 3; 00180 CLKOUT0_DUTY_CYCLE : real := 0.5; 00181 CLKOUT0_PHASE : real := 0.0; 00182 CLKOUT1_DIVIDE : integer := 4; 00183 CLKOUT1_DUTY_CYCLE : real := 0.5; 00184 CLKOUT1_PHASE : real := 0.0; 00185 CLKOUT2_DIVIDE : integer := 1; 00186 CLKOUT2_DUTY_CYCLE : real := 0.5; 00187 CLKOUT2_PHASE : real := 0.0; 00188 CLKOUT3_DIVIDE : integer := 1; 00189 CLKOUT3_DUTY_CYCLE : real := 0.5; 00190 CLKOUT3_PHASE : real := 0.0; 00191 CLKOUT4_DIVIDE : integer := 1; 00192 CLKOUT4_DUTY_CYCLE : real := 0.5; 00193 CLKOUT4_PHASE : real := 0.0; 00194 CLKOUT5_DIVIDE : integer := 1; 00195 CLKOUT5_DUTY_CYCLE : real := 0.5; 00196 CLKOUT5_PHASE : real := 0.0; 00197 CLK_FEEDBACK : string := "CLKFBOUT"; 00198 COMPENSATION : string := "SYSTEM_SYNCHRONOUS"; 00199 DIVCLK_DIVIDE : integer := 5; 00200 REF_JITTER : real := 0.100; 00201 RESET_ON_LOSS_OF_LOCK : boolean := FALSE; 00202 00203 00204 ---- Константы тетрад ---- 00205 trd_rom : in std_logic_array_16xbl_trd_rom:=(others=>(others=>(others=>'0'))); 00206 ---- Разрешение чтения из регистра DATA ---- 00207 trd_in : in std_logic_vector( 15 downto 0 ):=x"0000"; 00208 ---- Разрешение чтения из регистра STATUS ---- 00209 trd_st : in std_logic_vector( 15 downto 0 ):=x"0000"; 00210 00211 is_simulation : integer:=0 -- 0 - синтез, 1 - моделирование ADM 00212 ); 00213 port ( 00214 ---- PCI-Express ---- 00215 txp : out std_logic_vector( 7 downto 0 ); 00216 txn : out std_logic_vector( 7 downto 0 ); 00217 00218 rxp : in std_logic_vector( 7 downto 0 ); 00219 rxn : in std_logic_vector( 7 downto 0 ); 00220 00221 mgt251_p : in std_logic; -- тактовая частота 250 MHz от PCI_Express 00222 mgt251_n : in std_logic; 00223 00224 00225 bperst : in std_logic; -- 0 - сброс 00226 00227 p : out std_logic_vector( 3 downto 1 ); 00228 00229 led_h1 : out std_logic; -- 0 - светится светодиод H1 00230 led_h2 : out std_logic; -- 0 - светится светодиод H2 00231 led_h3 : out std_logic; -- 0 - светится светодиод H3 00232 led_h4 : out std_logic; -- 0 - светится светодиод H4 00233 00234 00235 ---- Внутренняя шина ---- 00236 clk_out : out std_logic; -- тактовая частота 00237 reset_out : out std_logic; -- 0 - сброс 00238 test_mode : in std_logic; -- 1 - тестовый режим 00239 clk30k : out std_logic; -- тактовая частота 30 кГц 00240 00241 clk200_out : out std_logic; -- тактовая частота 200 МГц 00242 clk2_pll : out std_logic; -- выход PLL CLKOUT2 00243 clk3_pll : out std_logic; -- выход PLL CLKOUT3 00244 clk4_pll : out std_logic; -- выход PLL CLKOUT4 00245 clk5_pll : out std_logic; -- выход PLL CLKOUT5 00246 clk_lock_out : out std_logic; -- 1 - частота установлена 00247 00248 ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ---- 00249 trd_host_adr : out std_logic_vector( 15 downto 0 ); 00250 00251 ---- Шина данных, через которую производиться запись в регистр DATA ---- 00252 trd_host_data : out std_logic_array_16x64; 00253 00254 ---- Шина данных, через которую производиться запись в регистры тетрады ---- 00255 trd_host_cmd_data : out std_logic_array_16x16; 00256 00257 ---- Комада управления для каждой тетрады ---- 00258 trd_host_cmd : out std_logic_array_16xbl_cmd; 00259 00260 ---- Выходы региста DATA от каждой тетрады ---- 00261 trd_data : in std_logic_array_16x64:=(others=>(others=>'0')); 00262 00263 ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ---- 00264 trd_cmd_data : in std_logic_array_16x16:=(others=>(others=>'0')); 00265 00266 ---- Запросы DMA от каждой тетрады ---- 00267 trd_drq : in std_logic_array_16xbl_drq:=(others=>(others=>'0')); 00268 00269 ---- Запросы DMA от тетрады MAIN (после маршрутизации) ---- 00270 trd_main_drq : in std_logic_array_16xbl_drq:=(others=>(others=>'0')); 00271 00272 ---- Регистры управления DMA ---- 00273 trd_main_sel_drq: in std_logic_array_16x6:=(others=>(others=>'0')); 00274 00275 ---- Сброс FIFO от каждой тетрады ---- 00276 trd_reset_fifo : in std_logic_array_16xbl_reset_fifo:=(others=>'0'); 00277 00278 ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ---- 00279 trd_main_irq : in std_logic_array_16xbl_irq:=(others=>'0') 00280 00281 00282 ); 00283 00284 00285 00286 end cl_ambpex5_m5; 00287 00288 00289 architecture cl_ambpex5_m5 of cl_ambpex5_m5 is 00290 00291 --------------------------------------------------------------------------- 00292 00293 component cl_adm_simulation is 00294 00295 generic( 00296 ---- Константы тетрад ---- 00297 trd_rom : in std_logic_array_16xbl_trd_rom:=(others=>(others=>(others=>'0'))); 00298 ---- Разрешение чтения из регистра DATA ---- 00299 trd_in : in std_logic_vector( 15 downto 0 ):=x"0000"; 00300 ---- Разрешение чтения из регистра STATUS ---- 00301 trd_st : in std_logic_vector( 15 downto 0 ):=x"0000"; 00302 00303 PERIOD_CLK : in time:= 10 ns; -- период тактового сигнала 00304 RESET_PAUSE : in time:= 102 ns -- время снятия сигнала RESET 00305 00306 ); 00307 00308 port( 00309 00310 00311 ---- Внутренняя шина ---- 00312 clk_out : out std_logic; 00313 reset_out : out std_logic; 00314 test_mode : in std_logic; -- 1 - тестовый режим 00315 00316 00317 ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ---- 00318 trd_host_adr : out std_logic_vector( 15 downto 0 ); 00319 00320 ---- Шина данных, через которую производиться запись в регистры тетрады ---- 00321 trd_host_data : out std_logic_vector( 63 downto 0 ); 00322 00323 ---- Комада управления для каждой тетрады ---- 00324 trd_host_cmd : out std_logic_array_16xbl_cmd; 00325 00326 ---- Выходы региста DATA от каждой тетрады ---- 00327 trd_data : in std_logic_array_16x64:=(others=>(others=>'0')); 00328 00329 ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ---- 00330 trd_cmd_data : in std_logic_array_16x16:=(others=>(others=>'0')); 00331 00332 ---- Запросы DMA от тетрады MAIN (после маршрутизации) ---- 00333 trd_main_drq : in std_logic_array_16xbl_drq:=(others=>(others=>'0')); 00334 00335 ---- Регистры управления DMA ---- 00336 trd_main_sel_drq: in std_logic_array_16x6:=(others=>(others=>'0')); 00337 00338 ---- Сброс FIFO от каждой тетрады ---- 00339 trd_reset_fifo : in std_logic_array_16xbl_reset_fifo:=(others=>'0'); 00340 00341 ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ---- 00342 trd_main_irq : in std_logic_array_16xbl_irq:=(others=>'0') 00343 00344 00345 ); 00346 00347 end component; 00348 00349 00350 component pcie_core64_m2 is 00351 generic ( 00352 Device_ID : in std_logic_vector( 15 downto 0 ):=x"0000"; -- идентификатор модуля 00353 Revision : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия модуля 00354 PLD_VER : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия ПЛИС 00355 00356 is_simulation : integer:=0 --! 0 - синтез, 1 - моделирование 00357 ); 00358 00359 port ( 00360 00361 ---- PCI-Express ---- 00362 txp : out std_logic_vector( 7 downto 0 ); 00363 txn : out std_logic_vector( 7 downto 0 ); 00364 00365 rxp : in std_logic_vector( 7 downto 0 ); 00366 rxn : in std_logic_vector( 7 downto 0 ); 00367 00368 mgt250 : in std_logic; -- тактовая частота 250 MHz от PCI_Express 00369 00370 perst : in std_logic; -- 0 - сброс 00371 00372 px : out std_logic_vector( 7 downto 0 ); --! контрольные точки 00373 00374 pcie_lstatus : out std_logic_vector( 15 downto 0 ); -- регистр LSTATUS 00375 pcie_link_up : out std_logic; -- 0 - завершена инициализация PCI-Express 00376 00377 00378 ---- Локальная шина ---- 00379 clk250_out : out std_logic; --! тактовая частота 250 MHz 00380 reset_out : out std_logic; --! 0 - сброс 00381 dcm_rstp : out std_logic; --! 1 - сброс DCM 266 МГц 00382 clk : in std_logic; --! тактовая частота локальной шины - 266 МГц 00383 clk_lock : in std_logic; --! 1 - захват частоты 00384 00385 ---- BAR1 ---- 00386 lc_adr : out std_logic_vector( 31 downto 0 ); --! шина адреса 00387 lc_host_data : out std_logic_vector( 63 downto 0 ); --! шина данных - выход 00388 lc_data : in std_logic_vector( 63 downto 0 ); --! шина данных - вход 00389 lc_wr : out std_logic; --! 1 - запись 00390 lc_rd : out std_logic; --! 1 - чтение, данные должны быть на шестой такт после rd 00391 lc_dma_req : in std_logic_vector( 1 downto 0 ); --! 1 - запрос DMA 00392 lc_irq : in std_logic --! 1 - запрос прерывания 00393 00394 00395 00396 ); 00397 end component; 00398 00399 00400 signal mgt250 : std_logic; 00401 signal perst : std_logic; 00402 00403 signal lc_adr : std_logic_vector( 31 downto 0 ); 00404 signal lc_host_data : std_logic_vector( 63 downto 0 ); 00405 signal lc_data : std_logic_vector( 63 downto 0 ); 00406 signal lc_wr : std_logic; 00407 signal lc_rd : std_logic; 00408 signal lc_dma_req : std_logic_vector( 1 downto 0 ); 00409 signal lc_irq : std_logic; 00410 00411 signal irq1 : std_logic; -- 1 - прерывание в HOST 00412 signal dmar0 : std_logic; -- 1 - запрос DMA 0 00413 signal dmar1 : std_logic; -- 1 - запрос DMA 1 00414 signal dmar2 : std_logic; -- 1 - запрос DMA 2 00415 signal dmar3 : std_logic; -- 1 - запрос DMA 3 00416 00417 signal trdi_host_data : std_logic_vector( 63 downto 0 ); 00418 00419 signal dcm_rstp : std_logic; 00420 signal clk_lock : std_logic; 00421 signal clk250 : std_logic; 00422 signal clk200 : std_logic; 00423 signal clk200x : std_logic; 00424 signal clk266x : std_logic; 00425 signal clkfb : std_logic; 00426 00427 signal clk30i : std_logic; 00428 signal cnt30k0 : std_logic; 00429 signal cnt30k1 : std_logic; 00430 signal cnt30k2 : std_logic; 00431 signal cnt30i0 : std_logic; 00432 signal cnt30i1 : std_logic; 00433 signal cnt30i2 : std_logic; 00434 signal cnt30ce0 : std_logic; 00435 signal cnt30ce1 : std_logic; 00436 signal cnt30ce2 : std_logic; 00437 signal cnt30start : std_logic; 00438 signal cnt30start1 : std_logic; 00439 00440 ---- Комада управления для каждой тетрады ---- 00441 signal trdi_host_cmd : std_logic_array_16xbl_cmd; 00442 00443 signal clk : std_logic:='0'; 00444 signal reset : std_logic; 00445 00446 signal pcie_link_up : std_logic; 00447 signal pcie_lstatus : std_logic_vector( 15 downto 0 ); 00448 00449 signal px : std_logic_vector( 7 downto 0 ); 00450 00451 signal trd4_host_data : std_logic_vector( 63 downto 0 ); 00452 00453 attribute period : string; 00454 attribute period of clk:signal is "250 MHz"; 00455 00456 attribute buffer_type : string; 00457 attribute clock_buffer : string; 00458 --attribute clock_buffer of signal_name: signal is "{bufgdll|ibufg|bufgp|ibuf|none}"; 00459 attribute buffer_type of clk_out: signal is "none"; 00460 attribute buffer_type of clk: signal is "none"; 00461 00462 attribute clock_buffer of clk_out : signal is "none"; 00463 attribute clock_buffer of clk : signal is "none"; 00464 attribute clock_buffer of clk200_out : signal is "none"; 00465 00466 attribute syn_keep : boolean; 00467 attribute syn_keep of trd_host_data : signal is true; 00468 attribute syn_keep of trd_host_cmd_data: signal is true; 00469 00470 begin 00471 00472 -- 00473 ------- component PLL_BASE ----- 00474 --xpll: PLL_BASE 00475 -- generic map( 00476 -- BANDWIDTH => BANDWIDTH, 00477 -- CLKFBOUT_MULT => CLKFBOUT_MULT, 00478 -- CLKFBOUT_PHASE => CLKFBOUT_PHASE, 00479 -- CLKIN_PERIOD => CLKIN_PERIOD, 00480 -- CLKOUT0_DIVIDE => CLKOUT0_DIVIDE, 00481 -- CLKOUT0_DUTY_CYCLE => CLKOUT0_DUTY_CYCLE, 00482 -- CLKOUT0_PHASE => CLKOUT0_PHASE, 00483 -- CLKOUT1_DIVIDE => CLKOUT1_DIVIDE, 00484 -- CLKOUT1_DUTY_CYCLE => CLKOUT1_DUTY_CYCLE, 00485 -- CLKOUT1_PHASE => CLKOUT1_PHASE, 00486 -- CLKOUT2_DIVIDE => CLKOUT2_DIVIDE, 00487 -- CLKOUT2_DUTY_CYCLE => CLKOUT2_DUTY_CYCLE, 00488 -- CLKOUT2_PHASE => CLKOUT2_PHASE, 00489 -- CLKOUT3_DIVIDE => CLKOUT3_DIVIDE, 00490 -- CLKOUT3_DUTY_CYCLE => CLKOUT3_DUTY_CYCLE, 00491 -- CLKOUT3_PHASE => CLKOUT3_PHASE, 00492 -- CLKOUT4_DIVIDE => CLKOUT4_DIVIDE, 00493 -- CLKOUT4_DUTY_CYCLE => CLKOUT4_DUTY_CYCLE, 00494 -- CLKOUT4_PHASE => CLKOUT4_PHASE, 00495 -- CLKOUT5_DIVIDE => CLKOUT5_DIVIDE, 00496 -- CLKOUT5_DUTY_CYCLE => CLKOUT5_DUTY_CYCLE, 00497 -- CLKOUT5_PHASE => CLKOUT5_PHASE, 00498 -- CLK_FEEDBACK => CLK_FEEDBACK, 00499 -- COMPENSATION => COMPENSATION, 00500 -- DIVCLK_DIVIDE => DIVCLK_DIVIDE, 00501 -- REF_JITTER => REF_JITTER, 00502 -- RESET_ON_LOSS_OF_LOCK => RESET_ON_LOSS_OF_LOCK 00503 -- ) 00504 -- port map( 00505 -- CLKFBOUT => clkfb, 00506 -- CLKOUT0 => clk266x, 00507 -- CLKOUT1 => clk200x, 00508 -- CLKOUT2 => clk2_pll, 00509 -- CLKOUT3 => clk3_pll, 00510 -- CLKOUT4 => clk4_pll, 00511 -- CLKOUT5 => clk5_pll, 00512 ---- LOCKED => clk_lock, 00513 -- CLKFBIN => clkfb, 00514 -- CLKIN => clk250, 00515 -- RST => dcm_rstp 00516 -- ); 00517 00518 clk_lock <= '1'; 00519 clk <= clk250; 00520 00521 xclk200: bufg port map( clk200, clk200x ); 00522 --xclk266: bufg port map( clk, clk266x ); 00523 clk200_out <= clk200; 00524 clk_lock_out <= clk_lock; 00525 00526 00527 00528 gen_syn: if( is_simulation=0 or is_simulation=2 ) generate 00529 00530 00531 clk_out <= clk; 00532 reset_out <= reset after 1 ns when rising_edge( clk ); 00533 clk30k <= clk30i; 00534 00535 00536 xmgtclk : IBUFDS port map (O => mgt250, I => mgt251_p, IB => mgt251_n ); 00537 xmperst: ibuf port map( perst, bperst ); 00538 00539 00540 pcie: pcie_core64_m2 00541 generic map( 00542 is_simulation => is_simulation-- 0 - синтез, 1 - моделирование 00543 ) 00544 00545 port map( 00546 00547 ---- PCI-Express ---- 00548 txp => txp, 00549 txn => txn, 00550 00551 rxp => rxp, 00552 rxn => rxn, 00553 00554 mgt250 => mgt250, 00555 00556 perst => perst, 00557 00558 px => px , 00559 00560 pcie_lstatus => pcie_lstatus, -- регистр LSTATUS 00561 pcie_link_up => pcie_link_up, -- 0 - завершена инициализация PCI-Express 00562 00563 ---- Локальная шина ---- 00564 clk250_out => clk250, -- тактовая частота 250 MHz 00565 reset_out => reset, -- 0 - сброс 00566 dcm_rstp => dcm_rstp, -- 1 - сброс DCM 266 МГц 00567 clk => clk, -- тактовая частота локальной шины - 266 МГц 00568 clk_lock => clk_lock, -- 1 - захват частоты 00569 00570 lc_adr => lc_adr, -- шина адреса 00571 lc_host_data => lc_host_data, -- шина данных - выход 00572 lc_data => lc_data, -- шина данных - вход 00573 lc_wr => lc_wr, -- 1 - запись 00574 lc_rd => lc_rd, -- 1 - чтение, данные должны быть на четвёртый такт после rd 00575 lc_dma_req => lc_dma_req, -- 1 - запрос DMA 00576 lc_irq => lc_irq-- 1 - запрос прерывания 00577 00578 ); 00579 00580 00581 00582 p(1) <= px(0); -- int_req_fl 00583 p(2) <= px(1); -- int_req_main 00584 p(3) <= px(2); -- int_ack 00585 00586 00587 blink: ctrl_blink 00588 generic map( 00589 is_simulation => is_simulation 00590 ) 00591 port map( 00592 clk => clk250, -- тактовая частота 250 00593 reset => reset, -- 0 - сброс 00594 clk30k => clk30i, -- тактовая частота 30 кГц 00595 00596 pcie_link_up => pcie_link_up, -- 0 - завершена инициализация PCI-Express 00597 pcie_lstatus => pcie_lstatus, -- регистра LSTATUS 00598 00599 led_h1 => led_h1-- светодиод 00600 ); 00601 00602 00603 led_h2 <= reset and not dmar1; 00604 led_h3 <= reset and not dmar0; 00605 led_h4 <= reset and not px(0); 00606 00607 00608 ad: pb_adm_ctrl_m2 00609 generic map ( 00610 ---- Разрешение чтения из регистра DATA ---- 00611 trd1_in => conv_integer( trd_in(1) ), 00612 trd2_in => conv_integer( trd_in(2) ), 00613 trd3_in => conv_integer( trd_in(3) ), 00614 trd4_in => conv_integer( trd_in(4) ), 00615 trd5_in => conv_integer( trd_in(5) ), 00616 trd6_in => conv_integer( trd_in(6) ), 00617 trd7_in => conv_integer( trd_in(7) ), 00618 00619 ---- Разрешение чтения из регистра STATUS ---- 00620 trd1_st => conv_integer( trd_st(1) ), 00621 trd2_st => conv_integer( trd_st(2) ), 00622 trd3_st => conv_integer( trd_st(3) ), 00623 trd4_st => conv_integer( trd_st(4) ), 00624 trd5_st => conv_integer( trd_st(5) ), 00625 trd6_st => conv_integer( trd_st(6) ), 00626 trd7_st => conv_integer( trd_st(7) ), 00627 00628 ---- Константы тетрады ---- 00629 rom0 => trd_rom(0), 00630 rom1 => trd_rom(1), 00631 rom2 => trd_rom(2), 00632 rom3 => trd_rom(3), 00633 rom4 => trd_rom(4), 00634 rom5 => trd_rom(5), 00635 rom6 => trd_rom(6), 00636 rom7 => trd_rom(7) 00637 00638 ) 00639 00640 port map( 00641 ---- GLOBAL ---- 00642 reset => reset, -- 0 - сброс 00643 clk => clk, -- тактовая частота 00644 00645 ---- PLD_BUS ---- 00646 lc_adr => lc_adr( 17 downto 11 ), -- шина адреса 00647 lc_host_data => lc_host_data, -- шина данных, вход 00648 lc_data => lc_data, -- шина данных, выход 00649 lc_wr => lc_wr, -- 1 - запись 00650 lc_rd => lc_rd, -- 1 - чтение 00651 00652 00653 test_mode => test_mode, -- 1 - тестовый режим 00654 00655 ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ---- 00656 trd_host_adr => trd_host_adr( 6 downto 0 ), 00657 00658 ---- Шина данных, через которую производиться запись в регистры тетрады ---- 00659 trd_host_data => trdi_host_data, 00660 00661 ---- Шина данных, через которую производиться запись в регистр DATA тетрады 4 ---- 00662 trd4_host_data => trd4_host_data, 00663 00664 ---- Комада управления для каждой тетрады ---- 00665 trd_host_cmd => trdi_host_cmd, 00666 00667 ---- Выходы региста DATA от каждой тетрады ---- 00668 trd_data => trd_data, 00669 00670 ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ---- 00671 trd_cmd_data => trd_cmd_data, 00672 00673 ---- Сброс FIFO от каждой тетрады ---- 00674 trd_reset_fifo => trd_reset_fifo, 00675 00676 ---- Запросы DMA от каждой тетрады ---- 00677 trd_drq => trd_drq, 00678 00679 ---- Источники прерываний и DRQ ---- 00680 int1 => trd_main_irq(1), 00681 00682 drq0 => trd_main_drq(0), 00683 drq1 => trd_main_drq(1), 00684 drq2 => trd_main_drq(2), 00685 drq3 => trd_main_drq(3), 00686 00687 ---- Выход DRQ и IRQ ---- 00688 irq1 => irq1, 00689 dmar0 => dmar0, 00690 dmar1 => dmar1, 00691 dmar2 => dmar2, 00692 dmar3 => dmar3 00693 00694 ); 00695 00696 00697 00698 00699 lc_dma_req <= dmar1 & dmar0; 00700 lc_irq <= irq1; 00701 00702 end generate; 00703 00704 gen_simulation: if( is_simulation=1 ) generate 00705 00706 clk_out <= clk; 00707 00708 ctrl: cl_adm_simulation 00709 00710 generic map( 00711 ---- Константы тетрад ---- 00712 trd_rom => trd_rom, 00713 ---- Разрешение чтения из регистра DATA ---- 00714 trd_in => trd_in, 00715 ---- Разрешение чтения из регистра STATUS ---- 00716 trd_st => trd_st, 00717 00718 PERIOD_CLK => 4 ns , -- период тактового сигнала 00719 RESET_PAUSE => 102 ns -- время снятия сигнала RESET 00720 00721 ) 00722 00723 port map( 00724 00725 00726 ---- Внутренняя шина ---- 00727 clk_out => clk, 00728 reset_out => reset_out, 00729 test_mode => test_mode, -- 1 - тестовый режим 00730 00731 00732 ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ---- 00733 trd_host_adr => trd_host_adr, 00734 00735 ---- Шина данных, через которую производиться запись в регистры тетрады ---- 00736 trd_host_data => trdi_host_data, 00737 00738 ---- Комада управления для каждой тетрады ---- 00739 trd_host_cmd => trdi_host_cmd, 00740 00741 ---- Выходы региста DATA от каждой тетрады ---- 00742 trd_data => trd_data, 00743 00744 ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ---- 00745 trd_cmd_data => trd_cmd_data, 00746 00747 ---- Запросы DMA от тетрады MAIN (после маршрутизации) ---- 00748 trd_main_drq => trd_main_drq, 00749 00750 ---- Регистры управления DMA ---- 00751 trd_main_sel_drq=> trd_main_sel_drq, 00752 00753 ---- Сброс FIFO от каждой тетрады ---- 00754 trd_reset_fifo => trd_reset_fifo, 00755 00756 ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ---- 00757 trd_main_irq => trd_main_irq 00758 00759 00760 ); 00761 00762 00763 --trd_host_data <= trdi_host_data; 00764 trd4_host_data <= trdi_host_data; 00765 00766 00767 end generate; 00768 00769 ---- Формирование сигналов управления ----- 00770 00771 gen_cmd: for ii in 0 to 7 generate 00772 00773 trd_host_cmd(ii).data_cs <= trdi_host_cmd(ii).data_cs; 00774 trd_host_cmd(ii).data_oe <= '0'; 00775 trd_host_cmd(ii).cmd_data_cs <= trdi_host_cmd(ii).cmd_data_cs; 00776 trd_host_cmd(ii).status_cs <= trdi_host_cmd(ii).status_cs; 00777 00778 trd_host_cmd(ii).data_we <= trdi_host_cmd(ii).data_we after 0.4 ns when rising_edge( clk ); 00779 trd_host_cmd(ii).cmd_data_we <= trdi_host_cmd(ii).cmd_data_we after 0.4 ns when rising_edge( clk ); 00780 trd_host_cmd(ii).cmd_adr_we <= trdi_host_cmd(ii).cmd_adr_we after 0.4 ns when rising_edge( clk ); 00781 00782 trd_host_cmd(ii).adr <= trdi_host_cmd(ii).adr; 00783 00784 gen_data: if( ii/=4 ) generate 00785 --trd_host_data(ii) <= trdi_host_data after 0.4 ns when rising_edge( clk ); 00786 00787 gen_bus: for jj in 0 to 63 generate 00788 attribute syn_keep of xfd : label is true; 00789 begin 00790 xfd: fd port map( q =>trd_host_data(ii)(jj), c =>clk , d =>trdi_host_data(jj) ); 00791 end generate; 00792 00793 end generate; 00794 00795 gen_data_t4: if( ii=4 ) generate 00796 --trd_host_data(ii) <= trd4_host_data after 0.4 ns when rising_edge( clk ); 00797 00798 gen_bus: for jj in 0 to 63 generate 00799 attribute syn_keep of xfd : label is true; 00800 begin 00801 xfd: fd port map( q =>trd_host_data(ii)(jj), c =>clk , d =>trd4_host_data(jj) ); 00802 end generate; 00803 00804 end generate; 00805 00806 trd_host_cmd_data(ii) <= trdi_host_data( 15 downto 0 ) after 0.4 ns when rising_edge( clk ); 00807 00808 end generate; 00809 00810 00811 ---- Формирование частоты 30 кГц ---- 00812 00813 cnt30start <= dcm_rstp after 1 ns when rising_edge( clk250 ); 00814 cnt30start1 <= cnt30start after 1 ns when rising_edge( clk250 ); 00815 00816 cnt30i0 <= ((cnt30start xor cnt30start1) or cnt30k0) and not cnt30start; 00817 cnt30i1 <= ((cnt30start xor cnt30start1) or cnt30k1 )and not cnt30start; 00818 cnt30i2 <= not cnt30k2 and not cnt30start; 00819 cnt30ce1 <= (cnt30start xor cnt30start1) or cnt30k0 or cnt30start; 00820 cnt30ce2 <= (cnt30k1 and cnt30ce1) or cnt30start; 00821 00822 xcnt0: srlc32e port map( q31=>cnt30k0, clk=>clk250, d =>cnt30i0, a =>"11111", ce=>'1' ); 00823 xcnt1: srlc32e port map( q31=>cnt30k1, clk=>clk250, d =>cnt30i1, a =>"11111", ce=>cnt30ce1 ); 00824 xcnt2: srlc32e port map( q =>cnt30k2, clk=>clk250, d=>cnt30i2, a=>"01001", ce=>cnt30ce2 ); 00825 00826 clk30i <= cnt30k2; 00827 00828 end cl_ambpex5_m5; 00829 00830 00831