OpenCores
URL https://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [adm/] [cl_ml605/] [top/] [cl_ml605.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
 -------------------------------------------------------------------------------
2
--
3
-- Title       : cl_ml605
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8
-- Version     : 1.0
9
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description :        Узел подключения тетрад для модуля ML605
13
--                                      Модификация 1 - Используется pcie_core64_m5
14
--
15
-------------------------------------------------------------------------------
16
--
17
--  Version 1.0  15.08.2011
18
--
19
-------------------------------------------------------------------------------
20
 
21
library ieee;
22
use ieee.std_logic_1164.all;
23
 
24
library work;
25
use work.adm2_pkg.all;
26
 
27
 
28
package cl_ml605_pkg is
29
 
30
constant rom_empty: bl_trd_rom:=(others=>x"0000");
31
 
32
component cl_ml605 is
33
        generic (
34
 
35
                 ---- Параметры PLL ----
36
                 --- CLKOUT5 - 200 МГц ---
37
                 --- CLKOUT6 - 266 МГц ---      
38
 
39
             CLKFBOUT_MULT_F    : real := 16.000;
40
             CLKFBOUT_PHASE     : real := 0.000;
41
             CLKIN1_PERIOD              : real := 4.000;
42
             CLKOUT0_DIVIDE_F   : real := 1.000;
43
             CLKOUT0_DUTY_CYCLE : real := 0.500;
44
             CLKOUT0_PHASE              : real := 0.000;
45
             CLKOUT1_DIVIDE     : integer := 4;
46
             CLKOUT1_DUTY_CYCLE : real := 0.500;
47
             CLKOUT1_PHASE              : real := 0.000;
48
             CLKOUT2_DIVIDE     : integer := 3;
49
             CLKOUT2_DUTY_CYCLE : real := 0.500;
50
             CLKOUT2_PHASE              : real := 0.000;
51
             CLKOUT3_DIVIDE     : integer := 1;
52
             CLKOUT3_DUTY_CYCLE : real := 0.500;
53
             CLKOUT3_PHASE              : real := 0.000;
54
             CLKOUT4_CASCADE    : boolean := FALSE;
55
             CLKOUT4_DIVIDE     : integer := 1;
56
             CLKOUT4_DUTY_CYCLE : real := 0.500;
57
             CLKOUT4_PHASE              : real := 0.000;
58
             CLKOUT5_DIVIDE     : integer := 4;
59
             CLKOUT5_DUTY_CYCLE : real := 0.500;
60
             CLKOUT5_PHASE              : real := 0.000;
61
             CLKOUT6_DIVIDE     : integer := 3;
62
             CLKOUT6_DUTY_CYCLE : real := 0.500;
63
             CLKOUT6_PHASE              : real := 0.000;
64
             CLOCK_HOLD                 : boolean := FALSE;
65
             DIVCLK_DIVIDE              : integer := 5;
66
 
67
 
68
                ---- Константы тетрад ----
69
                trd_rom                 : in std_logic_array_16xbl_trd_rom:=(others=>(others=>(others=>'0')));
70
                ---- Разрешение чтения из регистра DATA ----
71
                trd_in                  : in std_logic_vector( 15 downto 0 ):=x"0000";
72
                ---- Разрешение чтения из регистра STATUS ----
73
                trd_st                  : in std_logic_vector( 15 downto 0 ):=x"0000";
74
 
75
                is_simulation   : integer:=0     -- 0 - синтез, 1 - моделирование ADM
76
        );
77
        port (
78
                ---- PCI-Express ----
79
                txp                             : out std_logic_vector( 3 downto 0 );
80
                txn                             : out std_logic_vector( 3 downto 0 );
81
 
82
                rxp                             : in  std_logic_vector( 3 downto 0 );
83
                rxn                             : in  std_logic_vector( 3 downto 0 );
84
 
85
                mgt100_p                : in  std_logic; -- тактовая частота 100 MHz от PCI_Express
86
                mgt100_n                : in  std_logic;
87
 
88
 
89
                bperst                  : in  std_logic;        -- 0 - сброс                                               
90
 
91
                p                               : out std_logic_vector( 3 downto 1 );
92
 
93
                led_h1                  : out std_logic;        -- 0 - светится светодиод H1
94
                led_h2                  : out std_logic;        -- 0 - светится светодиод H2
95
                led_h3                  : out std_logic;        -- 0 - светится светодиод H3
96
                led_h4                  : out std_logic;        -- 0 - светится светодиод H4
97
 
98
 
99
                ---- Внутренняя шина ----
100
                clk_out                 : out std_logic;        -- тактовая частота
101
                reset_out               : out std_logic;        -- 0 - сброс
102
                test_mode               : in std_logic;         -- 1 - тестовый режим
103
                clk30k                  : out std_logic;        -- тактовая частота 30 кГц
104
 
105
                clk200_out              : out std_logic;        -- тактовая частота 200 МГц
106
 
107
                clk0_pll                : out std_logic;        -- выход PLL CLKOUT0 
108
                clk0_pll_b              : out std_logic;        -- выход PLL CLKOUT0B 
109
 
110
                clk1_pll                : out std_logic;        -- выход PLL CLKOUT1 
111
                clk1_pll_b              : out std_logic;        -- выход PLL CLKOUT1B 
112
 
113
                clk2_pll                : out std_logic;        -- выход PLL CLKOUT2 
114
                clk2_pll_b              : out std_logic;        -- выход PLL CLKOUT2B 
115
 
116
                clk3_pll                : out std_logic;        -- выход PLL CLKOUT3 
117
                clk3_pll_b              : out std_logic;        -- выход PLL CLKOUT3B 
118
 
119
                clk4_pll                : out std_logic;        -- выход PLL CLKOUT4 
120
 
121
 
122
                clk_lock_out    : out std_logic;        -- 1 - частота установлена 
123
 
124
                ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ----               
125
                trd_host_adr    : out std_logic_vector( 15 downto 0 );
126
 
127
                ---- Шина данных, через которую производиться запись в регистр DATA ----                
128
                trd_host_data   : out std_logic_array_16x64;
129
 
130
                ---- Шина данных, через которую производиться запись в регистры тетрады ----            
131
                trd_host_cmd_data       : out std_logic_array_16x16;
132
 
133
                ---- Комада управления для каждой тетрады ----          
134
                trd_host_cmd    : out std_logic_array_16xbl_cmd;
135
 
136
                ---- Выходы региста DATA от каждой тетрады ----
137
                trd_data                : in  std_logic_array_16x64:=(others=>(others=>'0'));
138
 
139
                ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ----
140
                trd_cmd_data    : in  std_logic_array_16x16:=(others=>(others=>'0'));
141
 
142
                ---- Запросы DMA от каждой тетрады ----
143
                trd_drq                 : in  std_logic_array_16xbl_drq:=(others=>(others=>'0'));
144
 
145
                ---- Запросы DMA от тетрады MAIN (после маршрутизации) ----
146
                trd_main_drq    : in  std_logic_array_16xbl_drq:=(others=>(others=>'0'));
147
 
148
                ---- Регистры управления DMA ----
149
                trd_main_sel_drq: in  std_logic_array_16x6:=(others=>(others=>'0'));
150
 
151
                ---- Сброс FIFO от каждой тетрады ----
152
                trd_reset_fifo  : in  std_logic_array_16xbl_reset_fifo:=(others=>'0');
153
 
154
                ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ----
155
                trd_main_irq    : in std_logic_array_16xbl_irq:=(others=>'0')
156
 
157
 
158
        );
