1 -- --------------------------------------------------------------------- 3 --- b2tt.vhd --- Belle II TT-link receiver top 5 -- This firmware is a reference design for a frontend board 6 -- which is connected to ft2u firmware 8 -- (Note: there are still missing features, 9 -- marked with TBI = to be implemented.) 11 -- Mikihiko Nakao, KEK IPNS 14 -- 20130530 0.01 first version 15 -- (there are many intermediate versions between 0.01 and 0.02) 16 -- 20130926 0.02 revised (revo/revo9, b2ltag in ack packet) 17 -- 20131002 0.03 revised (exprun, b2tt_ddr.vhd) 18 -- 20131013 0.04 merging v5,v6,s6 versions 19 -- 20131028 0.05 fixing b2tt_ddr 20 -- 20131101 0.06 no more std_logic_arith 21 -- 20131110 0.07 96-bit fifodata for final(?) header format 22 -- 20131118 0.08 all open ports are connected to dummy signals 23 -- 20131119 0.09 S6 iodelay2 fix 24 -- 20131121 0.10 tested with S6/V5/V6, more iodelay monitor and control 25 -- 20131127 0.11 duplicated header fix (bug in b2tt_fifo) 26 -- 20131218 0.12 entagerr added 27 -- 20140102 0.13 fix for one-pulse err signal, tagerr check ini.values 28 -- 20140406 0.14 ttup error study 29 -- 20140409 0.15 crc8 trial 30 -- 20140607 0.16 b2tt version output 31 -- 20140611 0.17 revised dbg for chipscope of KLM data concentrator 32 -- 20140614 0.18 port 0.17 changes to v5 and s6 33 -- 20140618 0.19 iserdes version for v6 34 -- 20140704 0.20 interface adjustment for v5 and s6 35 -- 20140708 0.21 iserdes version for v6 tuning 36 -- 20140710 0.22 crc8 for rx, ila revised, signals for scan mode 37 -- 20140710 0.23 no sigslip version (scan test, only for v6) 38 -- 20140710 0.24 delay scan (calc test, only for v6) 39 -- 20140710 0.25 delay scan and set (only for v6) 40 -- 20140715 0.26 improved error handling 41 -- 20140718 0.27 b2ttup and b2lup should be current status 42 -- 20140729 0.28 new b2tt_symbols for ft2u059 43 -- 20140808 0.29 b2tt_payload separated from b2tt_encode 44 -- 20140827 0.30 one frame long runreset, busyup at runreset fix 45 -- 20140902 0.31 sim_speedup, optional external clock source 46 -- 20141002 0.32 gtpreset when clk is lost and recovered 47 -- 20150105 0.33 no more raw ddr signal out, rawclk after bufg 48 -- 20150112 0.34 jtag handling, trgmask, cleanup unused signals 49 -- 20150112 0.35 timerr fix 50 -- 20150227 0.36 merging trgmask fixes 51 -- 20150310 0.37 clraddr, stareset 52 -- 20150428 0.38 b2tt encode fix, decode clraddr 53 -- 20150525 0.39 b2tt decode to no tagerr when mask is cleared 54 -- 20150528 0.40 DIVCLK fix 55 -- 20150630 0.41 254MHz clock input option for DHH with recovered clock 56 -- 20150718 0.42 b2tt decode fix mix up is fixed 57 -- 20150723 0.43 changes: spartan-6 invclock, cnt_trig for timing constraint 58 -- 20160315 0.44 b2tt_decode trgmask 59 -- 20160316 0.45 SEU mitigation bits rearranged 60 -- 20160407 0.46 trgtag + 1 before filling fifo, trgmask fix 61 -- 20160627 0.47 trgtag update timing, no more trgtag + 1 before fifo 62 -- 20160628 0.48 fix tagerr in 0.47 63 -- 20170403 0.49 major payload rearrangement 64 -- 20170406 0.50 further rearrangement for ft3o 65 -- 20170713 0.51 frame, revo, injv, rstmask, usrreg 66 -- 20170724 0.52 error code cleanup, semreset 68 -- --------------------------------------------------------------------- 72 use ieee.std_logic_1164.
all;
73 use ieee.std_logic_unsigned.
all;
74 use ieee.numeric_std.
all;
82 SUBSYSTEM : (3 downto 0) := TTFEE_UNDEF;
88 COMPAT : := 29;
-- for transition to new protocol 89 DEFADDR : (19 downto 0) := x"00000";
90 FLIPCLK : := '0';
-- no more used 94 CLKDIV1 : range 1 to 72 := 3;
95 CLKDIV2 : range 1 to 72 := 4;
98 NBITTIM : range 1 to 32 := 32;
99 NBITTAG : range 4 to 32 := 32;
100 --NBITID : integer range 4 to 32 := 16; fixed to 16 bit 101 B2LRATE : := 4;
-- 127 Mbyte / s 103 USE254IN : := '0';
-- 254 MHz clock in for DHH 104 SIM_SPEEDUP : := '0' );
108 b2ttver : out (15 downto 0);
120 --- alternative external clock source 128 id : in (15 downto 0);
130 -- user status register (for debug) 131 usrreg : out (7 downto 0);
132 usrdat : in (15 downto 0);
138 --- system clock and time 140 sysclkinv : out ;
--#CK, bring out for wilk_clk 144 utime : out (NBITTIM-1 downto 0);
145 ctime : out (26 downto 0);
148 divclk1 : out (1 downto 0);
149 divclk2 : out (1 downto 0);
151 --- exp- / run-number 152 exprun : out (31 downto 0);
160 rstmask : out ;
-- for runreset 164 trgtyp : out (3 downto 0);
165 trgtag : out (31 downto 0);
170 --revo3 : out std_logic; 172 revoloc : out (10 downto 0);
177 injvpos : out (10 downto 0);
178 injvpre : out (10 downto 0);
179 injvlen : out (10 downto 0);
180 injvfull : out (9 downto 0);
181 injvgate : out (9 downto 0);
183 --- busy and status return 184 busysrc : in (7 downto 0);
-- to suspend the trigger 185 feeerr : in (7 downto 0);
-- to stop the run 187 --- Belle2link status 193 --- SEM status (virtex5_seu_controller or SEU mitigation ipcore) 194 semscan : in ;
-- end_of_scan / watchdog (=> 1 bit) 195 semdet : in ;
-- seu_detect / corrected (=> 2 bit counter) 196 semmbe : in ;
-- mbe/uncorrectable 197 semcrc : in ;
-- crc_error (virtex5 only) (=> combined) 199 --- data for Belle2link header 201 fifodata : out (95 downto 0);
205 regdbg :
in (
7 downto 0);
206 octet : out (7 downto 0);
-- decode 207 isk : out ;
-- decode 208 cntbit2 : out (2 downto 0);
-- decode 209 sigbit2 : out (1 downto 0);
-- decode 210 dbglink : out (95 downto 0);
211 dbgerr : out (95 downto 0) );
214 --- b2tt: architecture 215 architecture implementation
of b2tt is
217 signal clk_i : := '0';
218 signal clk_inv : := '0';
219 signal clk_dbl : := '0';
220 signal clk_dblinv : := '0';
221 ------ sig_254s : std_logic := '0'; 223 signal regin : (5 downto 0) := (others => '0');
224 signal reg_imanual : := '0';
225 signal clr_idelay : := '0';
226 signal set_idelay : := '0';
227 signal sig_caldelay : := '0';
229 signal sta_dcm : := '0';
230 signal buf_myaddr : (19 downto 0) := DEFADDR;
231 signal sta_ictrl : (1 downto 0) := "11";
233 signal sta_utime : (31 downto 0) := (others => '0');
234 signal sta_ctime : (26 downto 0) := (others => '0');
235 signal sta_timerr : := '0';
236 signal sig_runreset : := '0';
237 signal sig_errreset : := '0';
238 signal sig_trig : := '0';
239 signal sta_trgtyp : (3 downto 0) := (others => '0');
240 signal sta_trgtag : (31 downto 0) := (others => '1');
241 signal sta_tagerr : := '0';
242 signal sta_trgmask : := '0';
243 signal sta_rstmask : := '0';
245 signal sta_trgshort : := '0';
246 signal sta_octet : := '0';
247 signal sta_ttup : := '0';
248 signal cnt_linkrst : (7 downto 0) := (others => '0');
249 signal sig_frame : := '0';
250 signal sig_frame3 : := '0';
251 signal sig_frame9 : := '0';
252 signal cnt_frameloc : (10 downto 0) := (others => '0');
253 signal buf_revoloc : (10 downto 0) := (others => '0');
254 signal buf_payload : (76 downto 0) := (others => '0');
255 signal sig_payload : := '0';
256 signal sig_idle : := '0';
258 signal cnt_packet : (7 downto 0) := (others => '0');
259 signal cnt_idelay : (6 downto 0) := (others => '0');
260 signal cnt_iwidth : (5 downto 0) := (others => '0');
261 signal sta_iddr : (1 downto 0) := (others => '0');
262 signal sta_rxerr : (8 downto 0) := (others => '0');
264 signal sta_fifoful : := '0';
265 signal sta_fifoemp : := '0';
-- unused 266 signal sta_fifoerr : := '0';
267 signal sta_fifordy : := '0';
269 signal sig_trgdat : (95 downto 0) := (others => '0');
271 signal buf_rxisk : := '0';
272 signal buf_rxoctet : (7 downto 0) := (others => '0');
273 signal buf_rxbit2 : (1 downto 0) := (others => '0');
274 signal buf_rxcnt2 : (2 downto 0) := (others => '0');
275 signal buf_rxcnto : (4 downto 0) := (others => '0');
276 signal buf_rxcntd : (3 downto 0) := (others => '0');
278 signal cnt_ftag : (15 downto 0) := (others => '0');
279 signal cnt_b2lwe : (15 downto 0) := (others => '0');
281 signal buf_txdata : (111 downto 0) := (others => '0');
282 signal sig_txfill : ;
284 signal sta_bsyin : := '0';
285 signal sta_errin : := '0';
287 -- unused signals defined for poor simulator 288 signal open_jtag : (2 downto 0) := (others => '0');
289 signal open_jtagdbg : (9 downto 0) := (others => '0');
290 signal open_clkfreq : (23 downto 0) := (others => '0');
291 signal open_stat : (1 downto 0) := (others => '0');
292 signal open_drd : (95 downto 0) := (others => '0');
293 signal open_dbg : (17 downto 0) := (others => '0');
294 signal open_bit10 : (9 downto 0) := (others => '0');
295 signal open_clraddr : := '0';
296 signal open_bsyrst : := '0';
297 signal open_dismask : := '0';
299 -- signals for debug and chipscope 300 signal buf_txcnt2 : (2 downto 0) := (others => '0');
301 signal buf_txcnto : (3 downto 0) := (others => '0');
302 signal buf_txisk : := '0';
303 signal buf_txoctet : (7 downto 0) := (others => '0');
304 signal buf_txbit2 : (1 downto 0) := (others => '0');
305 signal buf_txbsyup : := '0';
306 signal buf_txbsydn : := '0';
308 signal sig_iddrdbg : (9 downto 0) := (others => '0');
309 signal sig_crcdbg : (8 downto 0) := (others => '0');
311 signal sta_badver : := '0';
313 signal seq_dcm : (1 downto 0) := "11";
314 signal sig_clklost : := '0';
315 signal clk_raw : := '0';
316 signal sig_gtpreset : := '0';
317 signal sig_semreset : := '0';
319 signal buf_regsel : (4 downto 0) := (others => '0');
320 signal buf_usrreg : (7 downto 0) := (others => '0');
321 signal buf_id : (23 downto 0) := (others => '0');
322 signal buf_ver : (23 downto 0) := (others => '0');
324 signal buf_idly : (23 downto 0) := (others => '0');
329 regin <= regdbg(
5 downto 0);
330 reg_imanual <= regin(
0);
331 set_idelay <= regin(
2);
332 clr_idelay <= regin(3);
333 sig_caldelay <= regin(4);
334 buf_idly <= "000000" & cnt_iwidth & '0' & cnt_idelay & "00" & sta_iddr;
337 gen_useextclk0: if USEEXTCLK = '0' generate 341 USEICTRL => USEICTRL,
342 USE254IN => USE254IN
) 346 reset => '0',
-- (probably there's no way to reset) 347 rawclk => clk_raw,
-- out 348 clock => clk_i,
-- out 349 invclock => clk_inv,
-- out 350 dblclock => clk_dbl,
-- out 351 dblclockb => clk_dblinv,
-- out 353 locked => sta_dcm,
-- out 354 stat => sta_ictrl
);
-- out 356 gen_useextclk1: if USEEXTCLK = '1' generate 358 clk_inv <= extclkinv;
359 clk_dbl <= extclkdbl;
360 clk_dblinv <= extdblinv;
362 sta_dcm <= extclklck;
366 proc_clk_raw:
process (clk_raw)
368 if rising_edge(clk_raw) then 369 seq_dcm <= seq_dcm(0) & sta_dcm;
370 sig_clklost <= seq_dcm(0) and (not seq_dcm(1));
375 gtpreset <= sig_gtpreset or sig_clklost;
377 sig_trgdat <= sta_fifoerr & sta_ctime(26 downto 0) & sta_trgtyp(3 downto 0) & 378 sta_trgtag(31 downto 0) & 379 sta_utime(31 downto 0);
391 ready => sta_fifordy,
392 dout => fifodata,
-- out 393 drd => open_drd,
-- out 394 err => sta_fifoerr,
-- out 395 dbg => open_dbg,
-- out 396 empty => sta_fifoemp,
-- out 397 full => sta_fifoful
);
-- out 403 cntpacket => cnt_packet,
-- 7:0 404 frameloc => cnt_frameloc,
-- 10:0 405 sigpayload => sig_payload,
406 payload => buf_payload,
-- 76:0 407 revoloc => buf_revoloc,
-- out 10:0 408 revosig => revosig,
-- out 409 abortgap => abortgap
);
-- out 415 cntpacket => cnt_packet,
-- 7:0 416 frameloc => cnt_frameloc,
-- 10:0 417 revoloc => buf_revoloc,
-- 10:0 418 sigpayload => sig_payload,
419 payload => buf_payload,
-- 76:0 420 injkick => injkick,
-- out 421 injveto => injveto,
-- out 422 injvpos => injvpos,
-- out 10:0 423 injvpre => injvpre,
-- out 10:0 424 injvlen => injvlen,
-- out 10:0 425 injvfull => injvfull,
-- out 9:0 426 injvgate => injvgate
);
-- out 9:0 431 PROTOCOL => PROTOCOL,
437 SIM_SPEEDUP => SIM_SPEEDUP
) 443 dblclockb => clk_dblinv,
449 clkfreq => open_clkfreq,
-- out 450 utime => sta_utime,
-- out 451 ctime => sta_ctime,
-- out 452 timerr => sta_timerr,
-- out 455 exprun => exprun,
-- out 456 running => running,
-- out 457 clraddr => open_clraddr,
-- out 458 myaddr => buf_myaddr,
-- out 461 runreset => sig_runreset,
-- out 462 errreset => sig_errreset,
-- out 463 bsyreset => open_bsyrst,
-- out 464 feereset => feereset,
-- out 465 b2lreset => b2lreset,
-- out 466 gtpreset => sig_gtpreset,
-- out 467 semreset => sig_semreset,
-- out 470 jtag => open_jtag,
-- out 471 jtagdbg => open_jtagdbg,
-- out 474 trgout => sig_trig,
-- out 475 trgtyp => sta_trgtyp,
-- out 476 trgtag => sta_trgtag,
-- out 477 tagerr => sta_tagerr,
-- out 478 trgshort => sta_trgshort,
-- out 479 trgmask => sta_trgmask,
-- out 480 rstmask => sta_rstmask,
-- out 481 dismask => open_dismask,
-- out 484 staoctet => sta_octet,
-- out 485 ttup => sta_ttup,
-- out 486 cntlinkrst => cnt_linkrst,
-- out 487 badver => sta_badver,
-- out 489 -- frame and revolution signal 490 frame => sig_frame,
-- out 491 frame3 => sig_frame3,
-- out 492 frame9 => sig_frame9,
-- out 493 frameloc => cnt_frameloc,
-- out 494 divclk1 => divclk1,
-- out 495 divclk2 => divclk2,
-- out 498 octet => buf_rxoctet,
-- out 499 isk => buf_rxisk,
-- out 500 payload => buf_payload
(76 downto 0),
-- out 501 sigpayload => sig_payload,
-- out 502 sigidle => sig_idle,
-- out 503 cntbit2 => buf_rxcnt2,
-- out 504 cntoctet => buf_rxcnto,
-- out 505 cntdato => buf_rxcntd,
-- out 506 cntpacket => cnt_packet,
-- out 7:0 509 regsel => buf_regsel,
-- out 4:0 510 usrreg => buf_usrreg,
-- out 7:0 513 manual => reg_imanual,
514 clrdelay => clr_idelay,
515 incdelay => set_idelay,
516 caldelay => sig_caldelay,
519 bit2 => buf_rxbit2,
-- out 520 bit10 => open_bit10,
-- out 521 cntdelay => cnt_idelay,
-- out 522 cntwidth => cnt_iwidth,
-- out 523 staiddr => sta_iddr,
-- out 524 starxerr => sta_rxerr,
-- out 525 iddrdbg => sig_iddrdbg,
-- out 526 crcdbg => sig_crcdbg
);
-- out 528 --- map: b2tt_payload 529 buf_id <= SUBSYSTEM & (to_unsigned(FWTYPE, 4)) & id;
530 buf_ver <= (to_unsigned(B2TT_VER, 8)) & 531 (to_unsigned(VERSION, 16));
539 myaddr => buf_myaddr,
543 b2linkup => b2linkup,
544 b2linkwe => b2linkwe,
545 b2ttnext => fifonext,
547 staictrl => sta_ictrl,
548 runreset => sig_runreset,
549 errreset => sig_errreset,
550 semreset => sig_semreset,
553 timerr => sta_timerr,
555 tagerr => sta_tagerr,
556 fifoerr => sta_fifoerr,
557 fifoful => sta_fifoful,
558 badver => sta_badver,
559 trgmask => sta_trgmask,
560 rstmask => sta_rstmask,
566 fillsig => sig_txfill,
567 regsel => buf_regsel,
568 usrreg => buf_usrreg,
570 cntftag => cnt_ftag,
-- out 571 cntb2lwe => cnt_b2lwe,
-- out 572 payload => buf_txdata
);
-- out 575 sta_bsyin <= '0' when busysrc = 0 and sta_fifoful = '0' else '1';
576 sta_errin <= '0' when feeerr = 0 else '1';
584 errreset => sig_runreset,
586 payload => buf_txdata,
587 fillsig => sig_txfill,
594 cntbit2 => buf_txcnt2,
-- out 595 cntoctet => buf_txcnto,
-- out 596 isk => buf_txisk,
-- out 597 octet => buf_txoctet,
-- out 598 bsyup => buf_txbsyup,
-- out 599 bsydn => buf_txbsydn,
-- out 600 bit2 => buf_txbit2
);
-- out 605 b2ttver <= (to_unsigned(B2TT_VER, 16));
607 usrreg <= buf_usrreg;
609 octet <= buf_rxoctet;
611 sigbit2 <= buf_rxbit2;
612 cntbit2 <= buf_rxcnt2;
615 sysclkinv <= clk_inv;
617 revoloc <= buf_revoloc;
619 --frame3 <= sig_frame3; 620 frame9 <= sig_frame9;
621 --frameloc <= cnt_frameloc; 624 utime <= sta_utime(NBITTIM-1 downto 0);
626 runreset <= sig_runreset;
628 trgtyp <= sta_trgtyp;
629 trgtag <= sta_trgtag;
630 trgmask <= sta_trgmask;
631 rstmask <= sta_rstmask;
633 fifordy <= sta_fifordy;
638 -- dbglink for signals to test establishing b2tt link 639 dbglink(95) <= sta_ttup;
640 dbglink(94) <= sta_octet;
641 dbglink(93) <= sig_payload;
643 dbglink(91 downto 90) <= buf_rxbit2;
644 dbglink(89 downto 82) <= buf_rxoctet;
645 dbglink(81) <= buf_rxisk;
646 dbglink(80 downto 78) <= buf_rxcnt2;
647 dbglink(77 downto 73) <= buf_rxcnto;
648 dbglink(72) <= sig_idle;
649 dbglink(71) <= '0' when cnt_packet(7 downto 4) = 0 else '1';
650 dbglink(70 downto 67) <= cnt_packet(3 downto 0) when sta_ttup = '1' else 653 dbglink(66) <= sig_trig;
654 dbglink(65) <= sig_runreset;
655 dbglink(64 downto 58) <= cnt_idelay;
656 dbglink(57 downto 52) <= cnt_iwidth;
657 dbglink(51 downto 43) <= sta_rxerr;
658 dbglink(42 downto 34) <= sig_crcdbg;
659 dbglink(33 downto 24) <= sig_iddrdbg;
660 dbglink(23 downto 22) <= sta_iddr;
662 dbglink(21) <= buf_txbsyup;
663 dbglink(20) <= buf_txbsydn;
664 dbglink(19) <= sta_trgmask;
666 dbglink(18 downto 16) <= buf_txcnt2;
667 dbglink(15 downto 12) <= buf_txcnto;
669 dbglink(10 downto 9) <= buf_txbit2;
670 dbglink(8) <= buf_txisk;
671 dbglink(7 downto 0) <= buf_txoctet;
673 -- dbgerr for signals to analyze error in the trigger cycle 674 dbgerr(95) <= sta_ttup;
-- b2ttup 675 dbgerr(94) <= sta_octet;
676 dbgerr(93) <= sig_trig;
677 dbgerr(92) <= fifonext;
678 dbgerr(91) <= sta_fifordy;
679 dbgerr(90) <= sta_bsyin;
680 dbgerr(89) <= sta_errin;
681 dbgerr(88) <= sta_fifoerr;
682 dbgerr(87) <= sta_fifoful;
683 dbgerr(86) <= sta_tagerr;
684 dbgerr(85) <= sig_runreset;
685 dbgerr(84 downto 69) <= cnt_ftag;
686 dbgerr(68 downto 53) <= cnt_b2lwe;
687 dbgerr(52) <= b2linkup;
688 dbgerr(51) <= sta_dcm;
-- b2clkup 690 dbgerr(50 downto 37) <= (others => '0');
692 dbgerr(36) <= buf_rxisk;
693 dbgerr(35 downto 28) <= buf_rxoctet;
694 dbgerr(27 downto 0) <= sta_trgtag(27 downto 0);
out hlfclockstd_logic
add