Belle II KLM Scint Firmware  1
klm_scint.vhd
1 ----------------------------------------------------------------------------------
2 -- KLM SCROD firmware
3 ----------------------------------------------------------------------------------
4 library ieee;
5  use ieee.std_logic_1164.all;
6  use ieee.numeric_std.all;
7  use ieee.std_logic_unsigned.all;
8  use ieee.std_logic_misc.all;
9 library unisim;
10  use unisim.vcomponents.all;
11 library unimacro;
12  use unimacro.vcomponents.all;
13 use work.all;
14  use work.tdc_pkg.all;
15  use work.time_order_pkg.all;
16  use work.conc_intfc_pkg.all;
17  use work.klm_scrod_pkg.all;
18  use work.klm_scint_pkg.all;
19 
165 
177 
178 
179 entity klm_scint is
180  generic (
181  NUM_GTS : integer := 1;
182  B2TT_SIM_SPEEDUP : std_logic := '0';
183  IS_SIM : std_logic := '0';
184  SLOW_CTRL_BUFF : integer := 7;
185  -- VERSION : std_logic_vector(15 downto 0) := X"0C06" -- dedicated sps_reset
186  -- VERSION : std_logic_vector(15 downto 0) := X"0C07" -- add charge calc to FE block and sps
187  -- VERSION : std_logic_vector(15 downto 0) := X"0C08" -- add reset debug to regs -- verified resetft issues b2tt_runreset, and none others
188  -- VERSION : std_logic_vector(15 downto 0) := X"0C09" -- rm rst dbg. reduce sps bram size. switch metric to le_charge. switch to 128 samples.
189  -- VERSION : std_logic_vector(15 downto 0) := X"0C0A" -- added self_trig mode, refactored mode multiplexing, connected trig_proc_cnt, added quick-send of null hits
190  -- VERSION : std_logic_vector(15 downto 0) := X"0C0B" -- changed ped measure to have predefiend hold time for analog samples, added padding to sampling mask
191  -- VERSION : std_logic_vector(15 downto 0) := X"0C0C" -- fix trig_asic[0:9]to[1:10] mapping bug. fix intermittent no-debug-wave bug(?). switch to 128 ped avgs.
192  -- VERSION : std_logic_vector(15 downto 0) := X"0C0D" -- no ftsw trig modes caused rx_features to hang -- moved lgc to pkt sending. Use newmask on tb5 evts only, ftsw or self trig only.
193  -- VERSION : std_logic_vector(15 downto 0) := X"0C0E" -- Fix bug: HitData.first_hit was being dropped before writing to qt_fifo
194  -- VERSION : std_logic_vector(15 downto 0) := X"0C0F" -- inc. trg_proc_cnt for null hits; temp fake pkt for null trigs; zero i_vectrgbits after force trig
195  -- VERSION : std_logic_vector(15 downto 0) := X"0C10" -- add width to force trig bits, simplify calcROI handshake
196  -- VERSION : std_logic_vector(15 downto 0) := X"0C11" -- trig_queue bug fixes, add 2 bits to daq packet
197  -- VERSION : std_logic_vector(15 downto 0) := X"0C12" -- lookback tuning, queue getting full thresh
198  -- VERSION : std_logic_vector(15 downto 0) := X"0C13" -- fix rd_stale bug.
199  -- VERSION : std_logic_vector(15 downto 0) := X"0C14" -- add diff proc counts. simplify CalculateROI.
200  -- VERSION : std_logic_vector(15 downto 0) := X"0C15" -- fix new_mask bug, missing default when tb5!='1'. Also BUS_RD_WINSEL was disconnected somehow.
201  -- VERSION : std_logic_vector(15 downto 0) := X"0C16" -- Removed redundant OTHERS states. Rep. self trg w/ not ftsw trg. Modify rd_stale lgc.
202  -- VERSION : std_logic_vector(15 downto 0) := X"0C17" -- Simplify lgc in ProcWaveform:LOOPING_JOBS
203  VERSION : std_logic_vector(15 downto 0) := X"FE00" -- Move HitDataSerializer to WaveformReadout_i
204  );
205  port (
206  -- LEDS : inout STD_LOGIC_VECTOR(12 downto 3);
207  force_trig : in std_logic; -- sim only
209  TTDCLKP : in std_logic;
210  TTDCLKN : in std_logic;
211  TTDACKP : out std_logic;
212  TTDACKN : out std_logic;
213  TTDTRGP : in std_logic;
214  TTDTRGN : in std_logic;
215  TTDRSVP : out std_logic;
216  TTDRSVN : out std_logic;
217 
219  mgttxfault : in std_logic_vector(1 to NUM_GTS);
220  mgtmod0 : in std_logic_vector(1 to NUM_GTS);
221  mgtlos : in std_logic_vector(1 to NUM_GTS);
222  mgttxdis : out std_logic_vector(1 to NUM_GTS);
223  mgtmod2 : out std_logic_vector(1 to NUM_GTS);
224  mgtmod1 : out std_logic_vector(1 to NUM_GTS);
225  mgtrxp : in std_logic;
226  mgtrxn : in std_logic;
227  mgttxp : out std_logic;
228  mgttxn : out std_logic;
229  mgtclk0p : in std_logic;
230  mgtclk0n : in std_logic;
231  mgtclk1p : in std_logic;
232  mgtclk1n : in std_logic;
233 
235  -- EX_TRIGGER_MB : out std_logic;
236  -- EX_TRIGGER_SCROD : out STD_LOGIC;
237 
238  --Global Bus Signals
239 
240  ----- ASIC related ports ------
242  -- BUS_REGCLR : out std_logic;
243  BUSA_WR_ADDRCLR : out std_logic;
244  BUSA_RD_ENA : out std_logic;
245  BUSA_RD_ROWSEL : out std_logic_vector(2 downto 0);
246  BUSA_RD_COLSEL : out std_logic_vector(5 downto 0);
247  BUSA_CLR : out std_logic;
248  BUSA_RAMP : out std_logic;
249  BUSA_SAMPLESEL : out std_logic_vector(4 downto 0);
250  BUSA_SR_CLEAR : out std_logic;
251  BUSA_SR_SEL : out std_logic;
252  BUSA_DO : in std_logic_vector(14 downto 0);
253 
255  BUSB_WR_ADDRCLR : out std_logic;
256  BUSB_RD_ENA : out std_logic;
257  BUSB_RD_ROWSEL : out std_logic_vector(2 downto 0);
258  BUSB_RD_COLSEL : out std_logic_vector(5 downto 0);
259  BUSB_CLR : out std_logic;
260  BUSB_RAMP : out std_logic;
261  BUSB_SAMPLESEL : out std_logic_vector(4 downto 0);
262  BUSB_SR_CLEAR : out std_logic;
263  BUSB_SR_SEL : out std_logic;
264  BUSB_DO : in std_logic_vector(14 downto 0);
265 
267  SIN : out std_logic_vector(9 downto 0);
268  PCLK : out std_logic_vector(9 downto 0);
269  SHOUT : in std_logic_vector(9 downto 0);
270  SCLK : out std_logic_vector(9 downto 0);
271 
273  WL_CLK_N : out std_logic_vector(9 downto 0);
274  WL_CLK_P : out std_logic_vector(9 downto 0);
275  WR1_ENA : out std_logic_vector(9 downto 0);
276  WR2_ENA : out std_logic_vector(9 downto 0);
277 
278  SSTIN_N : out std_logic_vector(9 downto 0);
279  SSTIN_P : out std_logic_vector(9 downto 0);
280 
282  SR_CLOCK : out std_logic_vector(9 downto 0);
283  SAMPLESEL_ANY : out std_logic_vector(9 downto 0);
284 
286  BUSA_SCK_DAC : out std_logic;
287  BUSA_DIN_DAC : out std_logic;
288  BUSB_SCK_DAC : out std_logic;
289  BUSB_DIN_DAC : out std_logic;
290 
292  TARGET_TB : in tb_vec_type;
293 
294  TDC_CS_DAC : out std_logic_vector(9 downto 0);
295 
297  TDC_AMUX_S : out std_logic_vector(3 downto 0);
298 
302  TOP_AMUX_S : out std_logic_vector(3 downto 0);
303 
305  RAM_ADDR : out std_logic_vector(21 downto 0); -- RAM address line
306  RAM_IO : inout std_logic_vector(7 downto 0); -- tristate buffer below, use RAM_din or RAM_do, select with RAM_rw
307  RAM_CEb : out std_logic;
308  RAM_CE : out std_logic;
309  RAM_OEb : out std_logic;
310  RAM_WEb : out std_logic
311 
312  -- --! MPPC ADC
313  -- SCL_MON : out STD_LOGIC;
314  -- SDA_MON : inout STD_LOGIC
315 
316  -- TDC_DONE : in STD_LOGIC_VECTOR(9 downto 0); -- move to readout signals
317  -- TDC_MON_TIMING : in STD_LOGIC_VECTOR(9 downto 0) -- add the ref to the programming of the TX chip
318  );
319 end klm_scint;
320 
321 
322 architecture Behavioral of klm_scint is
323 
324 -- SYNCHRONOUS SIGNALS BY PROCESS WHICH DRIVES THEM
325 
327  signal b2tt_b2clkup_r : std_logic;
328  signal b2tt_b2ttup_r : std_logic;
329  signal b2tt_b2ttup_2r : std_logic;
330  signal b2tt_regdbg : std_logic_vector(7 downto 0) := (others => '0');
331 
333  signal ScrodStatus : KlmScrodStatusType := KlmScrodStatusType0;
334 
336  -- signal i_trgon : std_logic := '1';
337 
338  -- rst_conc_intfc_on_startup:
339  signal klmifc_reset : std_logic := '0';
340  signal klmifc_reset_done : std_logic := '0';
341 
343  signal klm_status_regs_r : stat_reg_type;
344 
346 
347 
348 -- SIGNALS DRIVEN BY INSTANTIATED ENTITIES
349 
351  signal clk : std_logic := '0';
352  signal clkinv : std_logic := '0';
353  signal clk2x : std_logic := '0';
354  signal b2tt_b2clkup : std_logic;
355  signal b2tt_b2ttup : std_logic;
356  signal b2tt_trgout : std_logic;
357  signal b2tt_sigbit2 : std_logic_vector(1 downto 0);
358  signal b2tt_trgtag : std_logic_vector(31 downto 0);
359  signal b2tt_utime : std_logic_vector(B2TT_NBITTIM-1 downto 0);
360  signal b2tt_ctime : std_logic_vector(26 downto 0) := (others=>'0');
361  signal b2tt_divclk1 : std_logic_vector(1 downto 0);
362  signal b2tt_divclk2 : std_logic_vector(1 downto 0);
363  signal b2tt_runreset : std_logic := '1';
364  signal b2tt_feereset : std_logic := '1';
365  signal b2tt_gtpreset : std_logic := '1';
366  signal b2tt_b2lreset : std_logic := '1';
367  signal b2tt_b2ttver : std_logic_vector(15 downto 0);
368  signal b2tt_fifordy : std_logic := '0';
369  signal b2tt_fifodata : std_logic_vector(95 downto 0) := (others => '0');
370  signal b2tt_exprun : std_logic_vector(31 downto 0);
371  signal b2tt_frame : std_logic;
372  signal b2tt_frame9 : std_logic;
373  signal b2tt_dbglink : std_logic_vector (95 downto 0) := (others => '0');
374 
375 
377  signal b2tt_b2linkwe : std_logic := '0';
378  signal b2tt_fifonext : std_logic := '0';
379  signal rcl_src_rdy_n : std_logic;
380  signal rcl_data : std_logic_vector(15 downto 0);
381  signal aurora_stat : Aurora_Status_t;
382  signal i_qt_fifo_rd_en : std_logic;
383  signal i_exttb : tb_vec_type;
384  signal stat_tx_in_progress : std_logic;
385  -- signal b2tt_b2plllk : std_logic;
386  -- signal rcl_sof_n : std_logic;
387  -- signal rcl_eof_n : std_logic;
388 
389 
391  signal ScrodConfig : KlmScrodConfigType := KlmScrodConfigZero;
392  signal ScrodControl : KlmScrodControlType;
393  signal klm_status_regs : stat_reg_type;
394  -- signal rcl_dst_rdy_n : std_logic;
395 
396 
398  signal i_qt_fifo_d : std_logic_vector(17 downto 0);
399  signal i_qt_fifo_empty : std_logic;
400  signal i_qt_fifo_evt_rdy : std_logic;
401 
402 
404  signal asic_sin : std_logic := '0';
405  signal asic_pclk : std_logic := '0';
406  signal asic_sclk : std_logic := '0';
407 
408 
410  signal SCK_DAC : std_logic := '0';
411  signal DIN_DAC : std_logic := '0';
412 
413 
414  -- --! mppc_current_measurement (Module_ADC_MCP3221_I2C_new):
415  -- signal i_sda_mon : std_logic := '0';
416  -- signal i_scl_mon : std_logic := '0';
417 
418 
420  signal wilk_clk : std_logic_vector(9 downto 0) := (others => '0');
421 
422 -- SINALS DRIVEN ASYNCHRONOUSLY
424  signal b2tt_ctime_i : std_logic_vector(26 downto 0) := (others=>'0');
425  signal b2tt_trig : std_logic;
426  signal i_force_trig : std_logic;
427 
428 begin
429 
430 
431 
432 
433 --------------------- ASYNCHRONOUS LOGIC ---------------------------------------------
434  ScrodStatus.Version <= VERSION;
435  ScrodStatus.Shout <= SHOUT(9 downto 0);
436  ScrodStatus.aurora_stat <= aurora_stat;
437  RAM_CE <= '1';
438  RAM_CEb <= '0';
440  BUSB_SCK_DAC <= SCK_DAC;
441  BUSA_DIN_DAC <= DIN_DAC;
442  BUSB_DIN_DAC <= DIN_DAC;
443  --Only specified ASIC gets serial data signals, uses bit mask
444  -- TODO : add asics number as a generic of tx_dac_control
445  -- and move below lines to the entity
446  gen_DAC_CONTROL: for i in 0 to 9 generate
447  SIN(i) <= asic_sin and ScrodConfig.TxRegCtrlMask(i);
448  PCLK(i) <= asic_pclk and ScrodConfig.TxRegCtrlMask(i);
449  SCLK(i) <= asic_sclk and ScrodConfig.TxRegCtrlMask(i);
450  end generate gen_DAC_CONTROL;
451 
452  sim_true: if IS_SIM = '1' generate
453  process(clk, b2tt_ctime_i)
454  begin
455  if rising_edge(clk) then
456  b2tt_ctime_i <= b2tt_ctime_i + '1';
457  end if;
458  end process;
459  b2tt_trig <= b2tt_sigbit2(0);
460  i_force_trig <= force_trig;
461  end generate;
462 
463  sim_false: if IS_SIM = '0' generate
464  b2tt_ctime_i <= b2tt_ctime;
465  b2tt_trig <= b2tt_trgout;
466  i_force_trig <= ScrodControl.force_trig;
467  end generate;
468 
469 
470 --------------------- SYNCHRONOUS LOGIC ---------------------------------------------
471  startup_latch_proc: process(clk, b2tt_utime, b2tt_b2clkup, b2tt_b2ttup,
472  b2tt_b2ttup_r, b2tt_b2ttup_2r, ScrodControl.B2ttDbg)
473  variable i_utime_latched : std_logic := '0';
474  begin
475  if rising_edge(clk) then
476  if i_utime_latched = '0' and b2tt_utime /= X"0000_0000" then
477  ScrodStatus.StartUTime <= b2tt_utime;
478  ScrodStatus.B2ttUpUTime <= b2tt_utime;
479  i_utime_latched := '1';
480  end if;
481  b2tt_b2clkup_r <= b2tt_b2clkup;
482  b2tt_b2ttup_r <= b2tt_b2ttup;
483  b2tt_b2ttup_2r <= b2tt_b2ttup_r;
484  if b2tt_b2ttup_2r /= b2tt_b2ttup_r then
485  ScrodStatus.B2ttUpUTime <= b2tt_utime;
486  end if;
487  ScrodStatus.CurUTime <= b2tt_utime;
488  b2tt_regdbg(5 downto 0) <= ScrodControl.B2ttDbg;
489  end if;
490  end process;
491 
492 
493 
494  b2tt_dbg2reg_proc: process (clk)
495  begin
496  if rising_edge(clk) then
497  ScrodStatus.B2ttStaIddr <= b2tt_dbglink(23 downto 22);
498  ScrodStatus.B2ttCntIdelay <= b2tt_dbglink(64 downto 58);
499  ScrodStatus.B2ttUp <= b2tt_b2ttup;
500  ScrodStatus.B2ClkUp <= b2tt_b2clkup;
501  end if;
502  end process;
503 
504 
505 
506  -- trgon_sw_4scaler_mode: process(clk)
507  -- begin
508  -- if rising_edge(clk) then
509  -- if ScrodConfig.ReadoutMode = X"3" then
510  -- i_trgon <= '0';
511  -- else
512  -- i_trgon <= '1';
513  -- end if;
514  -- end if;
515  -- end process;
516 
517 
518 
519  rst_conc_intfc_on_startup: process (clk, b2tt_runreset)
520  begin
521  if rising_edge(clk) then
522  if klmifc_reset_done = '1' then
523  klmifc_reset <= b2tt_runreset;
524  else
525  klmifc_reset <= '1';
526  klmifc_reset_done <= '1';
527  end if;
528  end if;
529  end process;
530 
531 
532 
533  stat_reg_ppln: process(clk, klm_status_regs)
534  begin
535  if rising_edge(clk) then
536  klm_status_regs_r <= klm_status_regs;
537  end if;
538  end process;
539 
540 
541 
542  -- asic_and_channel_multiplexer_for_mppc_current_measurement: process(clk, ScrodConfig.MppcAdcAsicN, ScrodConfig.MppcAdcChanN)
543  -- begin
544  -- if rising_edge(clk) then
545  -- TDC_AMUX_S <= ScrodConfig.MppcAdcAsicN; -- channel within daughter card
546  -- TOP_AMUX_S <= ScrodConfig.MppcAdcChanN; -- daughter number FIXME: AsicN and ChanN are mixed up
547  -- end if;
548  -- end process;
549 
550 
551 
552 
553 --------------------- MODULE INSTANTIATIONS ---------------------------------------------
554  b2tt_i : entity work.b2tt
555  generic map(
556  SUBSYSTEM => B2TT_SUBSYSTEM,
557  FWTYPE => B2TT_FWTYPE,
558  VERSION => B2TT_VERSION,
559  B2TT_VER => B2TT_B2TT_VER,
560  PROTOCOL => B2TT_PROTOCOL,
561  COMPAT => B2TT_COMPAT,
562  DEFADDR => B2TT_DEFADDR,
563  FLIPCLK => B2TT_FLIPCLK,
564  FLIPTRG => B2TT_FLIPTRG,
565  FLIPACK => B2TT_FLIPACK,
566  USEFIFO => B2TT_USEFIFO,
567  CLKDIV1 => B2TT_CLKDIV1,
568  CLKDIV2 => B2TT_CLKDIV2,
569  USEPLL => B2TT_USEPLL,
570  USEICTRL => B2TT_USEICTRL,
571  NBITTIM => B2TT_NBITTIM,
572  NBITTAG => B2TT_NBITTAG,
573  B2LRATE => B2TT_B2LRATE,
574  USEEXTCLK => B2TT_USEEXTCLK,
575  USE254IN => B2TT_USE254IN, --
576  SIM_SPEEDUP => B2TT_SIM_SPEEDUP)
577  port map(
578  b2ttver => b2tt_b2ttver,
579  --- RJ-45
580  clkp => TTDCLKP,
581  clkn => TTDCLKN,
582  trgp => TTDTRGP,
583  trgn => TTDTRGN,
584  rsvp => TTDRSVP,
585  rsvn => TTDRSVN,
586  ackp => TTDACKP,
587  ackn => TTDACKN,
588  --- alternative external clock source
589  extclk => '0',
590  extclkinv => '0',
591  extclkdbl => '0',
592  extdblinv => '0',
593  extclklck => '0',
594  --- board id
595  id => X"00FF", -- Use MSB for MB because RPC FEBs use LSB !How does this board get address?
596  -- user status register (for debug)
597  usrreg => open,
598  usrdat => X"0000",
599  --- link status
600  b2clkup => b2tt_b2clkup,
601  b2ttup => b2tt_b2ttup,
602  --- system clock and time
603  sysclk => clk,
604  sysclkinv => clkinv,
605  rawclk => open,
606  dblclk => clk2x,
607  hlfclk => open,
608  utime => b2tt_utime,
609  ctime => b2tt_ctime,
610  --- divided clock
611  divclk1 => b2tt_divclk1,
612  divclk2 => b2tt_divclk2,
613  --- exp- / run-number
614  exprun => b2tt_exprun,
615  running => open,
616  --- run reset
617  runreset => b2tt_runreset,
618  feereset => b2tt_feereset,
619  b2lreset => b2tt_b2lreset,
620  gtpreset => b2tt_gtpreset,
621  rstmask => open, -- for runreset
622  --- trigger
623  trgout => b2tt_trgout,
624  trgtyp => open,
625  trgtag => b2tt_trgtag,
626  trgmask => open,
627  --- revolution
628  frame => b2tt_frame,
629  --revo3 => open,
630  frame9 => b2tt_frame9,
631  revoloc => open,
632  revosig => open, -- TBI,
633  abortgap => open, -- TBI,
634  injveto => open,
635  injkick => open,
636  injvpos => open,
637  injvpre => open,
638  injvlen => open,
639  injvfull => open,
640  injvgate => open,
641  --- busy and status return
642  busysrc => X"00", -- to suspend the trigger
643  feeerr => X"00", -- to stop the run
644  --- Belle2link status
645  b2plllk => aurora_stat.gtlock,
646  b2linkup => '1',
647  b2linkwe => b2tt_b2linkwe,
648  b2lclk => clk,
649  --- SEM status (virtex5_seu_controller or SEU mitigation ipcore)
650  semscan => '0', -- end_of_scan / watchdog (=> 1 bit)
651  semdet => '0', -- seu_detect / corrected (=> 2 bit counter)
652  semmbe => '0', -- mbe/uncorrectable
653  semcrc => '0', -- crc_error (virtex5 only) (=> combined)
654  --- data for Belle2link header
655  fifordy => b2tt_fifordy,
656  fifodata => b2tt_fifodata,
657  fifonext => b2tt_fifonext,
658  --- b2tt-link status
659  regdbg => b2tt_regdbg, --X"00",
660  octet => open, -- decode
661  isk => open, -- decode
662  cntbit2 => open, -- decode
663  sigbit2 => b2tt_sigbit2, --open, -- decode
664  dbglink => b2tt_dbglink,
665  dbgerr => open
666  );
667 
668 
669  KLM_Interface_i : entity work.klm_intfc
670  generic map(
671  NUM_GTS => NUM_GTS
672  )
673  port map (
674  sysclk => clk,
675  sysclk2x => clk2x,
676 
677  b2tt_b2clkup => b2tt_b2clkup,
678  -- b2tt_b2ttup => b2tt_b2ttup,
679  -- b2tt_trig => b2tt_trig,
680  -- b2tt_b2plllk => b2tt_b2plllk,
681  b2tt_ctime => b2tt_ctime_i,
682  b2tt_divclk1 => b2tt_divclk1,
683  b2tt_divclk2 => b2tt_divclk2,
684  b2tt_runreset => klmifc_reset,
685  -- b2tt_feereset => b2tt_feereset,
686  b2tt_gtpreset => b2tt_gtpreset,
687  b2tt_b2linkwe => b2tt_b2linkwe,
688  -- b2tt_b2lreset => b2tt_b2lreset,
689  b2tt_fifordy => b2tt_fifordy,
690  b2tt_fifodata => b2tt_fifodata,
691  b2tt_fifonext => b2tt_fifonext,
692  b2tt_frame => b2tt_frame,
693  b2tt_trgtag => b2tt_trgtag,
694 
695 
696  ---- ASIC Interface
697  target_tb => target_tb, -- in tb_vec_type;
698 
699  -- SFP interface
700  mgttxfault => mgttxfault,
701  mgtmod0 => mgtmod0,
702  mgtlos => mgtlos,
703  mgttxdis => mgttxdis,
704  mgtmod2 => mgtmod2,
705  mgtmod1 => mgtmod1,
706  mgtclk0p => mgtclk0p,
707  mgtclk0n => mgtclk0n,
708  mgtclk1p => mgtclk1p,
709  mgtclk1n => mgtclk1n,
710  mgtrxp => mgtrxp,
711  mgtrxn => mgtrxn,
712  mgttxp => mgttxp,
713  mgttxn => mgttxn,
714  sfp_stat => ScrodStatus.sfp_stat,
715  aurora_stat => aurora_stat,
716 
717  -- run control signals TODO : pack it into a record
718  -- rcl_dst_rdy_n => rcl_dst_rdy_n,
719  -- rcl_sof_n => rcl_sof_n,
720  -- rcl_eof_n => rcl_eof_n,
721  rcl_src_rdy_n => rcl_src_rdy_n,
722  rcl_data => rcl_data,
723 
724  qt_fifo_rd_en => i_qt_fifo_rd_en,
725  qt_fifo_rd_d => i_qt_fifo_d,
726  qt_fifo_empty => i_qt_fifo_empty,
727  qt_fifo_evt_rdy => i_qt_fifo_evt_rdy,
728 
729  -- trgon => i_trgon, -- on/off trg path processing
730  trgon => '1', --#CK
731  exttb => i_exttb, -- trgbit pass through
732 
733  klm_status_upd => ScrodControl.KlmStatusUpdate,
734  stat_tx_in_progress => stat_tx_in_progress, --out
735  klm_status_regs => klm_status_regs_r --in
736  );
737 
738 
739 
740  Register_Control_i : entity work.KLMScrodRegCtrl
741  port map(
742  clk => clk,
743  -- rst => b2tt_runreset,
744 
745  -- rcl_dst_rdy_n => rcl_dst_rdy_n,
746  -- rcl_sof_n => rcl_sof_n,
747  -- rcl_eof_n => rcl_eof_n,
748  rcl_src_rdy_n => rcl_src_rdy_n,
749  rcl_data => rcl_data,
750 
751  ScrodConfig => ScrodConfig, -- configuration
752  ScrodControl => ScrodControl, -- control signals to update TX and MPPC regs
753  ScrodStatus => ScrodStatus,
754 
755  klm_status_regs => klm_status_regs,
756  stat_tx_in_progress => stat_tx_in_progress
757  );
758 
759 
760 
761  Readout_Control_i : entity work.KLMReadoutCtrl
762  port map(
763  clk => clk,
764  rst => b2tt_runreset,
765 
766  trg => b2tt_trig, -- trigger signal from b2tt
767  trgtag => b2tt_trgtag, -- trigger tag (event number)
768  ctime => b2tt_ctime_i, -- current ctime
769 
770  vectrgbits => i_exttb, -- trigger bits from all asics
771 
772  -- daq interface
773  qt_fifo_rd_en => i_qt_fifo_rd_en,
774  qt_fifo_dout => i_qt_fifo_d,
775  qt_fifo_empty => i_qt_fifo_empty,
776  qt_fifo_evt_rdy => i_qt_fifo_evt_rdy,
777 
778  ScrodConfig => ScrodConfig,
779  force_trig => i_force_trig,
780  sps_reset => ScrodControl.sps_reset,
781  scalers_reset => ScrodControl.TBScalersReset,
782 
783  -- status outputs
784  scalers_busy => ScrodStatus.TbScalersBusy,
785  scalers_ch_arr => ScrodStatus.TbScalersChnArr,
786  -- tbfifo_cnt => ScrodStatus.TbFifoCnt,
787  tbfifo_err_cnt => ScrodStatus.TbFifoFullCnt,
788  qt_fifo_err_cnt => ScrodStatus.QtFifoFullCnt,
789  trg_cnt => ScrodStatus.TrgCnt,
790  full_proc_cnt => ScrodStatus.FullProcCnt,
791  simp_proc_cnt => ScrodStatus.SimpProcCnt,
792  null_proc_cnt => ScrodStatus.NullProcCnt,
793  -- occ_err_cnt => ScrodStatus.HitsOverflowCnt,
794  wave_stat => ScrodStatus.WaveStat,
795  debug_wave_we => ScrodStatus.debug_wave_we,
796  debug_wave_din => ScrodStatus.debug_wave_din,
797  SPS_hist_rd_data => ScrodStatus.SPS_hist_rd_data,
798  -- debug
799  -- ctime_max => ScrodStatus.CTimeMax,
800 
801  -- pins to RAM
802  RAM_IO => RAM_IO,
803  RAM_ADDR => RAM_ADDR,
804  RAM_WEb => RAM_WEb,
805  RAM_OEb => RAM_OEb,
806 
807  -- bus A pins
809  BUSA_DO => BUSA_DO,
810  BUSA_RAMP => BUSA_RAMP,
811  BUSA_CLR => BUSA_CLR,
812  BUSA_RD_COLSEL => BUSA_RD_COLSEL,
813  BUSA_RD_ENA => BUSA_RD_ENA,
814  BUSA_RD_ROWSEL => BUSA_RD_ROWSEL,
815  BUSA_SAMPLESEL => BUSA_SAMPLESEL,
816  BUSA_SR_CLEAR => BUSA_SR_CLEAR,
817  BUSA_SR_SEL => BUSA_SR_SEL,
818 
819  -- bus B pins
821  BUSB_DO => BUSB_DO,
822  BUSB_RAMP => BUSB_RAMP,
823  BUSB_CLR => BUSB_CLR,
824  BUSB_RD_COLSEL => BUSB_RD_COLSEL,
825  BUSB_RD_ENA => BUSB_RD_ENA,
826  BUSB_RD_ROWSEL => BUSB_RD_ROWSEL,
827  BUSB_SAMPLESEL => BUSB_SAMPLESEL,
828  BUSB_SR_CLEAR => BUSB_SR_CLEAR,
829  BUSB_SR_SEL => BUSB_SR_SEL,
830 
831  -- daughter card pins
832  WR1_ENA => WR1_ENA,
833  WR2_ENA => WR2_ENA,
834  SSTIN_N => SSTIN_N,
835  SSTIN_P => SSTIN_P,
836  -- TDC_DONE => TDC_DONE,
837  SAMPLESEL_ANY => SAMPLESEL_ANY,
838  SR_CLOCK => SR_CLOCK,
839 
840  busy => open
841  );
842 
843 
844 
845  targetx_dac_control_i : entity work.targetx_dac_control
846  port map(
847  CLK => clk,
848 
849  LOAD_PERIOD => ScrodConfig.TxLoadPeriod,
850  LATCH_PERIOD => ScrodConfig.TxLatchPeriod,
851 
852  REG_DATA => ScrodConfig.TxRegData,
853  UPDATE => ScrodControl.TxRegUpdate,
854 
855  busy => ScrodStatus.TxRegBusy,
856 
857  SIN => asic_sin,
858  SCLK => asic_sclk,
859  PCLK => asic_pclk
860  );
861 
862 
863 
864  mppc_hv_dac_wrapper_i : entity work.mppc_dacs_wrapper_dac088s085
865  port map(
866  ------------CLOCK-----------------
867  clk => clk,
868  ------------DAC PARAMETERS--------
869  DAC_NUMBER => ScrodConfig.MppcDacCtrl(15 downto 12), -- Number,
870  DAC_ADDR => ScrodConfig.MppcDacCtrl(11 downto 8), -- Addr,
871  DAC_VALUE => ScrodConfig.MppcDacCtrl(7 downto 0), -- Value,
872 
873  WRITE_STROBE => ScrodControl.MppcDacUpdate,
874  busy => ScrodStatus.MppcDacBusy,
875  ------------HW INTERFACE----------
876  SCK_DAC => SCK_DAC,
877  DIN_DAC => DIN_DAC,
878  TDC_CS_DAC => TDC_CS_DAC
879  );
880 
881 
882 
883  -- (CK) commented out module for timing closure (since it needs work anyway)
884  -- check comments in Module_ADC_MCP3221_I2C_new for details
885  -----------------------------------------------------------------
886  -- mppc_current_measurement : entity work.Module_ADC_MCP3221_I2C_new
887  -- port map(
888  -- clock => clk,
889  -- reset => ScrodControl.ADCReset,
890  --
891  -- debugmode => ScrodConfig.ADCdebug,
892  --
893  -- sda => i_sda_mon,
894  -- scl => i_scl_mon,
895  --
896  -- runADC => ScrodControl.RunADC,
897  -- ADCOutput => ScrodStatus.MppcAdcData
898  --
899  -- );
900  -- SDA_MON <= i_sda_mon ;
901  -- SCL_MON <= i_scl_mon;
902  ---------------------------------------------------------------
903 
904 
905 
906  -- #CK had warning HDLCompiler:946 b/c "c1 => not clk" in previous ODDR2 inst."
907  -- Decided to bring out inverted clock directly from pll_base located in b2tt_clk_s6.
908  wilkinson_clock_generation : for i in 0 to 9 generate
909  -- make 2x clk using OLOGIC2 resources
910  clock_frequency_doubling : ODDR2 port map (
911  Q => wilk_clk(i),
912  C0 => clk,
913  C1 => clkinv,
914  CE => '1',
915  D0 => '0',
916  D1 => '1',
917  R => '0',
918  S => '0'
919  );
920  -- make differential output
921  differential_output_buffer : OBUFDS port map (i => wilk_clk(i), o => WL_CLK_P(i), ob => WL_CLK_N(i));
922  end generate;
923  -- Might be possible to get 4x wilk_clk by bringing 2x clk out of pll_base.
924  -- Need to test and see what the TargetX and associated circuit can handle.
925 
926 
927 
928 
929 end Behavioral;
stat_reg_type klm_status_regs_r
stat_reg_ppln:
Definition: klm_scint.vhd:343
out BUSB_WR_ADDRCLRstd_logic
BusB signals.
std_logic := '0' SCK_DAC
mppc_hv_dac_wrapper_i (mppc_dacs_wrapper_dac088s085):
Definition: klm_scint.vhd:410
out qt_fifo_err_cntstd_logic_vector( 15 downto 0)
tbfifo_cnt : out slv16(9 downto 0) := (others => (others => &#39;0&#39;)); – debug
std_logic := '0' klmifc_reset
trgon_sw_4scaler_mode:
Definition: klm_scint.vhd:339
in qt_fifo_rd_enstd_logic := '0'
daq data ports
KlmScrodStatusType := KlmScrodStatusType0 ScrodStatus
b2tt_dbg2reg_proc:
Definition: klm_scint.vhd:333
std_logic_vector( 9 downto 0) :=( others => '0') wilk_clk
clock_frequency_doubling
Definition: klm_scint.vhd:420
in TTDCLKPstd_logic
FTSW.
Definition: klm_scint.vhd:209
out BUSA_WR_ADDRCLRstd_logic
BusA signals.
in trgstd_logic := '0'
b2tt signals
Definition: b2tt.vhd:79
in vectrgbitstb_vec_type :=( others =>( others => '0'))
trigger bits from all asics
std_logic := '0' asic_sin
targetx_dac_control_i (targetx_dac_control):
Definition: klm_scint.vhd:404
in TARGET_TBtb_vec_type
TRIGGER SIGNALS.
Definition: klm_scint.vhd:292
out scalers_busystd_logic
status ports TODO : pack it into a record e.g. ReadoutStatus
KlmScrodConfigType := KlmScrodConfigZero ScrodConfig
Register_Control_i (KLMScrodRegCtrl):
Definition: klm_scint.vhd:391
out WL_CLK_Nstd_logic_vector( 9 downto 0)
Digitization and sampling signals.
Definition: klm_scint.vhd:273
out SINstd_logic_vector( 9 downto 0)
ASIC DAC Update Signals.
Definition: klm_scint.vhd:267
in mgttxfaultstd_logic_vector( 1 to NUM_GTS)
SFP.
Definition: klm_scint.vhd:219
std_logic_vector( 26 downto 0) :=( others => '0') b2tt_ctime_i
sim_true_false:
Definition: klm_scint.vhd:424
out BUSA_WR_ADDRCLRstd_logic
MB Specific Signals BUS A Specific Signals.
Definition: klm_scint.vhd:243
in scalers_resetstd_logic := '0'
reset scalers for trigger bits
out BUSA_SCK_DACstd_logic
MPPC HV DAC.
Definition: klm_scint.vhd:286
out TOP_AMUX_Sstd_logic_vector( 3 downto 0)
Definition: klm_scint.vhd:302
out RAM_ADDRstd_logic_vector( 21 downto 0)
PED SRAM.
Definition: klm_scint.vhd:305
out BUSB_WR_ADDRCLRstd_logic
Bus B Specific Signals.
Definition: klm_scint.vhd:255
std_logic_vector( 17 downto 0) i_qt_fifo_d
Readout_Control_i (KLMReadoutCtrl):
Definition: klm_scint.vhd:398
out SR_CLOCKstd_logic_vector( 9 downto 0)
Serial Readout Signals.
Definition: klm_scint.vhd:282
std_logic := '0' clk
asic_and_channel_multiplexer_for_mppc_current_measurement: b2tt_i (b2tt):
Definition: klm_scint.vhd:351
std_logic := '0' b2tt_b2linkwe
KLM_Interface_i (klm_intfc):
Definition: klm_scint.vhd:377
out TDC_AMUX_Sstd_logic_vector( 3 downto 0)
Target Daugher Card Channel Select - Fanned out to 10 MUXs.
Definition: klm_scint.vhd:297
std_logic b2tt_b2clkup_r
startup_latch_proc:
Definition: klm_scint.vhd:327
inout RAM_IOstd_logic_vector( 7 downto 0) :=( others => '0')
debug FIXME : remove pedestal RAM access
out WR1_ENAstd_logic_vector( 9 downto 0)
TargetX DC signals.