159
end component;
160
 
161
end package;
162
 
163
 
164
 
165
library ieee;
166
use ieee.std_logic_1164.all;
167
use ieee.std_logic_arith.all;
168
use ieee.std_logic_unsigned.all;
169
 
170
library unisim;
171
use unisim.vcomponents.all;
172
 
173
library work;
174
use work.adm2_pkg.all;
175
 
176
use work.pb_adm_ctrl_m2_pkg.all;
177
use work.ctrl_blink_pkg.all;
178
 
179
 
180
 
181
entity cl_ml605 is
182
        generic (
183
 
184
                 ---- Параметры PLL ----
185
                 --- CLKOUT5 - 200 МГц ---
186
                 --- CLKOUT6 - 266 МГц ---      
187
 
188
             CLKFBOUT_MULT_F    : real := 16.000;
189
             CLKFBOUT_PHASE     : real := 0.000;
190
             CLKIN1_PERIOD              : real := 4.000;
191
             CLKOUT0_DIVIDE_F   : real := 1.000;
192
             CLKOUT0_DUTY_CYCLE : real := 0.500;
193
             CLKOUT0_PHASE              : real := 0.000;
194
             CLKOUT1_DIVIDE     : integer := 4;
195
             CLKOUT1_DUTY_CYCLE : real := 0.500;
196
             CLKOUT1_PHASE              : real := 0.000;
197
             CLKOUT2_DIVIDE     : integer := 3;
198
             CLKOUT2_DUTY_CYCLE : real := 0.500;
199
             CLKOUT2_PHASE              : real := 0.000;
200
             CLKOUT3_DIVIDE     : integer := 1;
201
             CLKOUT3_DUTY_CYCLE : real := 0.500;
202
             CLKOUT3_PHASE              : real := 0.000;
203
             CLKOUT4_CASCADE    : boolean := FALSE;
204
             CLKOUT4_DIVIDE     : integer := 1;
205
             CLKOUT4_DUTY_CYCLE : real := 0.500;
206
             CLKOUT4_PHASE              : real := 0.000;
207
             CLKOUT5_DIVIDE     : integer := 4;
208
             CLKOUT5_DUTY_CYCLE : real := 0.500;
209
             CLKOUT5_PHASE              : real := 0.000;
210
             CLKOUT6_DIVIDE     : integer := 3;
211
             CLKOUT6_DUTY_CYCLE : real := 0.500;
212
             CLKOUT6_PHASE              : real := 0.000;
213
             CLOCK_HOLD                 : boolean := FALSE;
214
             DIVCLK_DIVIDE              : integer := 5;
215
 
216
 
217
                ---- Константы тетрад ----
218
                trd_rom                 : in std_logic_array_16xbl_trd_rom:=(others=>(others=>(others=>'0')));
219
                ---- Разрешение чтения из регистра DATA ----
220
                trd_in                  : in std_logic_vector( 15 downto 0 ):=x"0000";
221
                ---- Разрешение чтения из регистра STATUS ----
222
                trd_st                  : in std_logic_vector( 15 downto 0 ):=x"0000";
223
 
224
                is_simulation   : integer:=0     -- 0 - синтез, 1 - моделирование ADM
225
        );
