1 ----------------------------------------------------------------------------------
5 -- Create Date: 15:
55:
15 07/09/2010
7 -- Module Name: AMC_if - Behavioral
16 -- Revision 0.
01 -
File Created
17 -- Additional Comments:
18 ----------------------------------------------------------------------------------
20 use IEEE.STD_LOGIC_1164.
ALL;
21 use IEEE.STD_LOGIC_ARITH.
ALL;
22 use IEEE.STD_LOGIC_UNSIGNED.
ALL;
23 use IEEE.std_logic_misc.
all;
26 -- Uncomment the following library declaration if using
27 -- arithmetic functions with or values
28 --use IEEE.NUMERIC_STD.ALL;
30 -- Uncomment the following library declaration if instantiating
31 -- any Xilinx primitives in this code.
33 use UNISIM.VComponents.
all;
35 use UNIMACRO.vcomponents.
all;
38 Generic (useTCPIP : := true;
AMC_useTRIG : := false;
simulation : := false);
52 enSFP : IN (3 downto 0);
57 fake_length : in (19 downto 0);
58 T1_version : in (7 downto 0);
59 Source_ID : in array3x12;
60 AMC_en : in (11 downto 0);
61 AMC_Ready : out (11 downto 0);
62 BC0_lock : out (11 downto 0);
66 AMC_RXN : in (12 downto 1);
67 AMC_RXP : in (12 downto 1);
68 AMC_TXN : out (12 downto 1);
69 AMC_TXP : out (12 downto 1);
70 AMC_status : out (31 downto 0);
71 evt_data : out array3X67;
-- 66 is TCP/mon space,
65 is end_of_event
and 64 is end_of_block
72 evt_data_re : in (2 downto 0);
73 evt_buf_full : in (2 downto 0);
74 evt_data_we : out (2 downto 0);
75 evt_data_rdy : out (2 downto 0);
76 ddr_pa : in (9 downto 0);
78 mon_evt_wc : out (47 downto 0);
79 mon_ctrl : out (31 downto 0);
83 buf_rqst : out (3 downto 0);
87 ipb_addr : in (31 downto 0);
88 ipb_wdata : in (31 downto 0);
89 ipb_rdata : out (31 downto 0);
95 TTS_disable : in (11 downto 0);
96 ttc_evcnt_reset : in ;
97 event_number_avl : in ;
98 event_number : in (59 downto 0);
101 TrigData : out array12x8;
102 TTS_coded : out (4 downto 0)
118 fake_length :
in (
19 downto 0);
119 L1A_DATA :
IN (
15 downto 0);
123 empty_event_flag :
out ;
124 fake_DATA :
OUT (
15 downto 0);
129 generic(N : :=
14; useTRIG : := false; simulation : := false);
-- M controls FIFO size, N controls timeout
139 AMC_ID :
IN (
3 downto 0);
140 txfsmresetdone :
in ;
143 rxcommaalignen :
out ;
145 RXDATA :
in (
15 downto 0);
146 RXCHARISCOMMA :
in (
1 downto 0);
147 RXCHARISK :
in (
1 downto 0);
148 RXNOTINTABLE :
in (
1 downto 0);
149 TXDATA :
out (
15 downto 0);
150 TXCHARISK :
out (
1 downto 0);
154 EventInfoRdDone :
IN ;
155 L1A_DATA :
IN (
15 downto 0);
159 fake_DATA :
IN (
15 downto 0);
162 Cntr_ADDR :
IN (
11 downto 0);
167 AMCinfo :
OUT (
15 downto 0);
168 EventInfo :
OUT (
31 downto 0);
169 EventInfo_dav :
OUT ;
170 AMC_DATA :
OUT (
63 downto 0);
173 Cntr_DATA :
OUT (
15 downto 0);
174 debug_out :
OUT (
255 downto 0);
175 TTC_status :
OUT (
127 downto 0);
176 TrigData :
OUT (
7 downto 0);
177 TTS_coded :
OUT (
4 downto 0)
186 AMC_en :
in (
11 downto 0);
187 RXDATA :
out array12X16;
188 RxBufOvf :
out (
11 downto 0);
189 RxBufUdf :
out (
11 downto 0);
192 RxClkRatio :
out array12x21;
193 rxprbserr :
out (
11 downto 0);
194 rxprbssel :
in array12X3;
195 RXNOTINTABLE :
out array12X2;
196 rxcommaalignen :
in (
11 downto 0);
197 rxchariscomma :
out array12X2;
198 rxcharisk :
out array12X2;
199 rxresetdone :
out (
11 downto 0);
200 txdiffctrl :
in array12X4;
201 TXDATA :
in array12X16;
202 txoutclk :
out (
11 downto 0);
203 txcharisk :
in array12X2;
204 txresetdone :
out (
11 downto 0);
205 txprbssel :
in array12X3;
206 qpll_lock :
out (
2 downto 0);
207 txfsmresetdone :
out (
11 downto 0);
208 rxfsmresetdone :
out (
11 downto 0);
209 data_valid :
in (
11 downto 0);
211 RXN :
in (
11 downto 0);
212 RXP :
in (
11 downto 0);
213 TXN :
out (
11 downto 0);
214 TXP :
out (
11 downto 0)
225 Source_ID :
IN (
7 downto 0);
226 block_wc :
in (
15 downto 0);
228 AMC_wc :
IN (
17 downto 0);
231 AMC_header :
IN (
65 downto 0);
233 AMC_DATA :
IN array12X64;
236 bldr_fifo_full :
OUT ;
237 AMC_DATA_re :
OUT (
11 downto 0);
238 AMCCRC_bad :
OUT (
11 downto 0);
239 evt_data :
OUT (
66 downto 0);
242 debug :
out (
255 downto 0);
254 AMC_if_data :
IN (
15 downto 0);
255 Cntr_DATA :
IN array12x16;
256 Cntr_ADDR :
OUT (
11 downto 0);
257 ipb_addr :
IN (
15 downto 0);
258 ipb_rdata :
OUT (
31 downto 0)
265 data_in :
IN (
63 downto 0);
268 crc :
OUT (
15 downto 0);
270 data_out :
OUT (
63 downto 0);
286 di :
IN (
5 downto 0);
288 wa :
IN (
4 downto 0);
289 ra :
IN (
4 downto 0);
290 do :
OUT (
5 downto 0)
293 type array_x12y256 is array(11 downto 0) of (255 downto 0);
294 type array_x12y16 is array(11 downto 0) of (15 downto 0);
295 type array_x12y32 is array(11 downto 0) of (31 downto 0);
296 type array_x12y8 is array(11 downto 0) of (7 downto 0);
297 type array_x12y5 is array(11 downto 0) of (4 downto 0);
298 type array_x12y128 is array(11 downto 0) of (127 downto 0);
299 constant AMC_ID : array12x4 := (x"0",x"1",x"2",x"3",x"4",x"5",x"6",x"7",x"8",x"9",x"a",x"b");
300 constant AMC_txdiffctrl : array12x4 := (others => x"b");
301 constant uFOV : (3 downto 0) := x"1";
302 signal kAMC : array2x4 := (others => (others => '0'));
303 signal mAMC : array3x4 := (others => (others => '0'));
304 signal nAMC : array3x4 := (others => (others => '0'));
305 signal EventInfo : array_x12y32 := (others => (others => '0'));
306 signal AMCinfo : array12X16 := (others => (others => '0'));
307 signal AMC_DATA : array12X64 := (others => (others => '0'));
308 signal AMC_DATA1 : array12X64 := (others => (others => '0'));
309 signal AMC_DATA2 : array12X64 := (others => (others => '0'));
310 signal Cntr_DATA : array12x16 := (others => (others => '0'));
311 signal AMCCRC_bad : array3X12 := (others => (others => '0'));
312 signal AMC_TTS : array_x12y8 := (others => (others => '0'));
313 signal AMC_debug : array_x12y256 := (others => (others => '0'));
314 signal TTC_status : array_x12y128 := (others => (others => '0'));
315 signal badEventCRC_cntr : array12X16 := (others => (others => '0'));
316 signal ReSyncFakeEvent_cntr : array12X16 := (others => (others => '0'));
317 signal EventInfo_dav : (11 downto 0);
318 --signal EventInfo_dav_n : (11 downto 0);
319 signal EventInfoRdDone : (12 downto 0) := (others => '0');
320 signal AMC_DATA_RdEn : (11 downto 0) := (others => '0');
321 signal Cntr_ADDR : (11 downto 0) := (others => '0');
322 signal AMC_if_ADDR : (7 downto 0) := (others => '0');
323 signal ipb_strobe_q : := '0';
324 signal UsrClk : := '0';
325 signal UsrClk_out : (11 downto 0) := (others => '0');
326 signal resetCntr_SyncRegs : (2 downto 0) := (others => '0');
327 signal resetSyncRegs : (2 downto 0) := (others => '0');
328 signal CntrRst : := '0';
329 signal CntrRstCycle : := '0';
330 signal div : (11 downto 0) := (others => '0');
331 signal inc_div : (11 downto 0) := (others => '0');
332 signal evn_out : (59 downto 0) := (others => '0');
333 signal evn_wa : (8 downto 0) := (others => '0');
334 signal evn_ra : (8 downto 0) := (others => '0');
335 signal evt_cnt : array3x8 := (others => (others => '0'));
336 signal evn : (23 downto 0) := (others => '0');
337 signal CDF_in : (71 downto 0) := (others => '0');
338 signal CDF_out : (71 downto 0) := (others => '0');
339 signal CDF_wa : (8 downto 0) := (others => '0');
340 signal CDF_ra : (8 downto 0) := (others => '0');
341 signal CDF_cnt : (7 downto 0) := (others => '0');
342 signal empty_event_flag : := '0';
343 signal evn_buf_full_i : (2 downto 0) := (others => '0');
344 signal ovfl_warning_i : (3 downto 0) := (others => '0');
345 signal ovfl_warning_p : := '0';
346 signal header : := '0';
347 signal init_bldr : := '0';
348 signal CDF_header : := '0';
349 signal CDF_empty : := '0';
350 signal BlockHeader : := '0';
351 signal ec_sel_AMC : := '0';
352 signal sel_AMC : (3 downto 0) := (others => '0');
353 signal LastBlock : := '0';
354 signal FirstBlock : (2 downto 0) := (others => '0');
355 signal sel_CDF : := '0';
356 signal evn_empty : := '0';
357 signal sel_evn : (1 downto 0) := (others => '0');
358 signal L1A_WrEn : := '0';
359 signal L1A_DATA : (15 downto 0) := (others => '0');
360 signal EvtTy : (3 downto 0) := (others => '0');
361 signal CalTy : (3 downto 0) := (others => '0');
362 signal EventInfo_avl : := '0';
363 signal rst_init_bldr : := '0';
364 signal Builder_busy : (2 downto 0) := (others => '0');
365 signal ec_CDF_ra : := '0';
366 signal summary : (63 downto 0) := (others => '0');
367 signal AMC_TTC_status : (31 downto 0) := (others => '0');
368 signal fake_en: := '0';
369 signal fake_DATA : (15 downto 0) := (others => '0');
370 signal fake_header : := '0';
371 signal fake_CRC : := '0';
372 signal fake_WrEn : := '0';
373 signal fake_word_cnt : (15 downto 0) := (others => '0');
374 signal fake_evt_cnt : (15 downto 0) := (others => '0');
375 signal empty_evt_cnt : (15 downto 0) := (others => '0');
376 signal fake_header_cnt: (15 downto 0) := (others => '0');
377 signal EventBuilt : (2 downto 0) := (others => '0');
378 signal badEventCRCToggle : (11 downto 0) := (others => '0');
379 signal ReSyncFakeEventToggle : (11 downto 0) := (others => '0');
380 signal EventBuiltToggle : (2 downto 0) := (others => '0');
381 signal badEventCRCToggleSyncRegs : array12x4 := (others => (others => '0'));
382 signal ReSyncFakeEventToggleSyncRegs : array12x4 := (others => (others => '0'));
383 signal EventBuiltToggleSyncRegs : array3x4 := (others => (others => '0'));
384 signal EventBuiltCnt : array3x16 := (others => (others => '0'));
385 signal next_bldr : (1 downto 0) := (others => '0');
386 signal AMC_wcp : array12x13 := (others => (others => '0'));
387 signal AMC_wc : (17 downto 0) := (others => '0');
388 signal AMC_wc_we : (2 downto 0) := (others => '0');
389 signal en_block_wc : (2 downto 0) := (others => '0');
390 signal block_wc_we : (2 downto 0) := (others => '0');
391 signal AMC_wc_mask : (2 downto 0) := (others => '0');
392 signal AMC_header : array3x66 := (others => (others => '0'));
393 signal AMC_header_we : (2 downto 0) := (others => '0');
394 signal bldr_fifo_full : (2 downto 0) := (others => '0');
395 type array3X12 is array(0 to 2) of (11 downto 0);
396 signal AMC_DATA_re : array3X12 := (others => (others => '0'));
397 signal AMC_hasData : (11 downto 0) := (others =>'0');
398 signal Mbit_word : (11 downto 0) := (others =>'0');
399 --signal AMC_hasData_l : (11 downto 0) := (
others =>'0');
400 signal AMC_REFCLK : := '0';
401 signal AMC_TTS_OR : (7 downto 0) := (others =>'0');
402 signal AMC_qpll_lock : (2 downto 0) := (others =>'0');
403 signal AMC_rxprbserr : (11 downto 0) := (others =>'0');
404 signal AMC_rxcommaalignen : (11 downto 0) := (others =>'0');
405 signal AMC_rxresetdone : (11 downto 0) := (others =>'0');
406 signal AMC_txfsmresetdone : (11 downto 0) := (others =>'0');
407 signal AMC_rxfsmresetdone : (11 downto 0) := (others =>'0');
408 signal AMC_data_valid : (11 downto 0) := (others =>'0');
409 signal AMC_RXDATA : array12x16 := (others => (others => '0'));
410 signal AMC_TXDATA : array12x16 := (others => (others => '0'));
411 signal AMC_RXNOTINTABLE : array12x2 := (others => (others => '0'));
412 signal AMC_rxchariscomma : array12x2 := (others => (others => '0'));
413 signal AMC_rxcharisk : array12x2 := (others => (others => '0'));
414 signal AMC_txcharisk : array12x2 := (others => (others => '0'));
415 signal AMC_rxprbssel : array12x3 := (others => (others => '0'));
416 signal AMC_txprbssel : array12x3 := (others => (others => '0'));
417 type array3X4 is array(0 to 2) of (3 downto 0);
418 --signal AMC_rdata : array12x32 := (others => (others => '0'));
419 signal channel : array3X4 := (others => (others => '0'));
421 signal mon_wc: array3X16 := (others => (others => '0'));
422 signal mon_evt_wcp : (47 downto 0) := (others => '0');
423 signal zero_wc : (2 downto 0) := (others => '0');
424 signal more_wc : (2 downto 0) := (others => '0');
425 signal mon_en: := '0';
426 signal scale_cntr : (15 downto 0) := (others => '0');
427 signal ce_scale : := '0';
428 signal ld_scale : := '0';
429 --signal MonBufAbort: := '0';
430 signal rst_mon_wc: := '0';
431 signal ce_wc_reg_wa: := '0';
432 signal wc_reg_wa: (9 downto 0) := (others => '0');
433 --signal start_wc_reg_wa: (9 downto 0) := (
others => '0');
434 signal down_count : := '0';
435 signal mon_mask: (19 downto 0) := (others => '0');
436 signal sample_event: := '0';
437 signal scale : (31 downto 0) := (others => '0');
438 signal pending : := '0';
439 signal AMC_Ready_i : (11 downto 0);
440 signal AMC_OK : (11 downto 0);
441 signal block_num : (11 downto 0) := (others => '0');
442 signal resetFIFO : := '0';
443 signal fifo_rst : := '0';
444 signal fifo_en : := '0';
445 signal resetFIFO_AMC : := '0';
446 signal fifo_rst_AMC : := '0';
447 signal fifo_en_AMC : := '0';
448 signal OneSFP : := '0';
449 signal TwoSFP : := '0';
450 signal ThreeSFP : := '0';
451 signal fake_full : (11 downto 0) := (others => '0');
452 signal LinkFull : := '0';
453 signal EventInSlink : array3x4 := (others => (others => '0'));
454 signal TTS_FIFO_do : (5 downto 0) := (others => '0');
455 signal TTS_FIFO_di : (5 downto 0) := (others => '0');
456 signal TTS_FIFO_wa : (4 downto 0) := (others => '0');
457 signal TTS_FIFO_ra : (4 downto 0) := (others => '0');
458 signal TTS_FIFO_waSyncRegs : (2 downto 0) := (others => '0');
459 signal TTS_FIFO_waSyncRegs2 : (2 downto 0) := (others => '0');
460 signal TTS_FIFO_waSyncRegs3 : (2 downto 0) := (others => '0');
461 signal evt_bldr_debug : (255 DOWNTO 0);
462 signal stop_mon : := '0';
463 signal errors : (7 downto 0) := (others => '0');
464 signal err_TTS : (7 downto 0) := (others => '0');
465 signal AMC_wc_sum_we : := '0';
466 signal rst_AMC_wc_sum : := '0';
467 signal wr_AMC_wc_sum : := '0';
468 signal sel_AMC_q : (3 downto 0) := (others => '0');
469 signal AMC_wc_sum_di : (5 downto 0) := (others => '0');
470 signal AMC_wc_sum_do : (5 downto 0) := (others => '0');
471 signal AMC_wc_sum_a : (4 downto 0) := (others => '0');
472 signal enRstAMC_link : := '0';
473 signal RstAMC_link : := '0';
474 signal RstAMC_link_dl : := '0';
475 signal AllEventBuilt_i : := '0';
476 signal event_number_avl_q : (2 downto 0) := (others => '0');
477 signal bcnt : (11 downto 0) := (others => '0');
478 signal event_cnt : (23 downto 0) := (others => '0');
479 signal event_status : (19 downto 0) := (others => '0');
480 signal L1A_buf_we : := '0';
481 signal L1A_buf_do : (31 downto 0) := (others => '0');
482 signal L1A_buf_di : (31 downto 0) := (others => '0');
483 signal L1A_buf_wa : (8 downto 0) := (others => '0');
484 signal RxBufUdfErr : (11 downto 0) := (others => '0');
485 signal RxBufOvfErr : (11 downto 0) := (others => '0');
486 signal RxBufOvf : (11 downto 0) := (others => '0');
487 signal RxBufUdf : (11 downto 0) := (others => '0');
488 signal RxClkCntr : (19 downto 0) := (others => '0');
489 signal RxClkCntr19_q : := '0';
490 signal updateRatio : := '0';
491 signal RxClkRatio : array12x21 := (others => (others => '0'));
492 signal AMC_if_RdEn : := '0';
493 signal AMC_if_data : (15 downto 0) := (others => '0');
494 signal AMC_cntr_data : (31 downto 0) := (others => '0');
497 CONTROL0 :
INOUT (
35 DOWNTO 0);
498 CONTROL1 :
INOUT (
35 DOWNTO 0));
501 component ila128x4096
503 CONTROL :
INOUT (
35 DOWNTO 0);
505 DATA :
IN (
143 DOWNTO 0);
506 TRIG0 :
IN (
7 DOWNTO 0);
507 TRIG1 :
IN (
7 DOWNTO 0);
508 TRIG2 :
IN (
7 DOWNTO 0));
511 signal CONTROL0 : (35 DOWNTO 0);
512 signal CONTROL1 : (35 DOWNTO 0);
513 signal DATA0 : (143 DOWNTO 0);
514 signal TRIG0 : (7 DOWNTO 0);
515 signal TRIG1 : (7 DOWNTO 0);
516 signal TRIG2 : (7 DOWNTO 0);
517 signal DATA1 : (143 DOWNTO 0);
518 signal TRIG0b : (7 DOWNTO 0);
519 signal TRIG1b : (7 DOWNTO 0);
520 signal TRIG2b : (7 DOWNTO 0);
524 Din :
in (
303 downto 0));
526 signal CS : (303 DOWNTO 0) := (others => '0');
528 --i_chipscope : chipscope1 port map(clk => UsrClk, Din => cs);
529 --cs(61 downto 0) <= AMC_debug(
3)(
61 downto 0);
530 --cs(289) <= AMC_debug(
3)(
44);
531 --cs(288) <= AMC_debug(
3)(
40);
532 --i_chipscope : chipscope1 port map(clk => UsrClk, Din => cs);
533 --cs(288) <= AMC_debug(
1)(
48);
534 --cs(48 downto 0) <= AMC_debug(
1)(
48 downto 0);
535 --cs(303 downto 296) <= cs(
212) & cs(
210 downto 204);
536 --cs(295 downto 288) <= cs(
147) & cs(
145 downto 139);
537 --cs(295 downto 288) <= AMC_debug(
0)(
80) & AMC_debug(
0)(
62 downto 56);
538 --cs(288) <= AMC_debug(
4)(
82);
539 --cs(287) <= sel_CDF;
540 --cs(264 downto 183) <= AMC_debug(
4)(
81 downto 0);
541 --cs(182 downto 0) <= evt_bldr_debug(
182 downto 0);
544 -- CONTROL0 => CONTROL0,
545 -- CONTROL1 => CONTROL1);
546 --i_ila : ila128x4096
548 -- CONTROL => CONTROL0,
554 --DATA0(3 downto 0) <= TTC_status(
10)(
84 downto 81);
555 --DATA0(16 downto 4) <= TTC_status(
10)(
18 downto 6);
556 --DATA0(44 downto 17) <= TTC_status(
10)(
118 downto 91);
557 --DATA0(46 downto 45) <= AMC_rxchariscomma(
10);
558 --DATA0(48 downto 47) <= AMC_rxcharisk(
10);
559 --DATA0(64 downto 49) <= AMC_RXDATA(
10);
560 --DATA0(66 downto 65) <= TTC_status(
10)(
53 downto 52);
561 --DATA0(70 downto 67) <= TTC_status(
9)(
84 downto 81);
562 --DATA0(83 downto 71) <= TTC_status(
9)(
18 downto 6);
563 --DATA0(85 downto 84) <= TTC_status(
9)(
53 downto 52);
564 --DATA0(87 downto 86) <= AMC_rxchariscomma(
9);
565 --DATA0(89 downto 88) <= AMC_rxcharisk(
9);
566 --DATA0(105 downto 90) <= AMC_RXDATA(
9);
567 --DATA0(109 downto 106) <= TTC_status(
1)(
84 downto 81);
568 --DATA0(122 downto 110) <= TTC_status(
1)(
18 downto 6);
569 --DATA0(124 downto 123) <= TTC_status(
1)(
53 downto 52);
570 --DATA0(125) <= AMC_rxchariscomma(
1)(
0);
571 --DATA0(127 downto 126) <= AMC_rxcharisk(
1);
572 --DATA0(143 downto 128) <= AMC_RXDATA(
1);
573 --TRIG0(1 downto 0) <= TTC_status(
10)(
53 downto 52) ;
574 --TRIG0(3 downto 2) <= TTC_status(
9)(
53 downto 52) ;
575 --TRIG0(5 downto 4) <= TTC_status(
1)(
53 downto 52) ;
576 --TRIG0(7 downto 6) <= "
00" ;
577 --i_ila_b : ila128x4096
579 -- CONTROL => CONTROL1,
586 --DATA1(9 downto 1) <= TTC_status(
10)(
35 downto 27);
587 --DATA1(46 downto 10) <= TTC_status(
10)(
90 downto 54);
588 --DATA1(55 downto 47) <= TTC_status(
9)(
35 downto 27);
589 --DATA1(92 downto 56) <= TTC_status(
9)(
90 downto 54);
590 --DATA1(101 downto 93) <= TTC_status(
1)(
35 downto 27);
591 --DATA1(138 downto 102) <= TTC_status(
1)(
90 downto 54);
592 --DATA1(142 downto 139) <= bcnt;
594 --TRIG1(2 downto 1) <= TTC_status(
10)(
31 downto 30);
595 --TRIG1(4 downto 3) <= TTC_status(
9)(
31 downto 30);
596 --TRIG1(6 downto 5) <= TTC_status(
1)(
31 downto 30);
598 AllEventBuilt <= AllEventBuilt_i;
599 AMC_Ready <= AMC_Ready_i;
601 process(sysclk,reset)
604 resetSyncRegs <= (others => '1');
606 elsif(sysclk'event and sysclk = '1')then
607 resetSyncRegs <= resetSyncRegs(1 downto 0) & '0';
608 if(enRstAMC_link = '1' and AllEventBuilt_i = '1')then
611 RstAMC_link <= resetSyncRegs(1);
617 if(sysclk'event and sysclk = '1')then
618 if(resetSyncRegs(2) = '1')then
619 L1A_buf_wa <= (others => '0');
620 elsif(L1A_buf_we = '1')then
621 L1A_buf_wa <= L1A_buf_wa + 1;
623 if(resetSyncRegs(2) = '1' or ttc_evcnt_reset = '1')then
624 event_cnt <= (others => '0');
625 elsif(event_number_avl = '1')then
626 event_cnt <= event_cnt + 1;
628 event_number_avl_q <= event_number_avl_q(1 downto 0) & event_number_avl;
629 if(resetSyncRegs(2) = '1')then
632 L1A_buf_we <= event_number_avl or or_reduce(event_number_avl_q);
634 if(event_number_avl = '1')then
635 L1A_buf_di <= event_number(43 downto 12);
-- OcN
636 bcnt <= event_number(11 downto 0);
-- OcN
637 event_status <= event_number(59 downto 44) &"00" & event_number(45) & not event_number(45);
638 elsif(event_number_avl_q(0) = '1')then
639 L1A_buf_di <= x"00000" & bcnt;
-- bcnt
640 elsif(event_number_avl_q(1) = '1')then
641 L1A_buf_di <= x"00" & event_cnt;
-- bcnt
643 L1A_buf_di <= x"000" & event_status;
-- bcnt
647 -- if(en_cal_win = '0')then
648 -- event_number(51 downto 48) <= x"0";
649 -- event_number(44) <= '0';
651 -- event_number(51) <= cal_win
and brcst_GapTrig
and cal_type(
3)
and not brcst_GapPed;
652 -- event_number(50) <= cal_win
and brcst_GapTrig
and cal_type(
2)
and not brcst_GapPed;
653 -- event_number(49) <= cal_win
and brcst_GapTrig
and cal_type(
1)
and not brcst_GapPed;
654 -- event_number(48) <= cal_win
and ((brcst_GapTrig
and cal_type(
0))
or brcst_GapPed);
655 -- event_number(44) <= cal_win
and (brcst_GapTrig
or brcst_GapPed);
657 -- event_number(59 downto 56) <= cal_type;
658 -- event_number(55 downto 52) <= state;
659 -- event_number(47) <= brcst_GapTrig;
660 -- event_number(46) <= brcst_GapPed;
661 -- event_number(45) <= cal_win;
662 -- event_number(43 downto 0) <= oc & bcnt;
663 -- receiving L1 information
664 i_L1A_buf : BRAM_SDP_MACRO
666 BRAM_SIZE =>
"18Kb",
-- Target BRAM, "18Kb" or "36Kb"
667 DEVICE =>
"7SERIES",
-- Target device: "VIRTEX5",
"VIRTEX6",
"7SERIES",
"SPARTAN6"
668 WRITE_WIDTH =>
32,
-- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
669 READ_WIDTH =>
32) -- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
671 DO => L1A_buf_do,
-- Output read data port, width defined by READ_WIDTH parameter
672 DI => L1A_buf_di,
-- Input write data port, width defined by WRITE_WIDTH parameter
673 RDADDR => ipb_addr
(8 downto 0),
-- Input read address, width defined by read port depth
674 RDCLK => sysclk,
-- 1-bit input read clock
675 RDEN => '1',
-- 1-bit input read port enable
676 REGCE => '1',
-- 1-bit input read output register enable
677 RST => '0',
-- 1-bit input reset
678 WE => x"f",
-- Input write enable, width defined by write port depth
679 WRADDR => L1A_buf_wa,
-- Input write address, width defined by write port depth
680 WRCLK => sysclk,
-- 1-bit input write clock
681 WREN => L1A_buf_we
-- 1-bit input write port enable
683 ovfl_warning <= ovfl_warning_i(3);
684 i_evn : BRAM_SDP_MACRO
686 BRAM_SIZE =>
"36Kb",
-- Target BRAM, "18Kb" or "36Kb"
687 DEVICE =>
"7SERIES",
-- Target device: "VIRTEX5",
"VIRTEX6",
"7SERIES",
"SPARTAN6"
688 WRITE_WIDTH =>
60,
-- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
689 READ_WIDTH =>
60,
-- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
690 DO_REG =>
0,
-- Optional output register (0 or 1)
691 SIM_COLLISION_CHECK =>
"NONE",
-- Collision check enable "ALL",
"WARNING_ONLY",
692 -- "GENERATE_X_ONLY" or "NONE"
693 WRITE_MODE =>
"WRITE_FIRST",
-- Specify "READ_FIRST" for same clock
or synchronous clocks
694 -- Specify "WRITE_FIRST for asynchrononous clocks on ports
695 INIT => X"000000000000000000"
) -- Initial values on output port
697 DO => evn_out,
-- Output read data port, width defined by READ_WIDTH parameter
698 DI => event_number,
-- Input write data port, width defined by WRITE_WIDTH parameter
699 RDADDR => evn_ra,
-- Input read address, width defined by read port depth
700 RDCLK => sysclk,
-- 1-bit input read clock
701 RDEN => '1',
-- 1-bit input read port enable
702 REGCE => '1',
-- 1-bit input read output register enable
703 RST => '0',
-- 1-bit input reset
704 WE => x"ff",
-- Input write enable, width defined by write port depth
705 WRADDR => evn_wa,
-- Input write address, width defined by write port depth
706 WRCLK => sysclk,
-- 1-bit input write clock
707 WREN => event_number_avl
-- 1-bit input write port enable
710 variable enable : (2 downto 0);
712 if(ThreeSFP = '1')then
714 elsif(TwoSFP = '1')then
719 if(sysclk'event and sysclk = '1')then
720 if(resetSyncRegs(2) = '1')then
721 evn_wa <= (others => '0');
722 elsif(event_number_avl = '1')then
723 evn_wa <= evn_wa + 1;
725 if(resetSyncRegs(2) = '1')then
726 evn_ra <= (others => '0');
727 elsif(sel_evn = "10")then
728 evn_ra <= evn_ra + 1;
730 if(ttc_evcnt_reset = '1' or resetSyncRegs(2) = '1')then
732 elsif(sel_evn = "10")then
736 if(resetSyncRegs(2) = '1' or enable(i) = '0')then
737 evt_cnt(i) <= (others => '0');
738 elsif(event_number_avl = '1' and EventBuilt(i) = '0')then
739 evt_cnt(i) <= evt_cnt(i) + 1;
740 elsif(event_number_avl = '0' and EventBuilt(i) = '1')then
741 evt_cnt(i) <= evt_cnt(i) - 1;
743 if(and_reduce(evt_cnt(i)(7 downto 5)) = '1')then
744 evn_buf_full_i(i) <= '1';
746 evn_buf_full_i(i) <= '0';
748 -- when reached 0x60, throttle L1A.
Return only
after go below
0x40
749 if(or_reduce(evt_cnt(i)(7 downto 6)) = '0')then
750 ovfl_warning_i(i) <= '0';
751 elsif(evt_cnt(i)(5) = '1')then
752 ovfl_warning_i(i) <= '1';
755 evn_buf_full <= or_reduce(evn_buf_full_i);
756 ovfl_warning_i(3) <= or_reduce(ovfl_warning_i(2 downto 0)) or (or_reduce(TTS_FIFO_do(4 downto 0)) and en_localL1A);
759 -- send L1info to AMC_Link
762 if(sysclk'event and sysclk = '1')then
763 if(resetSyncRegs(2) = '1' or evn_wa = evn_ra)then
768 L1A_WrEn <= not evn_empty;
769 if(resetSyncRegs(2) = '1' or evn_empty = '1')then
772 sel_evn(1) <= sel_evn(1) xor sel_evn(0);
773 sel_evn(0) <= not sel_evn(0);
776 when "00" => L1A_DATA <= evn_out(11 downto 0) & x"0";
-- BX
777 when "01" => L1A_DATA <= evn(15 downto 0);
778 when "10" => L1A_DATA <= x"00" & evn(23 downto 16);
779 when others => L1A_DATA <= evn_out(27 downto 12);
-- OrN
783 i_CDF : BRAM_SDP_MACRO
785 BRAM_SIZE =>
"36Kb",
-- Target BRAM, "18Kb" or "36Kb"
786 DEVICE =>
"7SERIES",
-- Target device: "VIRTEX5",
"VIRTEX6",
"7SERIES",
"SPARTAN6"
787 WRITE_WIDTH =>
72,
-- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
788 READ_WIDTH =>
72,
-- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
789 DO_REG =>
0,
-- Optional output register (0 or 1)
790 SIM_COLLISION_CHECK =>
"NONE",
-- Collision check enable "ALL",
"WARNING_ONLY",
791 -- "GENERATE_X_ONLY" or "NONE"
792 WRITE_MODE =>
"WRITE_FIRST",
-- Specify "READ_FIRST" for same clock
or synchronous clocks
793 -- Specify "WRITE_FIRST for asynchrononous clocks on ports
794 INIT => X"000000000000000000"
) -- Initial values on output port
796 DO => CDF_out,
-- Output read data port, width defined by READ_WIDTH parameter
797 DI => CDF_in,
-- Input write data port, width defined by WRITE_WIDTH parameter
798 RDADDR => CDF_ra,
-- Input read address, width defined by read port depth
799 RDCLK => sysclk,
-- 1-bit input read clock
800 RDEN => '1',
-- 1-bit input read port enable
801 REGCE => '1',
-- 1-bit input read output register enable
802 RST => '0',
-- 1-bit input reset
803 WE => x"ff",
-- Input write enable, width defined by write port depth
804 WRADDR => CDF_wa,
-- Input write address, width defined by write port depth
805 WRCLK => sysclk,
-- 1-bit input write clock
806 WREN => sel_evn
(0) -- 1-bit input write port enable
810 if(sysclk'event and sysclk = '1')then
811 if(resetSyncRegs(2) = '1')then
812 CDF_wa <= (others => '0');
813 elsif(sel_evn(0) = '1')then
814 CDF_wa <= CDF_wa + 1;
816 if(resetSyncRegs(2) = '1')then
817 CDF_ra <= (others => '0');
818 elsif(ec_CDF_ra = '1')then
819 CDF_ra <= CDF_ra + 1;
821 if(resetSyncRegs(2) = '1')then
822 CDF_cnt <= (others => '0');
823 elsif(sel_evn(0) = '1' and CDF_wa(0) = '1' and (ec_CDF_ra = '0' or CDF_ra(0) = '1'))then
824 CDF_cnt <= CDF_cnt + 1;
825 elsif((sel_evn(0) = '0' or CDF_wa(0) = '0') and ec_CDF_ra = '1' and CDF_ra(0) = '0')then
826 CDF_cnt <= CDF_cnt - 1;
828 if(resetSyncRegs(2) = '1')then
830 elsif(or_reduce(CDF_cnt(7 downto 1)) = '0' and (CDF_cnt(0) = '0' or ec_CDF_ra = '1'))then
832 elsif(or_reduce(CDF_cnt) = '1')then
835 if(sel_evn(1) = '0')then
836 -- CDF_in <= x"005" & EvtTy & evn & evn_out(11 downto 0) & Source_ID(
11 downto 0) & x"08"; -- header1
837 CDF_in <= x"005" & EvtTy & evn & evn_out(11 downto 0) & x"00008";
-- header1
839 CDF_in <= x"00" & uFOV & CalTy & x"00000" & evn_out(43 downto 12) & x"0";
-- header2
843 EvtTy <= "00" & evn_out(45) & not evn_out(45);
844 CalTy <= evn_out(51 downto 48);
845 process(sysclk, ThreeSFP, TwoSFP, sel_AMC)
846 variable bldr_mask_sel : (4 downto 0);
847 variable bldr_mask : (2 downto 0);
848 --variable Mbit_word : (11 downto 0);
850 bldr_mask_sel(4) := ThreeSFP;
851 bldr_mask_sel(3) := TwoSFP;
852 bldr_mask_sel(2 downto 0) := sel_AMC(3 downto 1);
853 case bldr_mask_sel is
854 when "10100" | "10101" => bldr_mask := "100";
855 when "10000" | "10001" | "01000" | "01001" | "01010" => bldr_mask := "010";
856 when others => bldr_mask := "001";
858 -- for i in 0 to 11 loop
859 -- Mbit_word(i) := EventInfo(i)(25);
861 if(sysclk'event and sysclk = '1')then
862 if(resetSyncRegs(2) = '1')then
866 EventInfo_avl <= '0';
869 AMC_wc_sum_we <= '0';
872 AMC_header_we <= "000";
877 if((and_reduce(not AMC_hasData or EventInfo_dav) = '1' and or_reduce(AMC_hasData) = '1') or (or_reduce(amc_en) = '0' and CDF_empty = '0'))then
878 EventInfo_avl <= '1';
880 EventInfo_avl <= '0';
882 -- LastBlock <= not or_reduce(AMC_hasData and Mbit_word);
884 for i in 0 to 11 loop
885 if(AMC_hasData(i) = '1' and EventInfo(i)(25) = '1')then
889 if(EventInfo_avl = '1' and init_bldr = '0' and bldr_fifo_full = "000" and ((mon_en = '0' and TCPbuf_avl = '1') or (mon_en = '1' and mon_buf_avl = '1')))then
890 if(CDF_header = '1')then
892 zero_wc <= not ThreeSFP & OneSFP & '0';
898 buf_rqst <= LastBlock & CDF_header & not mon_en & mon_en;
899 AMC_header(0)(64) <= mon_en and mon_buf_avl;
900 AMC_header(1)(64) <= mon_en and mon_buf_avl;
901 AMC_header(2)(64) <= mon_en and mon_buf_avl;
903 for i in 0 to 11 loop
904 Mbit_word(i) <= AMC_hasData(i) and EventInfo(i)(25);
906 elsif(rst_init_bldr = '1')then
908 -- zero_wc <= zero_wc or not more_wc;
909 zero_wc <= not more_wc;
910 if(LastBlock = '1')then
918 if(init_bldr = '1')then
920 BlockHeader <= CDF_header;
922 if(ec_sel_AMC = '1' and Mbit_word(conv_integer(sel_AMC)) = '1')then
923 more_wc <= more_wc or bldr_mask;
926 sel_CDF <= (CDF_header and init_bldr) or BlockHeader;
927 -- if(BlockHeader = '1')then
928 -- AMC_hasData_l <= AMC_hasData;
930 if(BlockHeader = '1')then
932 elsif(sel_AMC = x"b")then
935 if(AMC_hasData(conv_integer(sel_AMC)) = '1' and ec_sel_AMC = '1')then
936 AMC_wc_we <= bldr_mask;
937 AMC_wc_sum_we <= or_reduce(bldr_mask);
940 AMC_wc_sum_we <= '0';
943 if((sel_CDF = '1' and (FirstBlock(i) = '1' or nAMC(i) /= x"0")) or AMC_wc_we(i) = '1')then
944 AMC_header_we(i) <= '1';
946 AMC_header_we(i) <= '0';
949 if(ec_sel_AMC = '0' or sel_AMC = x"b")then
952 sel_AMC <= sel_AMC + 1;
956 case AMC_hasData(i*4+3 downto i*4) is
957 when x"1" | x"2" | x"4" | x"8" => mAMC(i) <= x"1";
958 when x"3" | x"5" | x"6" | x"9" | x"a" | x"c" => mAMC(i) <= x"2";
959 when x"7" | x"b" | x"d" | x"e" => mAMC(i) <= x"3";
960 when x"f" => mAMC(i) <= x"4";
961 when others => mAMC(i) <= x"0";
964 kAMC(0)(1) <= AMC_hasData(5) and AMC_hasData(4);
965 kAMC(0)(0) <= AMC_hasData(5) xor AMC_hasData(4);
966 kAMC(1)(1) <= AMC_hasData(7) and AMC_hasData(6);
967 kAMC(1)(0) <= AMC_hasData(7) xor AMC_hasData(6);
968 if(ThreeSFP = '1')then
970 elsif(TwoSFP = '1')then
971 nAMC(0) <= mAMC(2) + kAMC(1);
973 nAMC(0) <= mAMC(0) + mAMC(1) + mAMC(2);
975 if(ThreeSFP = '1')then
977 elsif(TwoSFP = '1')then
978 nAMC(1) <= mAMC(0) + kAMC(0);
982 if(ThreeSFP = '1')then
987 summary <= '0' & EventInfo(conv_integer(sel_AMC))(26 downto 20) & x"0" & EventInfo(conv_integer(sel_AMC))(19 downto 0) & block_num & (sel_AMC+1) & AMCinfo(conv_integer(sel_AMC));
989 AMC_header(i)(65) <= not BlockHeader and sel_CDF;
990 if(sel_CDF = '0')then
991 AMC_header(i)(55 downto 52) <= summary(55 downto 52);
992 elsif(BlockHeader = '1')then
993 AMC_header(i)(55 downto 52) <= CDF_out(55 downto 52);
995 AMC_header(i)(55 downto 52) <= nAMC(i);
997 if(sel_CDF = '1')then
998 AMC_header(i)(63 downto 56) <= CDF_out(63 downto 56);
999 AMC_header(i)(51 downto 20) <= CDF_out(51 downto 20);
1000 AMC_header(i)(7 downto 0) <= CDF_out(7 downto 0);
1002 AMC_header(i)(63 downto 56) <= summary(63 downto 56);
1003 AMC_header(i)(51 downto 20) <= summary(51 downto 20);
1004 AMC_header(i)(7 downto 0) <= summary(7 downto 0);
1007 if(sel_CDF = '0')then
1008 AMC_header(0)(19 downto 8) <= summary(19 downto 8);
1009 AMC_header(1)(19 downto 8) <= summary(19 downto 8);
1010 AMC_header(2)(19 downto 8) <= summary(19 downto 8);
1011 elsif(BlockHeader = '1')then
1012 if(OneSFP = '1')then
1013 AMC_header(0)(19 downto 8) <= source_ID(0);
1015 AMC_header(0)(19 downto 8) <= source_ID(1);
1017 AMC_header(1)(19 downto 8) <= source_ID(0);
1018 AMC_header(2)(19 downto 8) <= source_ID(2);
1020 AMC_header(0)(19 downto 8) <= CDF_out(19 downto 8);
1021 AMC_header(1)(19 downto 8) <= CDF_out(19 downto 8);
1022 AMC_header(2)(19 downto 8) <= CDF_out(19 downto 8);
1024 if(CDF_header = '1')then
1025 FirstBlock(0) <= '1';
1026 FirstBlock(1) <= not OneSFP;
1027 FirstBlock(2) <= ThreeSFP;
1028 block_num <= (others => '0');
1029 elsif(rst_init_bldr = '1')then
1030 FirstBlock <= "000";
1031 block_num <= block_num + 1;
1033 if(fifo_en = '0' or (EventInfoRdDone(12) = '1' and LastBlock = '1'))then
1034 AMC_hasData <= AMC_en;
1035 -- elsif(ec_sel_AMC = '1' and EventInfo(conv_integer(sel_AMC))(25) = '0')
then -- More
is '0'
1036 -- AMC_hasData(conv_integer(sel_AMC)) <= '0';
1037 elsif(EventInfoRdDone(12) = '1')then
1038 AMC_hasData <= Mbit_word;
1040 for i in 0 to 11 loop
1041 if(Mbit_word(i) = '1')then
1042 AMC_wcp(i) <= "1000000000000";
1044 AMC_wcp(i) <= EventInfo(i)(12 downto 0);
1047 if(OneSFP = '1')then
1048 -- AMC_wc(17) <=
not or_reduce(AMC_hasData
and Mbit_word);
1049 AMC_wc(17) <= not or_reduce(Mbit_word);
1050 elsif(TwoSFP = '1')then
1051 if(sel_AMC = x"0")then
1052 AMC_wc(17) <= not or_reduce(Mbit_word(5 downto 0));
1053 elsif(sel_AMC = x"6")then
1054 AMC_wc(17) <= not or_reduce(Mbit_word(11 downto 6));
1057 if(sel_AMC = x"0")then
1058 AMC_wc(17) <= not or_reduce(Mbit_word(3 downto 0));
1059 elsif(sel_AMC = x"4")then
1060 AMC_wc(17) <= not or_reduce(Mbit_word(7 downto 4));
1061 elsif(sel_AMC = x"8")then
1062 AMC_wc(17) <= not or_reduce(Mbit_word(11 downto 8));
1065 AMC_wc(16 downto 0) <= sel_AMC & AMC_wcp(conv_integer(sel_AMC));
1068 kAMC(1)(3 downto 2) <= "00";
1069 kAMC(0)(3 downto 2) <= "00";
1070 --AMC_header(1)(
64 downto 56) <= AMC_header(
0)(
64 downto 56);
1071 --AMC_header(1)(
51 downto 0) <= AMC_header(
0)(
51 downto 0);
1072 --AMC_header(2)(
64 downto 56) <= AMC_header(
0)(
64 downto 56);
1073 --AMC_header(2)(
51 downto 0) <= AMC_header(
0)(
51 downto 0);
1076 reset => resetSyncRegs
(2),
1077 fifo_rst => fifo_rst,
1079 en_inject_err => en_inject_err ,
1082 block_wc => mon_wc
(0),
1083 block_wc_we => block_wc_we
(0),
1085 AMC_wc_we => AMC_wc_we
(0),
1086 AMC_wc_end => rst_init_bldr,
1087 bldr_fifo_full => bldr_fifo_full
(0),
1088 AMC_header => AMC_header
(0),
1089 AMC_header_we => AMC_header_we
(0),
1090 AMC_DATA => AMC_DATA,
1091 AMC_DATA_re => AMC_DATA_re
(0),
1092 AMCCRC_bad => AMCCRC_bad
(0),
1093 evt_data => evt_data
(0),
1094 evt_data_we => evt_data_we
(0),
1095 evt_buf_full => evt_buf_full
(0),
1096 evt_data_re => evt_data_re
(0),
1097 evt_data_rdy => evt_data_rdy
(0),
1098 debug => evt_bldr_debug,
1099 EventBuilt => EventBuilt
(0)
1103 reset => resetSyncRegs
(2),
1104 fifo_rst => fifo_rst,
1106 en_inject_err => en_inject_err ,
1109 block_wc => mon_wc
(1),
1110 block_wc_we => block_wc_we
(1),
1112 AMC_wc_we => AMC_wc_we
(1),
1113 AMC_wc_end => rst_init_bldr,
1114 bldr_fifo_full => bldr_fifo_full
(1),
1115 AMC_header => AMC_header
(1),
1116 AMC_header_we => AMC_header_we
(1),
1117 AMC_DATA => AMC_DATA1,
1118 AMC_DATA_re => AMC_DATA_re
(1),
1119 AMCCRC_bad => AMCCRC_bad
(1),
1120 evt_data => evt_data
(1),
1121 evt_data_we => evt_data_we
(1),
1122 evt_buf_full => evt_buf_full
(1),
1123 evt_data_re => evt_data_re
(1),
1124 evt_data_rdy => evt_data_rdy
(1),
1126 EventBuilt => EventBuilt
(1)
1128 g_AMC_DATA1: for i in 0 to 5 generate
1129 AMC_DATA1(i) <= AMC_DATA(i);
1130 AMC_DATA1(i+6) <= (others => '0');
1134 reset => resetSyncRegs
(2),
1135 fifo_rst => fifo_rst,
1137 en_inject_err => en_inject_err ,
1140 block_wc => mon_wc
(2),
1141 block_wc_we => block_wc_we
(2),
1143 AMC_wc_we => AMC_wc_we
(2),
1144 AMC_wc_end => rst_init_bldr,
1145 bldr_fifo_full => bldr_fifo_full
(2),
1146 AMC_header => AMC_header
(2),
1147 AMC_header_we => AMC_header_we
(2),
1148 AMC_DATA => AMC_DATA2,
1149 AMC_DATA_re => AMC_DATA_re
(2),
1150 AMCCRC_bad => AMCCRC_bad
(2),
1151 evt_data => evt_data
(2),
1152 evt_data_we => evt_data_we
(2),
1153 evt_buf_full => evt_buf_full
(2),
1154 evt_data_re => evt_data_re
(2),
1155 evt_data_rdy => evt_data_rdy
(2),
1157 EventBuilt => EventBuilt
(2)
1159 g_AMC_DATA2: for i in 0 to 3 generate
1160 AMC_DATA2(i) <= AMC_DATA(i+8);
1161 AMC_DATA2(i+4) <= AMC_DATA(i+8);
1162 AMC_DATA2(i+8) <= AMC_DATA(i+8);
1164 AMC_DATA_RdEn <= AMC_DATA_re(0) or AMC_DATA_re(1) or AMC_DATA_re(2);
1167 if(sysclk'event and sysclk = '1')then
1168 for i in 0 to 11 loop
1169 if(AMCCRC_bad(0)(i) = '1' or AMCCRC_bad(1)(i) = '1' or AMCCRC_bad(2)(i) = '1')then
1170 badEventCRCToggle(i) <= not badEventCRCToggle(i);
1172 if(EventInfo(i)(31) = '1' and EventInfo(i)(25) = '0' and EventInfoRdDone(i) = '1')then
1173 ReSyncFakeEventToggle(i) <= not ReSyncFakeEventToggle(i);
1179 reset => resetFIFO_AMC,
1181 fifo_rst => fifo_rst_AMC,
1182 fifo_en => fifo_en_AMC
1184 resetFIFO_AMC <= reset or or_reduce(not AMC_txfsmresetdone and AMC_en) or RstAMC_link;
1185 g_AMC_Link : for i in 0 to 11 generate
1187 generic map(useTRIG => AMC_useTRIG
)
1190 reset => RstAMC_link,
1191 resetCntr => CntrRst,
1192 fifo_rst => fifo_rst_AMC,
1193 fifo_en => fifo_en_AMC,
1195 NoReSyncFake => NoReSyncFake ,
1197 RXNOTINTABLE => AMC_RXNOTINTABLE
(i
),
1198 rxcommaalignen => AMC_rxcommaalignen
(i
),
1199 rxchariscomma => AMC_rxchariscomma
(i
),
1200 rxcharisk => AMC_rxcharisk
(i
),
1201 rxresetdone => AMC_rxresetdone
(i
),
1202 qpll_lock => AMC_qpll_lock
(i/4
),
1203 txfsmresetdone => AMC_txfsmresetdone
(i
),
1204 data_valid => AMC_data_valid
(i
),
1205 RXDATA => AMC_RXDATA
(i
),
1206 txcharisk => AMC_txcharisk
(i
),
1207 TXDATA => AMC_TXDATA
(i
),
1208 Ready => AMC_Ready_i
(i
),
1209 AMC_ID => AMC_ID
(i
),
1210 AMCinfo => AMCinfo
(i
),
1211 EventInfo => EventInfo
(i
),
1212 EventInfo_dav => EventInfo_dav
(i
),
1213 AMC_DATA_RdEn => AMC_DATA_RdEn
(i
),
1214 EventInfoRdDone => EventInfoRdDone
(i
),
1215 AMC_DATA => AMC_DATA
(i
),
1216 bad_AMC => AMC_status
(i
),
1217 AMC_OK => AMC_OK
(i
),
1218 L1A_DATA => L1A_DATA,
1219 L1A_WrEn => L1A_WrEn,
1220 fake_header => fake_header,
1221 fake_CRC => fake_CRC,
1222 fake_DATA => fake_DATA,
1223 fake_WrEn => fake_WrEn,
1224 fake_full => fake_full
(i
),
1225 Cntr_ADDR => Cntr_ADDR,
1226 Cntr_DATA => Cntr_DATA
(i
),
1227 debug_out => AMC_debug
(i
),
1231 AMC_en => AMC_en
(i
),
1232 TTS_disable => TTS_disable
(i
),
1233 TTC_status => TTC_status
(i
),
1234 TrigData => TrigData
(i
),
1235 TTS_coded => AMC_TTS
(i
)(4 downto 0)
1240 SOFT_RESET => GTXreset,
1245 RXDATA => AMC_RXDATA,
1246 RxBufOvf => RxBufOvf,
1247 RxBufUdf => RxBufUdf,
1248 sampleRatio => RxClkCntr19_q ,
1249 updateRatio => updateRatio ,
1250 RxClkRatio => RxClkRatio,
1251 rxprbserr => AMC_rxprbserr,
1252 rxprbssel => AMC_rxprbssel,
1253 RXNOTINTABLE => AMC_RXNOTINTABLE ,
1254 rxcommaalignen => AMC_rxcommaalignen ,
1255 rxchariscomma => AMC_rxchariscomma ,
1256 rxcharisk => AMC_rxcharisk ,
1257 rxresetdone => AMC_rxresetdone ,
1258 txdiffctrl => AMC_txdiffctrl,
1259 TXDATA => AMC_TXDATA,
1260 txoutclk => UsrClk_out,
1261 txcharisk => AMC_txcharisk,
1262 txresetdone =>
open,
1263 txprbssel => AMC_txprbssel,
1264 qpll_lock => AMC_qpll_lock,
1265 txfsmresetdone => AMC_txfsmresetdone ,
1266 rxfsmresetdone => AMC_rxfsmresetdone ,
1267 data_valid => AMC_data_valid,
1268 AMC_REFCLK => AMC_REFCLK,
1276 if(sysclk'event and sysclk = '1')then
1277 ovfl_warning_p <= ovfl_warning_i(3) and not en_localL1A;
1278 if(resetSyncRegs(2) = '1')then
1279 AllEventBuilt_i <= '1';
1281 for i in 0 to 2 loop
1282 if(EventBuilt(i) = '1')then
1283 EventBuiltToggle(i) <= not EventBuiltToggle(i);
1286 if(evt_cnt(0) = x"00" and evt_cnt(1) = x"00" and evt_cnt(2) = x"00")then
1287 AllEventBuilt_i <= '1';
1289 AllEventBuilt_i <= '0';
1292 if(RstAMC_link_dl = '1')then
1293 enRstAMC_link <= '0';
1294 elsif(ReSync = '1')then
1295 enRstAMC_link <= '1';
1299 i_RstAMC_link_dl : SRL16E
1301 Q => RstAMC_link_dl,
-- SRL data output
1302 A0 => '1',
-- Select[0] input
1303 A1 => '1',
-- Select[1] input
1304 A2 => '1',
-- Select[2] input
1305 A3 => '1',
-- Select[3] input
1306 CE => '1',
-- Clock enable input
1307 CLK => sysclk,
-- Clock input
1308 D => RstAMC_link
-- SRL data input
1312 if(UsrClk'event and UsrClk = '1')then
1313 LinkFull <= or_reduce(fake_full);
1316 fake_en <= '0' when test = '0' or AMC_en = x"000" else '1';
1320 reset => resetSyncRegs
(2),
1321 fifo_rst => fifo_rst,
1325 fake_length => fake_length ,
1326 ovfl_warning => ovfl_warning_p ,
1327 LinkFull => LinkFull,
1328 L1A_DATA => L1A_DATA,
1329 L1A_WrEn => L1A_WrEn,
1330 fake_header => fake_header ,
1331 fake_CRC => fake_CRC,
1332 empty_event_flag => empty_event_flag ,
1333 fake_DATA => fake_DATA,
1334 fake_WrEn => fake_WrEn
1336 process(UsrClk,reset)
1339 for i in 0 to 11 loop
1340 AMC_TTS(i)(7 downto 5) <= "000";
1342 elsif(UsrClk'event and UsrClk = '1')then
1343 for i in 0 to 11 loop
1344 if(AMC_TTS(i)(2) = '1' and AMC_Ready_i(i) = '1')then -- Out of Sync
1345 AMC_TTS(i)(5) <= '1';
1347 if(AMC_TTS(i)(3) = '1' and AMC_Ready_i(i) = '1')then -- error
1348 AMC_TTS(i)(6) <= '1';
1350 if(AMC_TTS(i)(4) = '1' and AMC_Ready_i(i) = '1')then -- disconnected
1351 AMC_TTS(i)(7) <= '1';
1358 if(UsrClk'event and UsrClk = '1')then
1359 AMC_TTS_OR <= AMC_TTS(0) or AMC_TTS(1) or AMC_TTS(2) or AMC_TTS(3) or AMC_TTS(4) or AMC_TTS(5) or
1360 AMC_TTS(6) or AMC_TTS(7) or AMC_TTS(8) or AMC_TTS(9) or AMC_TTS(10) or AMC_TTS(11) or err_TTS;
1363 err_TTS <= "000000" & stop_mon & '0';
1364 process(UsrClk,reset)
1367 TTS_FIFO_wa <= (others => '0');
1368 elsif(UsrClk'event and UsrClk = '1')then
1369 case TTS_FIFO_wa(2 downto 0) is
1370 when "000" => TTS_FIFO_wa(2 downto 0) <= "001";
1371 when "001" => TTS_FIFO_wa(2 downto 0) <= "011";
1372 when "011" => TTS_FIFO_wa(2 downto 0) <= "010";
1373 when "010" => TTS_FIFO_wa(2 downto 0) <= "110";
1374 when "110" => TTS_FIFO_wa(2 downto 0) <= "111";
1375 when "111" => TTS_FIFO_wa(2 downto 0) <= "101";
1376 when "101" => TTS_FIFO_wa(2 downto 0) <= "100";
1377 when others => TTS_FIFO_wa(2 downto 0) <= "000";
1389 TTS_FIFO_di(4 downto 0) <= AMC_TTS_OR(4 downto 0);
1390 TTS_FIFO_ra <= "00" & TTS_FIFO_waSyncRegs3;
1393 if(sysclk'event and sysclk = '1')then
1394 TTS_FIFO_waSyncRegs <= TTS_FIFO_wa(2 downto 0);
1395 TTS_FIFO_waSyncRegs2 <= TTS_FIFO_waSyncRegs;
1396 TTS_FIFO_waSyncRegs3 <= TTS_FIFO_waSyncRegs2;
1397 if(enRstAMC_link = '1')then
1398 TTS_coded <= "00010";
1399 elsif(AMC_en = AMC_Ready_i)then
1400 TTS_coded <= TTS_FIFO_do(4 downto 0);
1404 i_UsrClk_buf: bufg
port map(i => UsrClk_out
(6), o => UsrClk
);
1407 if(UsrClk'event and UsrClk = '1')then
1408 RxClkCntr <= RxClkCntr + 1;
1409 RXClkCntr19_q <= RXClkCntr(19);
1410 if(RXClkCntr19_q = '1' and RXClkCntr(19) = '0')then
1411 if(Cntr_ADDR(11 downto 5) = "1110001")then
1417 if(Cntr_ADDR(11 downto 7) = "11000" or Cntr_ADDR(11 downto 6) = "111000")then
1422 if(Cntr_ADDR(11 downto 7) = "11000" or Cntr_ADDR(11 downto 6) = "111000")then
1423 AMC_if_ADDR <= Cntr_ADDR(9) & Cntr_ADDR(6 downto 0);
1425 AMC_if_ADDR <= (others => '0');
1427 if(AMC_if_RdEn = '0')then
1428 AMC_if_data <= (others => '0');
1429 elsif(AMC_if_ADDR(7) = '0')then
1430 case AMC_if_ADDR(6 downto 4) is
1432 case AMC_if_ADDR(3 downto 0) is
1433 when x"0" => AMC_if_data <= EventInfo(0)(15 downto 0);
1434 when x"1" => AMC_if_data <= EventInfo(0)(31 downto 16);
1435 when x"2" => AMC_if_data <= EventInfo(1)(15 downto 0);
1436 when x"3" => AMC_if_data <= EventInfo(1)(31 downto 16);
1437 when x"4" => AMC_if_data <= EventInfo(2)(15 downto 0);
1438 when x"5" => AMC_if_data <= EventInfo(2)(31 downto 16);
1439 when x"6" => AMC_if_data <= EventInfo(3)(15 downto 0);
1440 when x"7" => AMC_if_data <= EventInfo(3)(31 downto 16);
1441 when x"8" => AMC_if_data <= EventInfo(4)(15 downto 0);
1442 when x"9" => AMC_if_data <= EventInfo(4)(31 downto 16);
1443 when x"a" => AMC_if_data <= EventInfo(5)(15 downto 0);
1444 when x"b" => AMC_if_data <= EventInfo(5)(31 downto 16);
1445 when x"c" => AMC_if_data <= EventInfo(6)(15 downto 0);
1446 when x"d" => AMC_if_data <= EventInfo(6)(31 downto 16);
1447 when x"e" => AMC_if_data <= EventInfo(7)(15 downto 0);
1448 when others => AMC_if_data <= EventInfo(7)(31 downto 16);
1451 case AMC_if_ADDR(3 downto 0) is
1452 when x"0" => AMC_if_data <= EventInfo(8)(15 downto 0);
1453 when x"1" => AMC_if_data <= EventInfo(8)(31 downto 16);
1454 when x"2" => AMC_if_data <= EventInfo(9)(15 downto 0);
1455 when x"3" => AMC_if_data <= EventInfo(9)(31 downto 16);
1456 when x"4" => AMC_if_data <= EventInfo(10)(15 downto 0);
1457 when x"5" => AMC_if_data <= EventInfo(10)(31 downto 16);
1458 when x"6" => AMC_if_data <= EventInfo(11)(15 downto 0);
1459 when x"7" => AMC_if_data <= EventInfo(11)(31 downto 16);
1460 when x"8" => AMC_if_data <= LinkFull & not AMC_qpll_lock & EventInfo_dav;
1461 when x"9" => AMC_if_data <= x"0" & fake_full;
1462 when x"a" => AMC_if_data <= AMC_TTC_status(15 downto 0);
1463 when x"b" => AMC_if_data <= AMC_TTC_status(31 downto 16);
1464 when x"c" => AMC_if_data <= x"0" & AMC_rxfsmresetdone;
1465 when x"d" => AMC_if_data <= x"0" & AMC_txfsmresetdone;
1466 when x"e" => AMC_if_data <= "0000000" & CDF_empty & CDF_cnt;
1467 when others => AMC_if_data <= errors & x"00";
1470 case AMC_if_ADDR(3 downto 0) is
1471 when x"0" => AMC_if_data <= "0000000" & evn_wa;
1472 when x"1" => AMC_if_data <= "0000000" & evn_ra;
1473 when x"2" => AMC_if_data <= evn(15 downto 0);
1474 when x"3" => AMC_if_data <= x"00" & evn(23 downto 16);
1475 when x"4" => AMC_if_data <= "0000000" & CDF_wa;
1476 when x"5" => AMC_if_data <= "0000000" & CDF_ra;
1477 when x"6" => AMC_if_data <= ec_CDF_ra & AMC_wc_we & sel_CDF & AMC_header_we & sel_evn & "00" & sel_AMC;
1478 when x"7" => AMC_if_data <= "000" & evt_buf_full & mon_en & WaitMonBuF & TCPbuf_avl & mon_buf_avl & init_bldr & evn_empty & EventInfo_avl & bldr_fifo_full;
1479 when x"8" => AMC_if_data <= fake_word_cnt;
1480 when x"a" => AMC_if_data <= fake_header_cnt;
1481 when x"c" => AMC_if_data <= fake_evt_cnt;
1482 when x"e" => AMC_if_data <= empty_evt_cnt;
1483 when others => AMC_if_data <= (others => '0');
1486 case AMC_if_ADDR(3 downto 0) is
1487 when x"0" => AMC_if_data <= TTC_status(3)(5 downto 2) & TTC_status(2)(5 downto 2) & TTC_status(1)(5 downto 2) & TTC_status(0)(5 downto 2);
1488 when x"1" => AMC_if_data <= TTC_status(7)(5 downto 2) & TTC_status(6)(5 downto 2) & TTC_status(5)(5 downto 2) & TTC_status(4)(5 downto 2);
1489 when x"2" => AMC_if_data <= TTC_status(11)(5 downto 2) & TTC_status(10)(5 downto 2) & TTC_status(9)(5 downto 2) & TTC_status(8)(5 downto 2);
1490 when x"4" => AMC_if_data <= AMC_TTS(1) & AMC_TTS(0);
1491 when x"5" => AMC_if_data <= AMC_TTS(3) & AMC_TTS(2);
1492 when x"6" => AMC_if_data <= AMC_TTS(5) & AMC_TTS(4);
1493 when x"7" => AMC_if_data <= AMC_TTS(7) & AMC_TTS(6);
1494 when x"8" => AMC_if_data <= AMC_TTS(9) & AMC_TTS(8);
1495 when x"9" => AMC_if_data <= AMC_TTS(11) & AMC_TTS(10);
1496 when x"a" => AMC_if_data <= evt_cnt(1) & evt_cnt(0);
1497 when x"b" => AMC_if_data <= "000000" & AllEventBuilt_i & AllEventBuilt_i & evt_cnt(2);
1498 when others => AMC_if_data <= (others => '0');
1501 case AMC_if_ADDR(3 downto 0) is
1502 when x"0" => AMC_if_data <= badEventCRC_cntr(0);
1503 when x"2" => AMC_if_data <= badEventCRC_cntr(1);
1504 when x"4" => AMC_if_data <= badEventCRC_cntr(2);
1505 when x"6" => AMC_if_data <= badEventCRC_cntr(3);
1506 when x"8" => AMC_if_data <= badEventCRC_cntr(4);
1507 when x"a" => AMC_if_data <= badEventCRC_cntr(5);
1508 when x"c" => AMC_if_data <= badEventCRC_cntr(6);
1509 when x"e" => AMC_if_data <= badEventCRC_cntr(7);
1510 when others => AMC_if_data <= (others => '0');
1513 case AMC_if_ADDR(3 downto 0) is
1514 when x"0" => AMC_if_data <= badEventCRC_cntr(8);
1515 when x"2" => AMC_if_data <= badEventCRC_cntr(9);
1516 when x"4" => AMC_if_data <= badEventCRC_cntr(10);
1517 when x"6" => AMC_if_data <= badEventCRC_cntr(11);
1518 when x"8" => AMC_if_data <= EventBuiltCnt(0);
1519 when x"a" => AMC_if_data <= EventBuiltCnt(1);
1520 when x"c" => AMC_if_data <= EventBuiltCnt(2);
1521 when others => AMC_if_data <= (others => '0');
1523 when "110" | "111" =>
1524 if(AMC_if_ADDR(0) = '0')then
1525 AMC_if_data <= x"00" & "00" & AMC_wc_sum_do;
1527 AMC_if_data <= (others => '0');
1529 when others => AMC_if_data <= (others => '0');
1532 case AMC_if_ADDR(5 downto 4) is
1534 case AMC_if_ADDR(3 downto 0) is
1535 when x"0" => AMC_if_data <= ReSyncFakeEvent_cntr(0);
1536 when x"2" => AMC_if_data <= ReSyncFakeEvent_cntr(1);
1537 when x"4" => AMC_if_data <= ReSyncFakeEvent_cntr(2);
1538 when x"6" => AMC_if_data <= ReSyncFakeEvent_cntr(3);
1539 when x"8" => AMC_if_data <= ReSyncFakeEvent_cntr(4);
1540 when x"a" => AMC_if_data <= ReSyncFakeEvent_cntr(5);
1541 when x"c" => AMC_if_data <= ReSyncFakeEvent_cntr(6);
1542 when x"e" => AMC_if_data <= ReSyncFakeEvent_cntr(7);
1543 when others => AMC_if_data <= (others => '0');
1546 case AMC_if_ADDR(3 downto 0) is
1547 when x"0" => AMC_if_data <= ReSyncFakeEvent_cntr(8);
1548 when x"2" => AMC_if_data <= ReSyncFakeEvent_cntr(9);
1549 when x"4" => AMC_if_data <= ReSyncFakeEvent_cntr(10);
1550 when x"6" => AMC_if_data <= ReSyncFakeEvent_cntr(11);
1551 when others => AMC_if_data <= (others => '0');
1554 case AMC_if_ADDR(3 downto 0) is
1555 when x"0" => AMC_if_data <= RxClkRatio(0)(15 downto 0);
1556 when x"1" => AMC_if_data <= x"00" & "000" & RxClkRatio(0)(20 downto 16);
1557 when x"2" => AMC_if_data <= RxClkRatio(1)(15 downto 0);
1558 when x"3" => AMC_if_data <= x"00" & "000" & RxClkRatio(1)(20 downto 16);
1559 when x"4" => AMC_if_data <= RxClkRatio(2)(15 downto 0);
1560 when x"5" => AMC_if_data <= x"00" & "000" & RxClkRatio(2)(20 downto 16);
1561 when x"6" => AMC_if_data <= RxClkRatio(3)(15 downto 0);
1562 when x"7" => AMC_if_data <= x"00" & "000" & RxClkRatio(3)(20 downto 16);
1563 when x"8" => AMC_if_data <= RxClkRatio(4)(15 downto 0);
1564 when x"9" => AMC_if_data <= x"00" & "000" & RxClkRatio(4)(20 downto 16);
1565 when x"a" => AMC_if_data <= RxClkRatio(5)(15 downto 0);
1566 when x"b" => AMC_if_data <= x"00" & "000" & RxClkRatio(5)(20 downto 16);
1567 when x"c" => AMC_if_data <= RxClkRatio(6)(15 downto 0);
1568 when x"d" => AMC_if_data <= x"00" & "000" & RxClkRatio(6)(20 downto 16);
1569 when x"e" => AMC_if_data <= RxClkRatio(7)(15 downto 0);
1570 when others => AMC_if_data <= x"00" & "000" & RxClkRatio(7)(20 downto 16);
1573 case AMC_if_ADDR(3 downto 0) is
1574 when x"0" => AMC_if_data <= RxClkRatio(8)(15 downto 0);
1575 when x"1" => AMC_if_data <= x"00" & "000" & RxClkRatio(8)(20 downto 16);
1576 when x"2" => AMC_if_data <= RxClkRatio(9)(15 downto 0);
1577 when x"3" => AMC_if_data <= x"00" & "000" & RxClkRatio(9)(20 downto 16);
1578 when x"4" => AMC_if_data <= RxClkRatio(10)(15 downto 0);
1579 when x"5" => AMC_if_data <= x"00" & "000" & RxClkRatio(10)(20 downto 16);
1580 when x"6" => AMC_if_data <= RxClkRatio(11)(15 downto 0);
1581 when x"7" => AMC_if_data <= x"00" & "000" & RxClkRatio(11)(20 downto 16);
1582 when x"8" => AMC_if_data <= x"0" & RxBufUdfErr;
1583 when x"9" => AMC_if_data <= x"0" & RxBufOvfErr;
1584 when others => AMC_if_data <= (others => '0');
1594 ipb_clk => ipb_clk ,
1595 resetCntr => resetCntr,
1597 AMC_if_data => AMC_if_data,
1598 Cntr_DATA => Cntr_DATA,
1599 Cntr_ADDR => Cntr_ADDR,
1600 ipb_addr => ipb_addr
(15 downto 0),
1601 ipb_rdata => AMC_cntr_data
1603 process(UsrClk,reset)
1606 RxBufOvfErr <= (others => '0');
1607 RxBufUdfErr <= (others => '0');
1608 elsif(UsrClk'event and UsrClk = '1')then
1609 for i in 0 to 11 loop
1610 RxBufOvfErr(i) <= (RxBufOvfErr(i) or RxBufOvf(i)) and AMC_en(i) and not test;
1611 RxBufUdfErr(i) <= (RxBufUdfErr(i) or RxBufUdf(i)) and AMC_en(i) and not test;
1615 process(TTC_status, AMC_en)
1617 for i in 0 to 11 loop
1618 AMC_TTC_status(i) <= TTC_status(i)(0) and AMC_en(i);
1619 AMC_TTC_status(i+16) <= TTC_status(i)(1) and AMC_en(i);
1622 TTC_lock <= and_reduce(AMC_TTC_status(27 downto 16) or not AMC_en);
1623 BC0_lock <= AMC_TTC_status(11 downto 0);
1624 AMC_TTC_status(31 downto 28) <= x"0";
1625 AMC_TTC_status(15 downto 12) <= x"0";
1628 if(ipb_clk'event and ipb_clk = '1')then
1629 if(ipb_strobe = '1' and ipb_write = '1' and ipb_addr(14 downto 0) = MON_ctrl_addr(14 downto 0) and ipb_addr(27) = '0')then
1632 ipb_strobe_q <= ipb_strobe;
1635 ipb_ack <= '0' when ipb_addr(27) = '1' or ipb_addr(15 downto 11) /= AMC_reg_addr(15 downto 11) or ipb_write = '1' else ipb_strobe;
1638 if(ipb_addr(15 downto 9) = L1A_buf_addr(15 downto 9))then
1639 ipb_rdata <= L1A_buf_do;
1640 elsif(ipb_addr(14 downto 11) /= AMC_reg_addr(14 downto 11))then
1641 ipb_rdata <= (others => '0');
1643 ipb_rdata <= AMC_cntr_data;
1646 AMC_status(31 downto 28) <= (others => '0');
1647 AMC_status(27 downto 16) <= AMC_data_valid or not AMC_en;
1648 AMC_status(15 downto 12) <= (others => '0');
1649 inc_div <= x"004" when CntrRstCycle = '1' else x"001";
1652 if(UsrClk'event and UsrClk = '1')then
1653 for i in 0 to 2 loop
1654 EventBuiltToggleSyncRegs(i) <= EventBuiltToggleSyncRegs(i)(2 downto 0) & EventBuiltToggle(i);
1656 for i in 0 to 11 loop
1657 badEventCRCToggleSyncRegs(i) <= badEventCRCToggleSyncRegs(i)(2 downto 0) & badEventCRCToggle(i);
1658 ReSyncFakeEventToggleSyncRegs(i) <= ReSyncFakeEventToggleSyncRegs(i)(2 downto 0) & ReSyncFakeEventToggle(i);
1660 if(CntrRst = '1')then
1661 badEventCRC_cntr <= (others => (others => '0'));
1662 ReSyncFakeEvent_cntr <= (others => (others => '0'));
1663 EventBuiltCnt <= (others => (others => '0'));
1664 fake_word_cnt <= (others => '0');
1665 fake_evt_cnt <= (others => '0');
1666 empty_evt_cnt <= (others => '0');
1667 fake_header_cnt <= (others => '0');
1669 for i in 0 to 11 loop
1670 if(badEventCRCToggleSyncRegs(i)(3) /= badEventCRCToggleSyncRegs(i)(2))then
1671 badEventCRC_cntr(i) <= badEventCRC_cntr(i) + 1;
1673 if(ReSyncFakeEventToggleSyncRegs(i)(3) /= ReSyncFakeEventToggleSyncRegs(i)(2))then
1674 ReSyncFakeEvent_cntr(i) <= ReSyncFakeEvent_cntr(i) + 1;
1677 for i in 0 to 2 loop
1678 if(EventBuiltToggleSyncRegs(i)(3) /= EventBuiltToggleSyncRegs(i)(2))then
1679 EventBuiltCnt(i) <= EventBuiltCnt(i) + 1;
1682 if(fake_WrEn = '1')then
1683 fake_word_cnt <= fake_word_cnt + 1;
1685 if(fake_CRC = '1')then
1686 fake_evt_cnt <= fake_evt_cnt + 1;
1688 if(fake_CRC = '1' and empty_event_flag = '1')then
1689 empty_evt_cnt <= empty_evt_cnt + 1;
1691 if(fake_WrEn = '1' and fake_header = '1')then
1692 fake_header_cnt <= fake_header_cnt + 1;
1695 resetCntr_SyncRegs <= resetCntr_SyncRegs(1 downto 0) & resetCntr;
1696 CntrRst <= (not resetCntr_SyncRegs(2) and resetCntr_SyncRegs(1)) or RstAMC_link;
1699 i_AMC_refclk: IBUFDS_GTE2
1705 I => AMC_REFCLK_P,
-- Connect to package pin AB6
1706 IB => AMC_REFCLK_N
-- Connect to package pin AB5
1711 if(sysclk'event and sysclk = '1')then
1712 if(resetSyncRegs(2) = '1')then
1713 errors <= (others => '0');
1716 if(or_reduce(AMCCRC_bad(0)) = '1' or or_reduce(AMCCRC_bad(1)) = '1' or or_reduce(AMCCRC_bad(2)) = '1')then
1719 if(or_reduce(errors and scale(31 downto 24)) = '1' and rst_init_bldr = '1' and LastBlock = '1')then
1723 case scale(22 downto 19) is
1724 when x"0" => mon_mask <= x"00000";
1725 when x"1" => mon_mask <= x"80000";
1726 when x"2" => mon_mask <= x"c0000";
1727 when x"3" => mon_mask <= x"e0000";
1728 when x"4" => mon_mask <= x"f0000";
1729 when x"5" => mon_mask <= x"f8000";
1730 when x"6" => mon_mask <= x"fc000";
1731 when x"7" => mon_mask <= x"fe000";
1732 when x"8" => mon_mask <= x"ff000";
1733 when x"9" => mon_mask <= x"ff800";
1734 when x"a" => mon_mask <= x"ffc00";
1735 when x"b" => mon_mask <= x"ffe00";
1736 when x"c" => mon_mask <= x"fff00";
1737 when x"d" => mon_mask <= x"fff80";
1738 when x"e" => mon_mask <= x"fffc0";
1739 when others => mon_mask <= x"fffe0";
1741 if(CDF_Header = '1' and init_bldr = '1')then
1742 if(and_reduce(CDF_out(51 downto 32) or mon_mask) = '1')then
1743 sample_event <= '1';
1745 sample_event <= '0';
1748 if(useTCPIP = true and enSFP(3) = '0' and enSFP(2 downto 0) /= "000")then
1751 elsif(resetSyncRegs(2) = '1')then
1752 -- After reset, the first event will always be recorded
1753 mon_en <= not scale(23);
1755 elsif(rst_init_bldr = '1' and LastBlock = '1')then
1756 if(scale(23) = '1')then
1757 mon_en <= sample_event and (mon_buf_avl or WaitMonBuf) and not stop_mon;
1760 mon_en <= (mon_buf_avl or WaitMonBuf) and not stop_mon and (and_reduce(scale_cntr) or pending);
1761 pending <= not mon_buf_avl and (and_reduce(scale_cntr) or pending);
1764 -- if(resetSyncRegs(2) = '1')
then
1765 -- start_wc_reg_wa <= (others => '0');
1766 -- elsif(FirstBlock(0) = '1'
and ce_wc_reg_wa = '1')
then
1767 -- start_wc_reg_wa <= wc_reg_wa;
1769 if(resetSyncRegs(2) = '1' or rst_mon_wc = '1')then
1770 mon_wc(0) <= (others => '0');
1771 elsif(zero_wc(0) = '0' and (header = '1' or sel_CDF = '1' or (more_wc(0) = '0' and rst_init_bldr = '1')))then
1772 mon_wc(0) <= mon_wc(0) + 1;
1773 elsif(AMC_wc_we(0) = '1')then
1774 mon_wc(0) <= mon_wc(0) + ("000" & AMC_wc(12 downto 0)) + 1;
1776 if(resetSyncRegs(2) = '1' or rst_mon_wc = '1')then
1777 mon_wc(1) <= (others => '0');
1778 elsif(zero_wc(1) = '0' and (header = '1' or sel_CDF = '1' or (more_wc(1) = '0' and rst_init_bldr = '1')))then
1779 mon_wc(1) <= mon_wc(1) + 1;
1780 elsif(AMC_wc_we(1) = '1')then
1781 mon_wc(1) <= mon_wc(1) + ("000" & AMC_wc(12 downto 0)) + 1;
1783 if(resetSyncRegs(2) = '1' or rst_mon_wc = '1')then
1784 mon_wc(2) <= (others => '0');
1785 elsif(zero_wc(2) = '0' and (header = '1' or sel_CDF = '1' or (more_wc(2) = '0' and rst_init_bldr = '1')))then
1786 mon_wc(2) <= mon_wc(2) + 1;
1787 elsif(AMC_wc_we(2) = '1')then
1788 mon_wc(2) <= mon_wc(2) + ("000" & AMC_wc(12 downto 0)) + 1;
1790 if(ce_scale = '1')then
1791 if(ld_scale = '1')then
1792 scale_cntr <= not scale(15 downto 0);
1794 scale_cntr <= scale_cntr + 1;
1797 if(resetSyncRegs(2) = '1')then
1800 ce_wc_reg_wa <= '0';
1801 -- MonBufAbort <= '0';
1803 ce_scale <= init_bldr and CDF_Header;
1804 ld_scale <= mon_en or pending;
1805 ce_wc_reg_wa <= rst_init_bldr and AMC_header(0)(64);
1806 -- MonBufAbort <= rst_init_bldr and mon_en and not AMC_header(0)(
64);
1808 rst_mon_wc <= rst_init_bldr;
1809 if(resetSyncRegs(2) = '1' or rst_mon_wc = '1')then
1810 en_block_wc <= (others => '0');
1812 en_block_wc <= en_block_wc or amc_header_we;
1814 for i in 0 to 2 loop
1815 block_wc_we(i) <= rst_init_bldr and en_block_wc(i);
1817 if(resetSyncRegs(2) = '1')then
1818 EventInfoRdDone <= (others => '0');
1819 elsif(sel_AMC = x"b")then
1820 -- EventInfoRdDone <= '1' & AMC_hasData_l;
1821 EventInfoRdDone <= '1' & AMC_hasData;
1823 EventInfoRdDone <= (others => '0');
1825 rst_init_bldr <= EventInfoRdDone(12);
1826 if(resetSyncRegs(2) = '1')then
1827 wc_reg_wa <= (others => '0');
1828 -- elsif(MonBufAbort = '1')then
1829 -- wc_reg_wa <= start_wc_reg_wa;
1830 elsif(ce_wc_reg_wa = '1')then
1831 wc_reg_wa <= wc_reg_wa + 1;
1835 g_mon_evt_wc: for i in 0 to 2 generate
1836 i_mon_evt_wc : BRAM_SDP_MACRO
1838 BRAM_SIZE =>
"18Kb",
-- Target BRAM, "18Kb" or "36Kb"
1839 DEVICE =>
"7SERIES",
-- Target device: "VIRTEX5",
"VIRTEX6",
"7SERIES",
"SPARTAN6"
1840 WRITE_WIDTH =>
16,
-- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
1841 READ_WIDTH =>
16,
-- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")
1842 DO_REG =>
0,
-- Optional output register (0 or 1)
1843 SIM_COLLISION_CHECK =>
"NONE",
-- Collision check enable "ALL",
"WARNING_ONLY",
1844 -- "GENERATE_X_ONLY" or "NONE"
1845 WRITE_MODE =>
"WRITE_FIRST",
-- Specify "READ_FIRST" for same clock
or synchronous clocks
1846 -- Specify "WRITE_FIRST for asynchrononous clocks on ports
1847 INIT => X"000000000000000000"
) -- Initial values on output port
1849 DO => mon_evt_wcp
(i*16+15
downto i*16
),
-- Output read data port, width defined by READ_WIDTH parameter
1850 DI => mon_wc
(i
),
-- Input write data port, width defined by WRITE_WIDTH parameter
1851 RDADDR => ddr_pa,
-- Input read address, width defined by read port depth
1852 RDCLK => ipb_clk,
-- 1-bit input read clock
1853 RDEN => '1',
-- 1-bit input read port enable
1854 REGCE => '1',
-- 1-bit input read output register enable
1855 RST => MonBuf_empty,
-- 1-bit input reset
1856 WE => "
11",
-- Input write enable, width defined by write port depth
1857 WRADDR => wc_reg_wa,
-- Input write address, width defined by write port depth
1858 WRCLK => sysclk,
-- 1-bit input write clock
1859 WREN => ce_wc_reg_wa
-- 1-bit input write port enable
1862 mon_evt_wc(15 downto 0) <= mon_evt_wcp(15 downto 0) when OneSFP = '1' else mon_evt_wcp(31 downto 16);
1863 mon_evt_wc(31 downto 16) <= x"0000" when OneSFP = '1' else mon_evt_wcp(15 downto 0);
1864 mon_evt_wc(47 downto 32) <= mon_evt_wcp(47 downto 32);
1867 if(sysclk'event and sysclk = '1')then
1868 ThreeSFP <= and_reduce(EnSFP(2 downto 0));
1869 if(EnSFP(2 downto 0) = "011" or EnSFP(2 downto 0) = "101" or EnSFP(2 downto 0) = "110")then
1874 if(EnSFP(2 downto 0) = "001" or EnSFP(2 downto 0) = "010" or EnSFP(2 downto 0) = "100" or EnSFP(2 downto 0) = "000")then
1884 fifo_rst => fifo_rst,
1887 resetFIFO <= reset or or_reduce(not AMC_txfsmresetdone and AMC_en);
1890 if(sysclk'event and sysclk = '1')then
1891 if(resetSyncRegs(2) = '1')then
1892 rst_AMC_wc_sum <= '1';
1893 wr_AMC_wc_sum <= '0';
1895 if(wr_AMC_wc_sum = '1' and ec_sel_AMC = '0')then
1896 rst_AMC_wc_sum <= '0';
1898 wr_AMC_wc_sum <= ec_sel_AMC;
1900 sel_AMC_q <= sel_AMC;
1905 di => AMC_wc_sum_di,
1906 we => AMC_wc_sum_we,
1907 wa => AMC_wc_sum_a ,
1908 ra => AMC_wc_sum_a ,
1911 AMC_wc_sum_di <= AMC_wc_sum_do + AMC_wc(5 downto 0) when rst_AMC_wc_sum = '0' else AMC_wc(5 downto 0);
1912 AMC_wc_sum_a(3 downto 0) <= sel_AMC_q when wr_AMC_wc_sum = '1' else AMC_if_ADDR(4 downto 1);