AMBPEX5_v20_SX50T_CORE
adm/cl_ambpex5/top/cl_ambpex5_m5.vhd
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