226
        port (
227
                ---- PCI-Express ----
228
                txp                             : out std_logic_vector( 3 downto 0 );
229
                txn                             : out std_logic_vector( 3 downto 0 );
230
 
231
                rxp                             : in  std_logic_vector( 3 downto 0 );
232
                rxn                             : in  std_logic_vector( 3 downto 0 );
233
 
234
                mgt100_p                : in  std_logic; -- тактовая частота 100 MHz от PCI_Express
235
                mgt100_n                : in  std_logic;
236
 
237
 
238
                bperst                  : in  std_logic;        -- 0 - сброс                                               
239
 
240
                p                               : out std_logic_vector( 3 downto 1 );
241
 
242
                led_h1                  : out std_logic;        -- 0 - светится светодиод H1
243
                led_h2                  : out std_logic;        -- 0 - светится светодиод H2
244
                led_h3                  : out std_logic;        -- 0 - светится светодиод H3
245
                led_h4                  : out std_logic;        -- 0 - светится светодиод H4
246
 
247
 
248
                ---- Внутренняя шина ----
249
                clk_out                 : out std_logic;        -- тактовая частота
250
                reset_out               : out std_logic;        -- 0 - сброс
251
                test_mode               : in std_logic;         -- 1 - тестовый режим
252
                clk30k                  : out std_logic;        -- тактовая частота 30 кГц
253
 
254
                clk200_out              : out std_logic;        -- тактовая частота 200 МГц
255
 
256
                clk0_pll                : out std_logic;        -- выход PLL CLKOUT0 
257
                clk0_pll_b              : out std_logic;        -- выход PLL CLKOUT0B 
258
 
259
                clk1_pll                : out std_logic;        -- выход PLL CLKOUT1 
260
                clk1_pll_b              : out std_logic;        -- выход PLL CLKOUT1B 
261
 
262
                clk2_pll                : out std_logic;        -- выход PLL CLKOUT2 
263
                clk2_pll_b              : out std_logic;        -- выход PLL CLKOUT2B 
264
 
265
                clk3_pll                : out std_logic;        -- выход PLL CLKOUT3 
266
                clk3_pll_b              : out std_logic;        -- выход PLL CLKOUT3B 
267
 
268
                clk4_pll                : out std_logic;        -- выход PLL CLKOUT4 
269
 
270
                clk_lock_out    : out std_logic;        -- 1 - частота установлена 
271
 
272
                ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ----               
273
                trd_host_adr    : out std_logic_vector( 15 downto 0 );
274
 
275
                ---- Шина данных, через которую производиться запись в регистр DATA ----                
276
                trd_host_data   : out std_logic_array_16x64;
277
 
278
                ---- Шина данных, через которую производиться запись в регистры тетрады ----            
279
                trd_host_cmd_data       : out std_logic_array_16x16;
280
 
281
                ---- Комада управления для каждой тетрады ----          
282
                trd_host_cmd    : out std_logic_array_16xbl_cmd;
283
 
284
                ---- Выходы региста DATA от каждой тетрады ----
285
                trd_data                : in  std_logic_array_16x64:=(others=>(others=>'0'));
286
 
287
                ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ----
288
                trd_cmd_data    : in  std_logic_array_16x16:=(others=>(others=>'0'));
289
 
290
                ---- Запросы DMA от каждой тетрады ----
291
                trd_drq                 : in  std_logic_array_16xbl_drq:=(others=>(others=>'0'));
292
 
293
                ---- Запросы DMA от тетрады MAIN (после маршрутизации) ----
294
                trd_main_drq    : in  std_logic_array_16xbl_drq:=(others=>(others=>'0'));
295
 
296
                ---- Регистры управления DMA ----
297
                trd_main_sel_drq: in  std_logic_array_16x6:=(others=>(others=>'0'));
298
 
299
                ---- Сброс FIFO от каждой тетрады ----
300
                trd_reset_fifo  : in  std_logic_array_16xbl_reset_fifo:=(others=>'0');
301
 
302
                ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ----
303
                trd_main_irq    : in std_logic_array_16xbl_irq:=(others=>'0')
304
 
305
 
306
        );
307
 
308
 
309
 
310
end cl_ml605;
311
 
312
 
313
architecture cl_ml605 of cl_ml605 is
314
 
315
---------------------------------------------------------------------------
316
 
317
component cl_adm_simulation is
318
 
319
        generic(
320
                        ---- Константы тетрад ----
321
                        trd_rom                 : in std_logic_array_16xbl_trd_rom:=(others=>(others=>(others=>'0')));
322
                        ---- Разрешение чтения из регистра DATA ----
323
                        trd_in                  : in std_logic_vector( 15 downto 0 ):=x"0000";
324
                        ---- Разрешение чтения из регистра STATUS ----
325
                        trd_st                  : in std_logic_vector( 15 downto 0 ):=x"0000";
326
 
327
                        PERIOD_CLK              : in time:= 10 ns;      -- период тактового сигнала
328
                        RESET_PAUSE             : in time:= 102 ns      -- время снятия сигнала RESET
329
 
330
        );
331
 
332
        port(
333
 
334
 
335
                ---- Внутренняя шина ----
336
                clk_out                 : out std_logic;
337
                reset_out               : out std_logic;
338
                test_mode               : in std_logic;         -- 1 - тестовый режим
339
 
340
 
341
                ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ----               
342
                trd_host_adr    : out std_logic_vector( 15 downto 0 );
343
 
344
                ---- Шина данных, через которую производиться запись в регистры тетрады ----            
345
                trd_host_data   : out std_logic_vector( 63 downto 0 );
346
 
347
                ---- Комада управления для каждой тетрады ----          
348
                trd_host_cmd    : out std_logic_array_16xbl_cmd;
349
 
350
                ---- Выходы региста DATA от каждой тетрады ----
351
                trd_data                : in  std_logic_array_16x64:=(others=>(others=>'0'));
352
 
353
                ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ----
354
                trd_cmd_data    : in  std_logic_array_16x16:=(others=>(others=>'0'));
355
 
356
                ---- Запросы DMA от тетрады MAIN (после маршрутизации) ----
357
                trd_main_drq    : in  std_logic_array_16xbl_drq:=(others=>(others=>'0'));
358
 
359
                ---- Регистры управления DMA ----
360
                trd_main_sel_drq: in  std_logic_array_16x6:=(others=>(others=>'0'));
361
 
362
                ---- Сброс FIFO от каждой тетрады ----
363
                trd_reset_fifo  : in  std_logic_array_16xbl_reset_fifo:=(others=>'0');
364
 
365
                ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ----
366
                trd_main_irq    : in std_logic_array_16xbl_irq:=(others=>'0')
367
 
368
 
369
        );
370
 
371
end component;
372
 
373
 
374
component pcie_core64_m5 is
375
        generic (
376
                Device_ID               : in std_logic_vector( 15 downto 0 ):=x"0000"; -- идентификатор модуля
377
                Revision                : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия модуля
378
                PLD_VER                 : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия ПЛИС
379
 
380
                refclk                  : integer:=100;         --! Значение опорной тактовой частоты [МГц]
381
                is_simulation   : integer:=0     --! 0 - синтез, 1 - моделирование 
382
        );
383
 
384
        port (
385
 
386
                ---- PCI-Express ----
387
                txp                             : out std_logic_vector( 3 downto 0 );
388
                txn                             : out std_logic_vector( 3 downto 0 );
389
 
390
                rxp                             : in  std_logic_vector( 3 downto 0 );
391
                rxn                             : in  std_logic_vector( 3 downto 0 );
392
 
393
                mgt250                  : in  std_logic; -- тактовая частота 250 MHz от PCI_Express
394
 
395
                perst                   : in  std_logic;        -- 0 - сброс                                               
396
 
397
                px                              : out std_logic_vector( 7 downto 0 );    --! контрольные точки 
398
 
399
                pcie_lstatus    : out std_logic_vector( 15 downto 0 ); -- регистр LSTATUS
400
                pcie_link_up    : out std_logic;        -- 0 - завершена инициализация PCI-Express
401
 
402
 
403
                ---- Локальная шина ----                          
404
                clk250_out              : out std_logic;                --! тактовая частота 250 MHz              
405
                reset_out               : out std_logic;                --! 0 - сброс
406
                dcm_rstp                : out std_logic;                --! 1 - сброс DCM 266 МГц
407
                clk                             : in std_logic;                 --! тактовая частота локальной шины - 266 МГц
408
                clk_lock                : in std_logic;                 --! 1 - захват частоты
409
 
410
                ---- BAR1 ----
411
                lc_adr                  : out std_logic_vector( 31 downto 0 );   --! шина адреса
412
                lc_host_data    : out std_logic_vector( 63 downto 0 );   --! шина данных - выход
413
                lc_data                 : in  std_logic_vector( 63 downto 0 );   --! шина данных - вход
414
                lc_wr                   : out std_logic;        --! 1 - запись
415
                lc_rd                   : out std_logic;        --! 1 - чтение, данные должны быть на шестой такт после rd 
416
                lc_dma_req              : in  std_logic_vector( 1 downto 0 );    --! 1 - запрос DMA
417
                lc_irq                  : in  std_logic         --! 1 - запрос прерывания 
418
 
419
 
420
 
421
        );
422
end component;
423
 
424
component pcie_core64_m7 is
425
        generic (
426
                Device_ID               : in std_logic_vector( 15 downto 0 ):=x"0000"; -- идентификатор модуля
427
                Revision                : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия модуля
428
                PLD_VER                 : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия ПЛИС
429
 
430
                refclk                  : integer:=100;         --! Значение опорной тактовой частоты [МГц]
431
                is_simulation   : integer:=0     --! 0 - синтез, 1 - моделирование 
432
        );
433
 
434
        port (
435
 
436
                ---- PCI-Express ----
437
                txp                             : out std_logic_vector( 3 downto 0 );
438
                txn                             : out std_logic_vector( 3 downto 0 );
439
 
440
                rxp                             : in  std_logic_vector( 3 downto 0 );
441
                rxn                             : in  std_logic_vector( 3 downto 0 );
442
 
443
                mgt250                  : in  std_logic; -- тактовая частота 250 MHz от PCI_Express
444
 
445
                perst                   : in  std_logic;        -- 0 - сброс                                               
446
 
447
                px                              : out std_logic_vector( 7 downto 0 );    --! контрольные точки 
448
 
449
                pcie_lstatus    : out std_logic_vector( 15 downto 0 ); -- регистр LSTATUS
450
                pcie_link_up    : out std_logic;        -- 0 - завершена инициализация PCI-Express
451
 
452
 
453
                ---- Локальная шина ----                          
454
                clk250_out              : out std_logic;                --! тактовая частота 250 MHz              
455
                reset_out               : out std_logic;                --! 0 - сброс
456
                dcm_rstp                : out std_logic;                --! 1 - сброс DCM 266 МГц
457
                clk                             : in std_logic;                 --! тактовая частота локальной шины - 266 МГц
458
                clk_lock                : in std_logic;                 --! 1 - захват частоты
459
 
460
                ---- BAR1 ----
461
                lc_adr                  : out std_logic_vector( 31 downto 0 );   --! шина адреса
462
                lc_host_data    : out std_logic_vector( 63 downto 0 );   --! шина данных - выход
463
                lc_data                 : in  std_logic_vector( 63 downto 0 );   --! шина данных - вход
464
                lc_wr                   : out std_logic;        --! 1 - запись
465
                lc_rd                   : out std_logic;        --! 1 - чтение, данные должны быть на шестой такт после rd 
466
                lc_dma_req              : in  std_logic_vector( 1 downto 0 );    --! 1 - запрос DMA
467
                lc_irq                  : in  std_logic         --! 1 - запрос прерывания 
468
 
469
 
470
 
471
        );
472
end component;
473
 
474
 
475
signal  mgt100                  : std_logic;
476
signal  perst                   : std_logic;
477
 
478
signal  lc_adr                  : std_logic_vector( 31 downto 0 );
479
signal  lc_host_data    : std_logic_vector( 63 downto 0 );
480
signal  lc_data                 : std_logic_vector( 63 downto 0 );
481
signal  lc_wr                   : std_logic;
482
signal  lc_rd                   : std_logic;
483
signal  lc_dma_req              : std_logic_vector( 1 downto 0 );
484
signal  lc_irq                  : std_logic;
485
 
486
signal  irq1                    : std_logic;    -- 1 - прерывание в HOST
487
signal  dmar0                   : std_logic;    -- 1 - запрос DMA 0
488
signal  dmar1                   : std_logic;    -- 1 - запрос DMA 1
489
signal  dmar2                   : std_logic;    -- 1 - запрос DMA 2
490
signal  dmar3                   : std_logic;    -- 1 - запрос DMA 3               
491
 
492
signal  trdi_host_data  : std_logic_vector( 63 downto 0 );
493
 
494
signal  dcm_rstp                : std_logic;
495
signal  clk_lock                : std_logic;
496
signal  clk250                  : std_logic;
497
signal  clk200                  : std_logic;
498
signal  clk200x                 : std_logic;
499
signal  clk266x                 : std_logic;
500
signal  clkfb                   : std_logic;
501
 
502
signal  clk30i                  : std_logic;
503
signal  cnt30k0                 : std_logic;
504
signal  cnt30k1                 : std_logic;
505
signal  cnt30k2                 : std_logic;
506
signal  cnt30i0                 : std_logic;
507
signal  cnt30i1                 : std_logic;
508
signal  cnt30i2                 : std_logic;
509
signal  cnt30ce0                : std_logic;
510
signal  cnt30ce1                : std_logic;
511
signal  cnt30ce2                : std_logic;
512
signal  cnt30start              : std_logic;
513
signal  cnt30start1             : std_logic;
514
 
515
---- Комада управления для каждой тетрады ----
516
signal trdi_host_cmd        : std_logic_array_16xbl_cmd;
517
 
518
signal  clk                             : std_logic:='0';
519
signal  reset                   : std_logic;
520
 
521
signal  pcie_link_up    : std_logic;
522
signal  pcie_lstatus    : std_logic_vector( 15 downto 0 );
523
 
524
signal  px                              : std_logic_vector( 7 downto 0 );
525
 
526
signal  trd4_host_data  : std_logic_vector( 63 downto 0 );
527
 
528
attribute       period  : string;
529
attribute       period of clk:signal is "250 MHz";
530
 
531
attribute buffer_type   : string;
532
attribute clock_buffer  : string;
533
--attribute clock_buffer of signal_name: signal is "{bufgdll|ibufg|bufgp|ibuf|none}";   
534
attribute buffer_type  of clk_out: signal is "none";
535
attribute buffer_type  of clk: signal is "none";
536
 
537
attribute clock_buffer of clk_out               : signal is "none";
538
attribute clock_buffer of clk                   : signal is "none";
539
attribute clock_buffer of clk200_out    : signal is "none";
540
 
541
attribute syn_keep      : boolean;
542
attribute syn_keep of trd_host_data : signal is true;
543
attribute syn_keep of trd_host_cmd_data: signal is true;
544
 
545
begin
546
 
547
--      
548
------- component PLL_BASE -----
549
--xpll: PLL_BASE
550
--  generic map(
551
--     BANDWIDTH                                        => BANDWIDTH,                                
552
--     CLKFBOUT_MULT                            => CLKFBOUT_MULT,                            
553
--     CLKFBOUT_PHASE                   => CLKFBOUT_PHASE,                   
554
--     CLKIN_PERIOD                             => CLKIN_PERIOD,                             
555
--     CLKOUT0_DIVIDE                   => CLKOUT0_DIVIDE,                   
556
--     CLKOUT0_DUTY_CYCLE               => CLKOUT0_DUTY_CYCLE,       
557
--     CLKOUT0_PHASE                            => CLKOUT0_PHASE,                            
558
--     CLKOUT1_DIVIDE                   => CLKOUT1_DIVIDE,                   
559
--     CLKOUT1_DUTY_CYCLE               => CLKOUT1_DUTY_CYCLE,       
560
--     CLKOUT1_PHASE                            => CLKOUT1_PHASE,                            
561
--     CLKOUT2_DIVIDE                   => CLKOUT2_DIVIDE,                   
562
--     CLKOUT2_DUTY_CYCLE               => CLKOUT2_DUTY_CYCLE,       
563
--     CLKOUT2_PHASE                            => CLKOUT2_PHASE,                            
564
--     CLKOUT3_DIVIDE                   => CLKOUT3_DIVIDE,                   
565
--     CLKOUT3_DUTY_CYCLE               => CLKOUT3_DUTY_CYCLE,       
566
--     CLKOUT3_PHASE                            => CLKOUT3_PHASE,                            
567
--     CLKOUT4_DIVIDE                   => CLKOUT4_DIVIDE,                   
568
--     CLKOUT4_DUTY_CYCLE               => CLKOUT4_DUTY_CYCLE,       
569
--     CLKOUT4_PHASE                            => CLKOUT4_PHASE,                            
570
--     CLKOUT5_DIVIDE                   => CLKOUT5_DIVIDE,                   
571
--     CLKOUT5_DUTY_CYCLE               => CLKOUT5_DUTY_CYCLE,       
572
--     CLKOUT5_PHASE                            => CLKOUT5_PHASE,                            
573
--     CLK_FEEDBACK                             => CLK_FEEDBACK,                             
574
--     COMPENSATION                             => COMPENSATION,                             
575
--     DIVCLK_DIVIDE                            => DIVCLK_DIVIDE,                            
576
--     REF_JITTER                               => REF_JITTER,                       
577
--     RESET_ON_LOSS_OF_LOCK            => RESET_ON_LOSS_OF_LOCK             
578
--  )
579
--  port map(
580
--     CLKFBOUT         => clkfb,
581
--     CLKOUT0  => clk266x,
582
--     CLKOUT1  => clk200x,
583
--     CLKOUT2  => clk2_pll,
584
--     CLKOUT3  => clk3_pll,
585
--     CLKOUT4  => clk4_pll,
586
--     CLKOUT5  => clk5_pll,
587
----     LOCKED         => clk_lock,
588
--     CLKFBIN  => clkfb,
589
--     CLKIN            => clk250,
590
--     RST              => dcm_rstp
591
--  );
592
 
593
xpll: MMCM_BASE
594
  generic map(
595
     BANDWIDTH                  => "OPTIMIZED",
596
     CLKFBOUT_MULT_F    => CLKFBOUT_MULT_F,
597
     CLKFBOUT_PHASE     => CLKFBOUT_PHASE,
598
     CLKIN1_PERIOD              => CLKIN1_PERIOD,
599
     CLKOUT0_DIVIDE_F   => CLKOUT0_DIVIDE_F,
600
     CLKOUT0_DUTY_CYCLE => CLKOUT0_DUTY_CYCLE,
601
     CLKOUT0_PHASE              => CLKOUT0_PHASE,
602
     CLKOUT1_DIVIDE     => CLKOUT1_DIVIDE,
603
     CLKOUT1_DUTY_CYCLE => CLKOUT1_DUTY_CYCLE,
604
     CLKOUT1_PHASE              => CLKOUT1_PHASE,
605
     CLKOUT2_DIVIDE     => CLKOUT2_DIVIDE,
606
     CLKOUT2_DUTY_CYCLE => CLKOUT2_DUTY_CYCLE,
607
     CLKOUT2_PHASE              => CLKOUT2_PHASE,
608
     CLKOUT3_DIVIDE     => CLKOUT3_DIVIDE,
609
     CLKOUT3_DUTY_CYCLE => CLKOUT3_DUTY_CYCLE,
610
     CLKOUT3_PHASE              => CLKOUT3_PHASE,
611
     CLKOUT4_CASCADE    => CLKOUT4_CASCADE,
612
     CLKOUT4_DIVIDE     => CLKOUT4_DIVIDE,
613
     CLKOUT4_DUTY_CYCLE => CLKOUT4_DUTY_CYCLE,
614
     CLKOUT4_PHASE              => CLKOUT4_PHASE,
615
     CLKOUT5_DIVIDE     => CLKOUT5_DIVIDE,
616
     CLKOUT5_DUTY_CYCLE => CLKOUT5_DUTY_CYCLE,
617
     CLKOUT5_PHASE              => CLKOUT5_PHASE,
618
     CLKOUT6_DIVIDE     => CLKOUT6_DIVIDE,
619
     CLKOUT6_DUTY_CYCLE => CLKOUT6_DUTY_CYCLE,
620
     CLKOUT6_PHASE              => CLKOUT6_PHASE,
621
     CLOCK_HOLD                 => CLOCK_HOLD,
622
     DIVCLK_DIVIDE              => DIVCLK_DIVIDE
623
--     REF_JITTER1 : real := 0.010;
624
--     STARTUP_WAIT : boolean := FALSE
625
  )
626
  port map(
627
     CLKFBOUT   => clkfb,
628
     --CLKFBOUTB        : out std_ulogic;
629
     CLKOUT0    => clk0_pll,
630
     CLKOUT0B   => clk0_pll_b,
631
     CLKOUT1    => clk1_pll,
632
     CLKOUT1B   => clk1_pll_b,
633
     CLKOUT2    => clk2_pll,
634
     CLKOUT2B   => clk2_pll_b,
635
     CLKOUT3    => clk3_pll,
636
     CLKOUT3B   => clk3_pll_b,
637
     CLKOUT4    => clk4_pll,
638
     CLKOUT5    => clk200x,
639
     CLKOUT6    => clk266x,
640
     LOCKED     => clk_lock,
641
     CLKFBIN    => clkfb,
642
     CLKIN1     => clk250,
643
     PWRDWN     => '0',
644
     RST                => dcm_rstp
645
  );
646
--clk_lock <= '1';
647
clk <= clk250;
648
 
649
xclk200: bufg port map( clk200, clk200x );
650
--xclk266: bufg port map( clk, clk266x );
651
clk200_out <= clk200;
652
clk_lock_out <= clk_lock;
653
 
654
 
655
 
656
gen_syn: if( is_simulation=0 or  is_simulation=2 ) generate
657
 
658
 
659
clk_out <= clk;
660
reset_out <= reset after 1 ns when rising_edge( clk );
661
clk30k <= clk30i;
662
 
663
 
664
--xmgtclk : IBUFDS  port map (O => mgt100, I => mgt100_p, IB => mgt100_n );        
665
 
666
refclk_ibuf : IBUFDS_GTXE1
667
     port map(
668
       O       => mgt100,
669
       ODIV2   => open,
670
       I       => mgt100_p,
671
       IB      => mgt100_n,
672
       CEB     => '0'
673
          );
674
 
675
xmperst: ibuf port map( perst, bperst );
676
 
677
 
678
pcie: pcie_core64_m5
679
generic map(
680
                refclk                  =>100,                          --! Значение опорной тактовой частоты [МГц]
681
                is_simulation   => is_simulation        -- 0 - синтез, 1 - моделирование 
682
        )
683
 
684
        port map(
685
 
686
                ---- PCI-Express ----
687
                txp                             => txp,
688
                txn                             => txn,
689
 
690
                rxp                             => rxp,
691
                rxn                             => rxn,
692
 
693
                mgt250                  => mgt100,
694
 
695
                perst                   => perst,
696
 
697
                px                              => px,
698
 
699
                pcie_lstatus    => pcie_lstatus,         -- регистр LSTATUS
700
                pcie_link_up    => pcie_link_up,         -- 0 - завершена инициализация PCI-Express
701
 
702
                ---- Локальная шина ----                          
703
                clk250_out              => clk250,                      -- тактовая частота 250 MHz               
704
                reset_out               => reset,                       -- 0 - сброс
705
                dcm_rstp                => dcm_rstp,            -- 1 - сброс DCM 266 МГц 
706
                clk                             => clk,                         -- тактовая частота локальной шины - 266 МГц
707
                clk_lock                => clk_lock,            -- 1 - захват частоты
708
 
709
                lc_adr                  => lc_adr,                      -- шина адреса
710
                lc_host_data    => lc_host_data,        -- шина данных - выход
711
                lc_data                 => lc_data,                     -- шина данных - вход
712
                lc_wr                   => lc_wr,                       -- 1 - запись
713
                lc_rd                   => lc_rd,                       -- 1 - чтение, данные должны быть на четвёртый такт после rd
714
                lc_dma_req              => lc_dma_req,          -- 1 - запрос DMA
715
                lc_irq                  => lc_irq                       -- 1 - запрос прерывания 
716
 
717
        );
718
 
719
 
720
 
721
p(1) <= px(0); -- int_req_fl
722
p(2) <= px(1); -- int_req_main
723
p(3) <= px(2); -- int_ack
724
 
725
 
726
blink:  ctrl_blink
727
        generic map(
728
                is_simulation   => is_simulation
729
        )
730
        port map(
731
                clk                             => clk250,              -- тактовая частота 250 
732
                reset                   => reset,       -- 0 - сброс
733
                clk30k                  => clk30i,      -- тактовая частота 30 кГц
734
 
735
                pcie_link_up    => pcie_link_up,        -- 0 - завершена инициализация PCI-Express
736
                pcie_lstatus    => pcie_lstatus,        -- регистра LSTATUS
737
 
738
                led_h1                  => led_h1               -- светодиод
739
        );
740
 
741
 
742
led_h2 <= reset and not dmar1;
743
led_h3 <= reset and not dmar0;
744
led_h4 <= reset and not px(0);
745
 
746
 
747
ad:     pb_adm_ctrl_m2
748
        generic map (
749
                ---- Разрешение чтения из регистра DATA ----
750
                trd1_in         => conv_integer( trd_in(1) ),
751
                trd2_in         => conv_integer( trd_in(2) ),
752
                trd3_in         => conv_integer( trd_in(3) ),
753
                trd4_in         => conv_integer( trd_in(4) ),
754
                trd5_in         => conv_integer( trd_in(5) ),
755
                trd6_in         => conv_integer( trd_in(6) ),
756
                trd7_in         => conv_integer( trd_in(7) ),
757
 
758
                ---- Разрешение чтения из регистра STATUS ----
759
                trd1_st         => conv_integer( trd_st(1) ),
760
                trd2_st         => conv_integer( trd_st(2) ),
761
                trd3_st         => conv_integer( trd_st(3) ),
762
                trd4_st         => conv_integer( trd_st(4) ),
763
                trd5_st         => conv_integer( trd_st(5) ),
764
                trd6_st         => conv_integer( trd_st(6) ),
765
                trd7_st         => conv_integer( trd_st(7) ),
766
 
767
                ---- Константы тетрады ----
768
                rom0            => trd_rom(0),
769
                rom1            => trd_rom(1),
770
                rom2            => trd_rom(2),
771
                rom3            => trd_rom(3),
772
                rom4            => trd_rom(4),
773
                rom5            => trd_rom(5),
774
                rom6            => trd_rom(6),
775
                rom7            => trd_rom(7)
776
 
777
        )
778
 
779
        port map(
780
                ---- GLOBAL ----
781
                reset                   => reset,                       -- 0 - сброс
782
                clk                             => clk,                         -- тактовая частота
783
 
784
                ---- PLD_BUS ----
785
                lc_adr                  => lc_adr( 17 downto 11 ),      -- шина адреса
786
                lc_host_data    => lc_host_data,        -- шина данных, вход
787
                lc_data                 => lc_data,                     -- шина данных, выход
788
                lc_wr                   => lc_wr,                       -- 1 - запись
789
                lc_rd                   => lc_rd,                       -- 1 - чтение
790
 
791
 
792
                test_mode               => test_mode,                   -- 1 - тестовый режим
793
 
794
                ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ----               
795
                trd_host_adr    => trd_host_adr( 6 downto 0 ),
796
 
797
                ---- Шина данных, через которую производиться запись в регистры тетрады ----            
798
                trd_host_data   => trdi_host_data,
799
 
800
                ---- Шина данных, через которую производиться запись в регистр DATA тетрады 4 ----              
801
                trd4_host_data  => trd4_host_data,
802
 
803
                ---- Комада управления для каждой тетрады ----          
804
                trd_host_cmd    => trdi_host_cmd,
805
 
806
                ---- Выходы региста DATA от каждой тетрады ----
807
                trd_data                => trd_data,
808
 
809
                ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ----
810
                trd_cmd_data    => trd_cmd_data,
811
 
812
                ---- Сброс FIFO от каждой тетрады ----
813
                trd_reset_fifo  => trd_reset_fifo,
814
 
815
                ---- Запросы DMA от каждой тетрады ----
816
                trd_drq                 => trd_drq,
817
 
818
                ---- Источники прерываний и DRQ ----
819
                int1                    => trd_main_irq(1),
820
 
821
                drq0                    => trd_main_drq(0),
822
                drq1                    => trd_main_drq(1),
823
                drq2                    => trd_main_drq(2),
824
                drq3                    => trd_main_drq(3),
825
 
826
                ---- Выход DRQ и IRQ ----
827
                irq1                    => irq1,
828
                dmar0                   => dmar0,
829
                dmar1                   => dmar1,
830
                dmar2                   => dmar2,
831
                dmar3                   => dmar3
832
 
833
        );
834
 
835
 
836
 
837
 
838
lc_dma_req <= dmar1 & dmar0;
839
lc_irq <= irq1;
840
 
841
end generate;
842
 
843
gen_simulation: if( is_simulation=1 ) generate
844
 
845
clk_out <= clk;
846
 
847
ctrl: cl_adm_simulation
848
 
849
        generic map(
850
                        ---- Константы тетрад ----
851
                        trd_rom                 => trd_rom,
852
                        ---- Разрешение чтения из регистра DATA ----
853
                        trd_in                  => trd_in,
854
                        ---- Разрешение чтения из регистра STATUS ----
855
                        trd_st                  => trd_st,
856
 
857
                        PERIOD_CLK              => 4 ns,        -- период тактового сигнала
858
                        RESET_PAUSE             => 102 ns       -- время снятия сигнала RESET
859
 
860
        )
861
 
862
        port map(
863
 
864
 
865
                ---- Внутренняя шина ----
866
                clk_out                 => clk,
867
                reset_out               => reset_out,
868
                test_mode               => test_mode,           -- 1 - тестовый режим
869
 
870
 
871
                ---- Шина адреса для подключения к узлу начального тестирования тетрады MAIN ----               
872
                trd_host_adr    => trd_host_adr,
873
 
874
                ---- Шина данных, через которую производиться запись в регистры тетрады ----            
875
                trd_host_data   => trdi_host_data,
876
 
877
                ---- Комада управления для каждой тетрады ----          
878
                trd_host_cmd    => trdi_host_cmd,
879
 
880
                ---- Выходы региста DATA от каждой тетрады ----
881
                trd_data                => trd_data,
882
 
883
                ---- Выходы регистров STATUS, CMD_ADR, CMD_DATA от каждой тетрады ----
884
                trd_cmd_data    => trd_cmd_data,
885
 
886
                ---- Запросы DMA от тетрады MAIN (после маршрутизации) ----
887
                trd_main_drq    => trd_main_drq,
888
 
889
                ---- Регистры управления DMA ----
890
                trd_main_sel_drq=> trd_main_sel_drq,
891
 
892
                ---- Сброс FIFO от каждой тетрады ----
893
                trd_reset_fifo  => trd_reset_fifo,
894
 
895
                ---- Запросы прерываения от тетрады MAIN (после маршрутизации) ----
896
                trd_main_irq    => trd_main_irq
897
 
898
 
899
        );
900
 
901
 
902
--trd_host_data <= trdi_host_data;      
903
trd4_host_data <= trdi_host_data;
904
 
905
 
906
end generate;
907
 
908
---- Формирование сигналов управления -----
909
 
910
gen_cmd: for ii in 0 to 7 generate
911
 
912
trd_host_cmd(ii).data_cs <= trdi_host_cmd(ii).data_cs;
913
trd_host_cmd(ii).data_oe <= '0';
914
trd_host_cmd(ii).cmd_data_cs <= trdi_host_cmd(ii).cmd_data_cs;
915
trd_host_cmd(ii).status_cs <= trdi_host_cmd(ii).status_cs;
916
 
917
trd_host_cmd(ii).data_we                <= trdi_host_cmd(ii).data_we after 0.4 ns when rising_edge( clk );
918
trd_host_cmd(ii).cmd_data_we    <= trdi_host_cmd(ii).cmd_data_we after 0.4 ns when rising_edge( clk );
919
trd_host_cmd(ii).cmd_adr_we     <= trdi_host_cmd(ii).cmd_adr_we after 0.4 ns when rising_edge( clk );
920
 
921
trd_host_cmd(ii).adr                    <= trdi_host_cmd(ii).adr;
922
 
923
gen_data: if( ii/=4 ) generate
924
                --trd_host_data(ii) <= trdi_host_data after 0.4 ns when rising_edge( clk );
925
 
926
                gen_bus: for jj in 0 to 63 generate
927
                attribute syn_keep of xfd : label is true;
928
                begin
929
                        xfd:  fd port map( q=>trd_host_data(ii)(jj), c=>clk, d=>trdi_host_data(jj) );
930
                end generate;
931
 
932
        end generate;
933
 
934
        gen_data_t4: if( ii=4 ) generate
935
                --trd_host_data(ii) <= trd4_host_data after 0.4 ns when rising_edge( clk );
936
 
937
                gen_bus: for jj in 0 to 63 generate
938
                attribute syn_keep of xfd : label is true;
939
                begin
940
                        xfd: fd port map( q=>trd_host_data(ii)(jj), c=>clk, d=>trd4_host_data(jj) );
941
                end generate;
942
 
943
        end generate;
944
 
945
trd_host_cmd_data(ii) <= trdi_host_data( 15 downto 0 ) after 0.4 ns when rising_edge( clk );
946
 
947
end generate;
948
 
949
 
950
---- Формирование частоты 30 кГц ----
951
 
952
cnt30start  <= dcm_rstp after 1 ns when rising_edge( clk250 );
953
cnt30start1 <= cnt30start after 1 ns when rising_edge( clk250 );
954
 
955
cnt30i0 <= ((cnt30start xor cnt30start1) or cnt30k0) and not cnt30start;
956
cnt30i1 <= ((cnt30start xor cnt30start1) or cnt30k1 )and not cnt30start;
957
cnt30i2 <=  not cnt30k2 and not cnt30start;
958
cnt30ce1 <= (cnt30start xor cnt30start1) or cnt30k0 or cnt30start;
959
cnt30ce2 <=  (cnt30k1 and cnt30ce1) or cnt30start;
960
 
961
xcnt0: srlc32e port map( q31=>cnt30k0, clk=>clk250, d=>cnt30i0, a=>"11111",   ce=>'1' );
962
xcnt1: srlc32e port map( q31=>cnt30k1, clk=>clk250, d=>cnt30i1, a=>"11111",   ce=>cnt30ce1 );
963
xcnt2: srlc32e port map( q=>cnt30k2, clk=>clk250,   d=>cnt30i2,   a=>"01001", ce=>cnt30ce2 );
964
 
965
clk30i <= cnt30k2;
966
 
967
end cl_ml605;
968
 
969
 
970
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.