TRG: Difference between revisions

From AgWiki
Jump to navigation Jump to search
 
(121 intermediate revisions by 2 users not shown)
Line 4: Line 4:


* xxx
* xxx
* https://bitbucket.org/teamalphag/alphat_firmware - firmware sources on bitbucket
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket


= General characteristics =
= General characteristics =
Line 11: Line 11:


== Board schematics ==
== Board schematics ==
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf


== Available hardware ==
== Available hardware ==


= ALPHA-T front panel connections =
* Altera Stratix IV - main FPGA
* Altera Max V - boot FPGA
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.
 
= TRG front panel connections =


From top to bottom:
From top to bottom:
Line 54: Line 60:
</pre>
</pre>


= ALPHA-T onboard jumpers and switches =
= TRG onboard jumpers and switches =


* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251
Line 81: Line 87:


= Firmware revisions =
= Firmware revisions =
* 0x5bc8f90f - original firmware used for all data
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.
* 0x62d32d95 - updated cbtrg, switched to edge-triggered cbtrg inputs, improved BSC multiplicity trigger, improved coinc trigger, added burst pulser. installed at CERN 19 Jul 2022.
* 0x62ded109 - fix cbtrg fifo data corruption, 1st fifo word was missing, 2nd fifo word sent twice.
= Firmware build =
* use quartus 20.1
* see Makefile in the trg_firmware project
= Jtag remote connection =
* ssh agmini@daq16
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf
* netstat -an | grep 1309 ### note listen address is "0.0.0.0", NOT "127.0.0.1"
<pre>
tcp        0      0 0.0.0.0:1309            0.0.0.0:*              LISTEN   
</pre>
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work
* ssh olchansk@daq01
* cd git/trg_firmware
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh
* jtagconfig ### should work
<pre>
daq01:trg_firmware$ jtagconfig
1) DE-SoC on daq16 [2-1.2.3]
  4BA00477  SOCVHPS
  02D020DD  5CSEBA6(.|ES)/5CSEMA6/..
2) USB-Blaster on daq16 [2-1.3]
  024090DD  EP4SGX230(.|ES)
  020A40DD  5M(1270ZF324|2210Z)/EPM2210
daq01:trg_firmware$
</pre>


= ALPHA-g trigger functions =
= ALPHA-g trigger functions =


Trigger modes:
Trigger options:
* software trigger
* software trigger
* pulser trigger
* pulser trigger
Line 92: Line 137:
* adc16 wire multiplicity
* adc16 wire multiplicity
* TPC anode wire per-preamp trigger (aw16 section)
* TPC anode wire per-preamp trigger (aw16 section)
** trigger on coincidences of preamps
** trigger on coincidences of preamps (removed fw 0x62c77f0b)
** trigger on multiplicity of preamps
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger
* BSC trigger
* BSC trigger
** BSC grand_or
** BSC grand_or
** BSC bar multiplicity
** BSC bar multiplicity
* coincidence trigger - coincidence of external, TPC AW and BSC triggers
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers


== software trigger ==
== software trigger ==
Line 104: Line 149:
to programmatically fire the trigger, one should:
to programmatically fire the trigger, one should:
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger
* write value 0x4 to register 0x2B, this will cause the trigger to fire
* write value 0x4 to register 0x2B, this will cause the software trigger to fire


== pulser trigger ==
== pulser trigger ==
Line 114: Line 159:
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger
* set the output_pulser bit in conf_trig_enable, this will cause the pulser to be output from the alphag firmware block (the pulser no longer goes outside of the trigger board, so changing the bit does not do anything)
* set the output_pulser bit in conf_trig_enable, this will cause the pulser to be output from the alphag firmware block (the pulser no longer goes outside of the trigger board, so changing the bit does not do anything)
== timeout trigger ==
The event builder uses event timestamps to assemble physics events. The timestamps
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If
triggers are generated often (1 per second or more), timestamp wrap around
is easily detected by the event builder. If triggers come infrequently,
timestamp wrap around may occur while there are no triggers, not be seen
by the event builder causing loss of event synchronization.
To avoid this problem in the event builder, a timeout trigger should be generated
if no triggers were generated inside a 10 second interval.
The guaranties that even if all physics triggers temporarily stop for any reason,
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).
To enable the timeout trigger:
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock
* enable it in bit 23 of [[#conf_trig_enable bits]]


== adc16 multiplicity trigger ==
== adc16 multiplicity trigger ==
Line 125: Line 189:
There is a counter for each of these four signals.
There is a counter for each of these four signals.


Each of these four signals can fire the trigger, see conf_trig_enable bits.
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].


== TPC anode wire triggers ==
== TPC anode wire triggers ==


TBW: mapping of adc16 and adc32 into aw16[15:0] signals
=== aw16 bus ===


=== aw16_grand_or ===
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.
 
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.


TPC AW "grand or" trigger: use aw16_mult_1ormore
The aw16[15:0] bus can be fed by
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links
* adc32_or16[15:0] - or16 of 62.5 MHz ADCs, FMC-ADC32 has 32 channels, so 2 bits per ADC: low 16 channels and high 16 channels, sas links 7..0
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]


=== aw16_mult ===
<pre>
  ///////////////////////////////////////////////////////////
  //          TPC Anode Wire trigger logic (aw16)
  ///////////////////////////////////////////////////////////


TPC AW preamp multiplicity trigger: counts how many preamps
  // map adc signals into aw16
have hits, fires:
* aw16_mult_1ormore (same as aw16_grand_or)
* aw16_mult_2ormore
* aw16_mult_3ormore
* aw16_mult_4ormore


(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)
  wire [15:0]   aw16 = ({16{conf_enable_aw_adc16}} & adc16_or16[15:0]) |
  ({16{conf_enable_aw_adc32a}} & adc32_or16[15:0]) |
  ({16{conf_enable_aw_adc32b}} & adc32_or16[31:16]);
  ...
  ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));
  ...
  xaw16 <= xxaw16;
</pre>
 
=== aw16_grand_or ===


=== aw16_coinc ===
TPC AW "grand or" trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)


TBW: TPC AW preamp coincidence trigger
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)


=== aw16_mlu ===
=== aw16_mlu ===
Line 164: Line 241:
* this corresponds to time spread of TPC AW signals due to the drift time in the AW drift cell and to the variation in signal transmission time from the ADC to the TRG (digital trigger data link).
* this corresponds to time spread of TPC AW signals due to the drift time in the AW drift cell and to the variation in signal transmission time from the ADC to the TRG (digital trigger data link).
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the "yes/no" trigger decision
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the "yes/no" trigger decision
* after the trigger decision is made, we wait for the TPC to become quiet, meaning there is no aw16 signals for the duration of the aw16_prompt_wait gate (conf_mlu_wait), if any signals arrive during the gate, they restart the gate.
* after the trigger decision is made, we wait for the TPC to become quiet:
* after the TPC has been quiet for conf_mlu_wait time (125MHz/8ns clock), the MLU trigger is ready for the next event.
* we wait until all aw16 signals are empty (no timeout)
* we run the aw16_prompt_wait gate, length conf_mlu_wait (8ns clock), if any aw16 signals arrive, we wait for aw16 empty again, rinse, repeat.
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.


In logic: (see alphag.v)
In logic: (see alphag.v)
Line 180: Line 259:
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate ("TPC quiet time")
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate ("TPC quiet time")
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.
Good settings are:
* conf_mlu_prompt: 64 (512 ns)
* conf_mlu_wait: 128 (1024 ns)


== BSC trigger ==
== BSC trigger ==


TBW
=== bsc_adc16 bus ===
 
The BSC trigger is based on the [15:0]bsc_adc16[7:0] bus: 16 trigger discriminator bits from 8 ADC sas links. (8*16 = 64+64 bars, top and bottom).
 
The bsc_adc16 bus can be fed from sas links 0..7 or 8..15, controlled by conf_bsc_adc16_a and conf_bsc_adc16_b bits on [[#conf_bsc_control bits]].
 
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.
 
=== bsc64_top and bsc64_bot buses ===
 
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):
<pre>
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));
  ag_bsc_remap bsc_remap_b(.adc(bsc_adc16[1]), .bsc_bot(bsc64_bot[8+7:8+0]), .bsc_top(bsc64_top[8+7:8+0]));
  ag_bsc_remap bsc_remap_c(.adc(bsc_adc16[2]), .bsc_bot(bsc64_bot[2*8+7:2*8+0]), .bsc_top(bsc64_top[2*8+7:2*8+0]));
  ag_bsc_remap bsc_remap_d(.adc(bsc_adc16[3]), .bsc_bot(bsc64_bot[3*8+7:3*8+0]), .bsc_top(bsc64_top[3*8+7:3*8+0]));
 
  ag_bsc_remap bsc_remap_e(.adc(bsc_adc16[4]), .bsc_bot(bsc64_bot[4*8+7:4*8+0]), .bsc_top(bsc64_top[4*8+7:4*8+0]));
  ag_bsc_remap bsc_remap_f(.adc(bsc_adc16[5]), .bsc_bot(bsc64_bot[5*8+7:5*8+0]), .bsc_top(bsc64_top[5*8+7:5*8+0]));
  ag_bsc_remap bsc_remap_g(.adc(bsc_adc16[6]), .bsc_bot(bsc64_bot[6*8+7:6*8+0]), .bsc_top(bsc64_top[6*8+7:6*8+0]));
  ag_bsc_remap bsc_remap_h(.adc(bsc_adc16[7]), .bsc_bot(bsc64_bot[7*8+7:7*8+0]), .bsc_top(bsc64_top[7*8+7:7*8+0]));
 
module ag_bsc_remap
  (
  input wire [15:0]  adc,
  output wire [7:0]  bsc_bot,
  output wire [7:0]  bsc_top
  );
 
  assign bsc_top[3] = adc[0];
  assign bsc_top[2] = adc[1];
  assign bsc_top[1] = adc[2];
  assign bsc_top[0] = adc[3];
 
  assign bsc_top[7] = adc[4];
  assign bsc_top[6] = adc[5];
  assign bsc_top[5] = adc[6];
  assign bsc_top[4] = adc[7];
 
  assign bsc_bot[0] = adc[8];
  assign bsc_bot[1] = adc[9];
  assign bsc_bot[2] = adc[10];
  assign bsc_bot[3] = adc[11];
 
  assign bsc_bot[4] = adc[12];
  assign bsc_bot[5] = adc[13];
  assign bsc_bot[6] = adc[14];
  assign bsc_bot[7] = adc[15];
 
endmodule
</pre>
 
=== bsc64 bus ===
 
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:
<pre>
      if (conf_bsc64_bot_only) begin
bsc64 <= bsc64_bot;
      end else if (conf_bsc64_top_only) begin
bsc64 <= bsc64_top;
      end else if (conf_bsc64_bot_top_or) begin
bsc64 <= bsc64_bot | bsc64_top;
      end else if (conf_bsc64_bot_top_and) begin
bsc64 <= bsc64_bot & bsc64_top;
      end else begin
bsc64 <= 64'b0;
      end
</pre>
 
=== bsc_grand_or_trig ===
 
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus
 
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]
 
=== old bsc_mult_trig ===
 
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)
 
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)
* bsc_mult_trig is computed:
<pre>
      if (bsc64_mult >= conf_bsc64_mult) begin
bsc_mult_trig <= 1;
      end else begin
bsc_mult_trig <= 0;
      end
</pre>
 
to enable the bsc multiplicity trigger, set the multiplicity value conf_bsc64_mult in [[#conf_bsc_control bits]] and enable the corresponding bit in [[#conf_trig_enable bits]].
 
=== bsc64 multiplicity trigger ===
 
bsc64 BSC bar multiplicity trigger uses a time window. this time window is started by bsc64_grand_or and runs for conf_bsc64_mult_window clocks (8 nc clock). During this time, hits in bsc64_bus are accumulated (latched) and their multiplicity is computed. If multiplicity condition is satisfied (bigger or equal to conf_bsc64_mult_min), bsc64_mult_trig is fired and the bsc64 bit pattern is saved to the UDP packet. Then trigger waits for the bsc64_bus to be empty. Then trigger waits for conf_bsc64_empty_window clocks, if there is any bsc64 hits, we wait for empty again. So after bsc64 has been empty for conf_bsc64_empty_window clocks, multiplicity trigger is ready for the next event. This scheme cannot implement max multiplicity.
 
recommended values:
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).
* conf_bsc64_mult_min (8 bits): 2
* conf_bsc64_empty_window (8 bits): 80 (640 ns)


== Coincidence trigger ==
== Coincidence trigger ==


Coincidence trigger inputs:
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:


<pre>
<pre>
   assign coinc_input[0] = aw16_mult_1ormore;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;
   assign coinc_input[1] = aw16_mlu_trig;
   assign coinc_input[1] = aw16_mlu_trig;
   assign coinc_input[2] = bsc_grand_or_trig;
   assign coinc_input[2] = bsc_grand_or_trig;
Line 202: Line 383:
Coincidence trigger "start" mask selects which of the inputs can start the coincidence window.
Coincidence trigger "start" mask selects which of the inputs can start the coincidence window.


Coincidence trigger "require" mask selects which inputs must have a hits for the coincidence ot be satisfied.
Coincidence trigger "require" mask selects which inputs must have a hits for the coincidence to be satisfied.


Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.
Line 209: Line 390:


* coincidence of external scintillator, BSC and TPC AW "grand or" signals: start 0x10, required 0x15
* coincidence of external scintillator, BSC and TPC AW "grand or" signals: start 0x10, required 0x15
* coincidence of BSC and TPC AW "grand or" signals: start 0x4, required 0x5
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA


= Control registers =
= Control registers =
Line 224: Line 404:
! Address || Quartus Name || Access || FwRev || Description
! Address || Quartus Name || Access || FwRev || Description
|-
|-
| 0x08 || num_sample || RW || GRIF-C || magic register to control UDP packet size
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size
|-
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register
|-
|-
| 0x1F || compilation_time || RO || || Firmware revision
| 0x1F || compilation_time || RO || || Firmware revision
|-
|-
| 0x20 || conf_trig_width     <= par_value;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock
|-
|-
| 0x21 || conf_busy_width     <= par_value;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)
|-
|-
| 0x22 || conf_pulser_width   <= par_value;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock
|-
|-
| 0x23 || conf_pulser_period   <= par_value;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock
|-
|-
| 0x24 || sw_trigger_counter <= 10;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks
|-
|-
| 0x24 || - || || 0x5b120c9f (01Jun18_20:18) || not used
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]
|-
|-
| 0x25 || conf_trig_enable  <= par_value;
| 0x26 || || || not used
|-
|-
| 0x26 || conf_sas_trig_mask <= par_value; || obsolete
| 0x27 || || || not used
|-
|-
| 0x27 || conf_sas_trig_mask_a <= par_value; || obsolete
| 0x28 || || || not used
|-
|-
| 0x28 || conf_sas_trig_mask_b <= par_value; || obsolete
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links
|-
|-
| 0x29 || conf_nim_mask <= par_value;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links
|-
|-
| 0x2A || conf_esata_mask <= par_value;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]
|-
|-
| 0x2B || reset_out, latch_out, trigger_out || pulsed || 0x5b120c9f (01Jun18_20:18) || see reg 0x2B bits
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]
|-
|-
| 0x2C || conf_aw16_coinc_a || RW || ??? || configure AW coincidence trigger
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed
|-
|-
| 0x2D || conf_aw16_coinc_b || RW || ??? ||
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||
|-
|-
| 0x2E || conf_aw16_coinc_c || RW || ??? ||
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||
|-
|-
| 0x2F || conf_aw16_coinc_d || RW || ??? ||
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||
|-
|-
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link
Line 270: Line 452:
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)
|-
|-
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see conf_control bits below
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below
|-
|-
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 62.5MHz clocks
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks
|-
|-
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledownaw trigger mlu control
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc
|-
|-
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || aw trigger mlu control
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]
|-
|-
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock
|-
|-
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the system 125 MHz clock
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock
|-
|-
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || requency counter of the external clock (eSATA clock)
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)
|-
|-
| 0x3B || conf_counter_adc_select || RW || 0x5bb7f6ae (05Oct18_16:41) || select which 16 ADCs are connected to the selected adc counters, 0..15 - connect the adc16 signals, 16..47 connect the adc32 signals
| 0x3B || conf_counter_adc_select || RW || 0x5bb7f6ae (05Oct18_16:41) || select which 16 ADCs are connected to the selected adc counters, 0..15 - connect the adc16 signals, 16..47 connect the adc32 signals
|-
|-
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET active state
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET
|-
| 0x3C || || || 0x618b790b || not used
|-
|-
| 0x3D || GRIF-C csr || RW || GRIF-C || <= csr & ~par_value; // Selective clear
| 0x3D || GRIF-C csr || RW || GRIF-C || <= csr & ~par_value; // Selective clear
Line 294: Line 478:
| 0x3F || GRIF-C csr || RW || GRIF-C || <= par_value; // write
| 0x3F || GRIF-C csr || RW || GRIF-C || <= par_value; // write
|-
|-
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control
| 0x3D || || || 0x618b790b || not used
|-
|-
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control
| 0x3E ||  ||  || 0x618b790b || not used
|-
| 0x3F ||  ||  || 0x618b790b || not used
|-
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]
|-
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]
|-
|-
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)
|-
|-
| 0x43 || conf_trigger_timeout || RW || 0x5bc8f90f (18Oct18_14:20) || Trigger timeout in 125MHz clocks (8ns)
| 0x43 || conf_trigger_timeout || RW || 0x5bc8f90f (18Oct18_14:20) || Generate timeout trigger if there is no other trigger after given timeout, in 8 ns clocks, must be enabled by bit conf_enable_timeout_trig in [[#conf_trig_enable bits]]
|-
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||
|-
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||
|-
|-
| 0x100 || ts_625 || ROL || || latched timestamp
| 0x100 || ts_625 || ROL || || latched timestamp
Line 326: Line 520:
| 0x10B || counter_adc16_mult_4ormore || ROL ||
| 0x10B || counter_adc16_mult_4ormore || ROL ||
|-
|-
| 0x10C || counter_aw16_coinc_a || ROL || ??? || counter of AW coincidence triggers
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers
|-
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed
|-
|-
| 0x10D || counter_aw16_coinc_b || ROL || ??? ||
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||
|-
|-
| 0x10E || counter_aw16_coinc_c || ROL || ??? ||
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||
|-
|-
| 0x10F || counter_aw16_coinc_d || ROL || ??? ||
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||
|-
|-
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out
Line 341: Line 537:
|-
|-
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers
|-
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers
|-
|-
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers
|-
|-
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers
|-
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed
|-
|-
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers
Line 352: Line 552:
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers
|-
|-
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC multiplicity triggers
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers
|-
|-
| 0x11A || counter_coinc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coinidence triggers
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers
|-
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers
|-
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows
|-
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers
|-
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows
|-
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows
|-
|-
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits
Line 373: Line 583:
|-
|-
|}
|}
== additional registers ==
<pre>
reg  | rw/ro/rol | quartus name  | firmware  | description
-----------------------------------------------------------------
0x60 | rw | cb_control_out      | 0x618b790b | chronobox control
0x61 | rw | cb_status            | 0x618b790b |  chronobox status
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert
0x63 | rw | cb_invert_b_out      | 0x618b790b |
0x64 | rw | cb_enable_le_a_out  | 0x618b790b | timestamp enable leading edge
0x65 | rw | cb_enable_le_b_out  | 0x618b790b |
0x66 | rw | cb_enable_te_a_out  | 0x618b790b | timestamp enable traiing edge
0x67 | rw | cb_enable_te_b_out  | 0x618b790b |
0x6A | ro | cb_input_num        | 0x618b790b | chronobox number of inputs
0x6B | rw | cb_sync_mask_a_out  | 0x618b790b | chronobox sync signal source
0x6C | rw | cb_sync_mask_b_out  | 0x618b790b |
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register
0x6E | ro | cb_sync_status      | 0x618b790b | chronobox sync status
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period
0x70 | ro | cb_fifo_status      | 0x618b790b | chronobox data fifo status
0x71 | ro | cb_fifo_data        | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out <= 1)
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP
</pre>


== conf_control bits ==
== conf_control bits ==
Line 381: Line 616:
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock
|-
|-
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || route AW trigger (aw16) from adc16
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]
|-
|-
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) || route AW trigger (aw16) from adc32 15..0
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||
|-
|-  
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) || route AW trigger (aw16) from adc32 31..16
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||
|-
|-
| 15..4 || || ||
| 15..4 || || ||
|-
|-
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]
|-
|-
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]
|-
|-
|}
|}
Line 431: Line 666:
| 7 ||
| 7 ||
|-
|-
| 15..8 || conf_bsc64_mult || 0x5bc13541 (12Oct18_16:58) || bsc trigger fires if bsc64 multiplicity is equal or more than this value
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity
|-
|-
| 31..16 ||
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks
|-
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks
|-
|-
|}
|}
Line 443: Line 680:
|-
|-
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore
|-
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or
|-
|-
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig
Line 449: Line 688:
|-
|-
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig
|-
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig
|-
|-
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or
|-
|-
| 5 ||
| 5 || conf_coinc_required[5]
|-
|-
| 6 ||
| 6 || conf_coinc_required[6]
|-
|-
| 7 ||
| 7 || conf_coinc_required[7]
|-
|-
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)
Line 475: Line 716:
| 1 || conf_enable_pulser || || trigger on pulser
| 1 || conf_enable_pulser || || trigger on pulser
|-
|-
| 2 || conf_enable_sas_or || || obsolete
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used
|-
|-
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)
|-
|-
| 3 || conf_run_pulser || || let the pulser run (frequency has to be set beforehand)
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)
|-
|-
| 4 || conf_output_pulser || || enable external output of pulser signal
| 4 || || 0x618b790b || not used
|-
|-
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)
|-
|-
| 6 || conf_enable_adc16 || || trigger on adc16 grand-or
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or
|-
|-
| 7 || conf_enable_adc32 || || trigger on adc32 grand-or
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or
|-
|-
| 8 || conf_enable_adc16_1ormore || || trigger on adc16 grand multiplicity "1 or more"
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore "1 or more"
|-
|-
| 9 || conf_enable_adc16_2ormore || || same, "2 or more"
| 9 || conf_enable_adc16_2ormore || || same, "2 or more"
Line 496: Line 737:
|-
|-
| 11 || conf_enable_adc16_4ormore || || same, "4 or more"
| 11 || conf_enable_adc16_4ormore || || same, "4 or more"
|-
| 12 || conf_enable_adc16_coinc || || trigger on special coincidence of adc16 links
|-
|-
| 12 || - || 0x5b08938c (25May18_15:51) || not used
| 12 || - || 0x5b08938c (25May18_15:51) || not used
Line 503: Line 742:
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets
|-
|-
| 14 || conf_enable_busy || 0x5a7a3fbd (06Feb18_15:52) || enable activation of busy counter
| 14 || - || 0x5bc8f90f || not used
|-
|-
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc grand-or
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or
|-
|-
| 16 || conf_enable_aw16_coinc_a || ??? || enable AW coincidence trigger
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]
|-
|-
| 17 || conf_enable_aw16_coinc_b || ??? ||
| 16 || - || 0x62c77f0b || aw16_coinc_x removed
|-
|-
| 18 || conf_enable_aw16_coinc_c || ??? ||
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||
|-
|-
| 19 || conf_enable_aw16_coinc_d || ??? ||
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||
|-
|-
| 20 || conf_clock_select || 0x5b2057f5 (12Jun18_16:32) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||
|-
|-
| 20 || not used || 0x5b3aa19f (02Jul18_15:05) || not used, clock select moved to the conf_control register
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used
|-
|-
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable AW coincidence trigger
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or
|-
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig
|-
|-
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger
|-
|-
| 23 ||
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger
|-
|-
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on AW preamp multiplicity "1 or more"
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore "1 or more"
|-
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed
|-
|-
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, "2 or more"
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, "2 or more"
Line 537: Line 780:
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity
|-
|-
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on coincidence output
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger
|-
|-
| 31 ||
| 31 || - || || not used
|-
|-
|}
|}


== reg 0x2B bits ==
== reg 0x2B bits ==
Write to this register will pulse corresponding fpga signals:


{| cellpadding="10" cellspacing="0" border="1"
{| cellpadding="10" cellspacing="0" border="1"
Line 552: Line 797:
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc
|-
|-
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a trigger
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger
|-
|-
|}
|}


= UDP data format =
= UDP data format =
== general format ==
<pre>
trigger packet:
[0] udp packet counter
[1] 0x8ccccccc
...
[N] 0xEccccccc
different versions of trigger packets should be decoded according to packet length:
40 bytes: initial firmware
76 bytes: firmware 0x618b790b (Nov 2021)
80 bytes: firmware 0x62d1c47e (Jul 2022)
chronobox fifo packet, firmware 0x618b790b (Nov 2021)
[0] udp packet counter
[1] 0xCccccccc
[2] fifo status
[3] fifo data
...
[N] 0xEccccccc
0x0ccccccc is the 28 bit fifo packet counter
chronobox fifo packet, firmware 0x618b790b (Nov 2021)
[0] udp packet counter
[1] 0xDccccccc
[2] 0xDEADBEEF
[3] fifo status
[4] fifo data
...
[N] 0xEccccccc
0x0ccccccc is the 28 bit fifo packet counter
</pre>
== firmware 0x5bc8f90f ==


{| cellpadding="10" cellspacing="0" border="1"
{| cellpadding="10" cellspacing="0" border="1"
! Offset || Name || Quartus name || FwRev || Description
! Offset || Name || Quartus name || FwRev || Description
|-
|-
| 0 || packet counter || none || all || UDP packet counter, counting from 0, reset by reboot. Automatically added by UDP transmitter code in the GRIFC base firmware
| 0 || packet counter || none || all || 31-bit UDP packet counter, counting from 0, reset by reboot. Automatically added by UDP transmitter code in the GRIFC base firmware
|-
|-
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out
Line 587: Line 873:
| X ||  ||  ||  ||  
| X ||  ||  ||  ||  
|-
|-
| 12 || 0x9 packet footer ||  || all || 28 bits of counter_trig_out
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out
|-
|-
|}
|}
== firmware 0x618b790b (Nov 2021) ==
packet size 76 bytes
<pre>
0 udp packet counter
1   udp_data_out  <= {4'h8,udp_counter_trig_out[27:0]};
2   udp_data_out <= udp_trig_ts_625;
3   udp_data_out  <= udp_counter_trig_out;
4   udp_data_out  <= udp_counter_trig_in;
5   udp_data_out  <= udp_counter_pulser;
6   udp_data_out  <= udp_trig_bits;
7   udp_data_out  <= udp_nim_bits;
8   udp_data_out  <= udp_esata_bits;
9   udp_data_out  <= { udp_aw16_mlu_out, 7'h00, 8'h00, udp_aw16_prompt[15:0]};
10   udp_data_out  <= udp_counter_drift;
11   udp_data_out  <= udp_counter_scaledown;
12   udp_data_out  <= { 8'h00, udp_adc16_mult[7:0], 16'h0000 };
13   udp_data_out  <= { 8'h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};
14   udp_data_out  <= { udp_bsc64_bus[31:0]};
15   udp_data_out  <= { udp_bsc64_bus[63:32]};
16   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_bsc64_mult[7:0] };
17   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_coinc_latch[7:0] };
18   udp_data_out  <= {4'hE,udp_counter_trig_out[27:0]};
</pre>
== firmware 0x62d1c47e (Jul 2022) ==
packet size 80 bytes
<pre>
0 udp packet counter
1   udp_data_out  <= {4'h8,udp_counter_trig_out[27:0]};
2   udp_data_out <= udp_trig_ts_625;
3   udp_data_out  <= udp_counter_trig_out;
4   udp_data_out  <= udp_counter_trig_in;
5   udp_data_out  <= udp_counter_pulser;
6   udp_data_out  <= udp_trig_bits;
7   udp_data_out  <= udp_nim_bits;
8   udp_data_out  <= udp_esata_bits;
9   udp_data_out  <= { udp_aw16_mlu_out, 7'h00, 8'h00, udp_aw16_prompt[15:0]};
10   udp_data_out  <= udp_counter_drift;
11   udp_data_out  <= udp_counter_scaledown;
12   udp_data_out  <= { 8'h00, 8'h00, 16'h0000 };
13   udp_data_out  <= { 8'h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};
14   udp_data_out  <= { udp_bsc64_bus[31:0]};
15   udp_data_out  <= { udp_bsc64_bus[63:32]};
16   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_bsc64_mult[7:0] };
17   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_coinc_latch[7:0] };
18        udp_data_out  <= conf_fw_rev;
19   udp_data_out  <= {4'hE,udp_counter_trig_out[27:0]};
</pre>
Values of udp_coinc_latch[7:0]:
* aaa
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:
* aaa
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]
* aaa


== trigger bitmap ==
== trigger bitmap ==
Firmware ??? (one of the very early revisions)
<pre>
<pre>
               udp_trig_bits[0] <= adc16_grand_or;
               udp_trig_bits[0] <= adc16_grand_or;
Line 649: Line 1,000:
               udp_trig_bits[23:8] <= xadc16_or16[15:0]; // 16x AW preamps hits
               udp_trig_bits[23:8] <= xadc16_or16[15:0]; // 16x AW preamps hits
               udp_trig_bits[31:24] <= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)
               udp_trig_bits[31:24] <= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)
</pre>
Firmware 0x5bc8f90f (18Oct18_14:20)
<pre>
  udp_trig_bits  <= trig32_in;
  assign trig32_in[0]  = trigger; // software trigger
  assign trig32_in[1]  = 0; // not used pulser trigger
  assign trig32_in[2]  = 0; // not used conf_enable_sas_or
  assign trig32_in[3]  = 0; // not used conf_run_pulser
  assign trig32_in[4]  = 0; // not used conf_output_pulser
  assign trig32_in[5]  = esata_nim_grand_or;
  assign trig32_in[6]  = adc16_grand_or;
  assign trig32_in[7]  = adc32_grand_or;
  assign trig32_in[8]  = adc16_mult_1ormore;
  assign trig32_in[9]  = adc16_mult_2ormore;
  assign trig32_in[10] = adc16_mult_3ormore;
  assign trig32_in[11] = adc16_mult_4ormore;
  assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc
  assign trig32_in[13] = 0; // not used conf_enable_udp
  assign trig32_in[14] = 0; // not used conf_enable_busy
  assign trig32_in[15] = adc_grand_or;
  assign trig32_in[16] = aw16_coinc_a;
  assign trig32_in[17] = aw16_coinc_b;
  assign trig32_in[18] = aw16_coinc_c;
  assign trig32_in[19] = aw16_coinc_d;
  assign trig32_in[20] = 0; // not used conf_clock_select
  assign trig32_in[21] = aw16_coinc_trig;
  assign trig32_in[22] = aw16_mlu_trig;
  assign trig32_in[23] = timeout_trig;
  assign trig32_in[24] = aw16_mult_1ormore;
  assign trig32_in[25] = aw16_mult_2ormore;
  assign trig32_in[26] = aw16_mult_3ormore;
  assign trig32_in[27] = aw16_mult_4ormore;
  assign trig32_in[28] = bsc_grand_or_trig;
  assign trig32_in[29] = bsc_mult_trig;
  assign trig32_in[30] = coinc_trig;
  assign trig32_in[31] = 0; // not used
</pre>
Firmware 0x618b790b
<pre>
  udp_trig_bits  <= trig32_in;
  assign trig32_in[0]  = sw_trigger; // software trigger
  assign trig32_in[1]  = 0; // not used pulser trigger
  assign trig32_in[2]  = 0; // not used conf_enable_sas_or
  assign trig32_in[3]  = 0; // not used conf_pulser_run
  assign trig32_in[4]  = 0; // not used conf_output_pulser
  assign trig32_in[5]  = esata_nim_grand_or;
  assign trig32_in[6]  = adc16_grand_or;
  assign trig32_in[7]  = adc32_grand_or;
  assign trig32_in[8]  = adc16_mult_1ormore;
  assign trig32_in[9]  = adc16_mult_2ormore;
  assign trig32_in[10] = adc16_mult_3ormore;
  assign trig32_in[11] = adc16_mult_4ormore;
  assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc
  assign trig32_in[13] = 0; // not used conf_enable_udp
  assign trig32_in[14] = 0; // not used conf_enable_busy
  assign trig32_in[15] = adc_grand_or;
  assign trig32_in[16] = aw16_coinc_a;
  assign trig32_in[17] = aw16_coinc_b;
  assign trig32_in[18] = aw16_coinc_c;
  assign trig32_in[19] = aw16_coinc_d;
  assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select
  assign trig32_in[21] = aw16_coinc_trig;
  assign trig32_in[22] = aw16_mlu_trig;
  assign trig32_in[23] = timeout_trig;
  assign trig32_in[24] = aw16_mult_1ormore;
  assign trig32_in[25] = aw16_mult_2ormore;
  assign trig32_in[26] = aw16_mult_3ormore;
  assign trig32_in[27] = aw16_mult_4ormore;
  assign trig32_in[28] = bsc_grand_or_trig;
  assign trig32_in[29] = bsc_mult_trig;
  assign trig32_in[30] = coinc_trig;
  assign trig32_in[31] = 0; // not used
</pre>
Firmware 0x62c77f0b
<pre>
  udp_trig_bits  <= trig32_in;
  assign trig32_in[0]  = sw_trigger; // software trigger
  assign trig32_in[1]  = 0; // not used pulser trigger
  assign trig32_in[2]  = 0; // not used conf_enable_sas_or
  assign trig32_in[3]  = 0; // not used conf_pulser_run
  assign trig32_in[4]  = 0; // not used conf_output_pulser
  assign trig32_in[5]  = esata_nim_grand_or;
  assign trig32_in[6]  = adc16_grand_or;
  assign trig32_in[7]  = adc32_grand_or;
  assign trig32_in[8]  = adc16_mult_1ormore;
  assign trig32_in[9]  = adc16_mult_2ormore;
  assign trig32_in[10] = adc16_mult_3ormore;
  assign trig32_in[11] = adc16_mult_4ormore;
  assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc
  assign trig32_in[13] = 0; // not used conf_enable_udp
  assign trig32_in[14] = 0; // not used conf_enable_busy
  assign trig32_in[15] = adc_grand_or;
  assign trig32_in[16] = 0; // aw16_coinc_a;
  assign trig32_in[17] = 0; // aw16_coinc_b;
  assign trig32_in[18] = 0; // aw16_coinc_c;
  assign trig32_in[19] = 0; // aw16_coinc_d;
  assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select
  assign trig32_in[21] = aw16_coinc_trig;
  assign trig32_in[22] = aw16_mlu_trig;
  assign trig32_in[23] = timeout_trig;
  assign trig32_in[24] = 0; // aw16_mult_1ormore;
  assign trig32_in[25] = 0; // aw16_mult_2ormore;
  assign trig32_in[26] = 0; // aw16_mult_3ormore;
  assign trig32_in[27] = 0; // aw16_mult_4ormore;
  assign trig32_in[28] = bsc_grand_or_trig;
  assign trig32_in[29] = bsc64_mult_trig;
  assign trig32_in[30] = coinc_trig;
  assign trig32_in[31] = 0; // not used
</pre>
= TRG chronobox inputs =
from trg_firmware/toplevel/grifc.v
<pre>
  localparam CB_N = 23;
  localparam CB_N1 = CB_N-1;
  wire [CB_N1:0]    cb_xinputs_async;
  assign cb_xinputs_async[0] = ag_trig_out;
  assign cb_xinputs_async[1] = ag_trig_scaledown_out;
  assign cb_xinputs_async[2] = ag_trig_drift_out;
  assign cb_xinputs_async[3] = ag_trig_received_out;
 
  assign cb_xinputs_async[4] = ag_cb_sw_trig;
  assign cb_xinputs_async[5] = ag_cb_pulser_trig;
  assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;
  assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;
  assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;
 
  assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;
  assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;
  assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;
  assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;
  assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;
  assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;
 
  assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;
  assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;
  assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;
  assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;
  assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;
  assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;
 
  assign cb_xinputs_async[21] = ag_cb_coinc_trig;
  assign cb_xinputs_async[22] = ag_cb_timeout_trig;
</pre>
= Example UDP packets =
* trigger data, marker words 0x8
<pre>
ReadDataThread read 76
  0: 0x003666ed -- UDP packet counter from UDP transmitter
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v
  2: 0x2edf8b41 -- trigger data
  3: 0x00000bf8
  4: 0x00000bf8
  5: 0x00000bee
  6: 0x00000001
  7: 0x00000000
  8: 0x00000000
  9: 0x00000003
10: 0x00000bf8
11: 0x00000bf8
12: 0x00000000
13: 0x00000000
14: 0x00000000
15: 0x00000000
16: 0x00000000
17: 0x00000000
18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.
ReadDataThread read 76 -- next packet
  0: 0x003666ee -- UDP packet counter from UDP transmitter
...
</pre>
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]
<pre>
ReadDataThread read 404
  0: 0x003658ed -- UDP packet counter from UDP transmitter
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow
  3: 0x87fb3d72 -- tsc hits
  4: 0x8ffb3d74
  5: 0x90fb3d74
  6: 0x91fb3d74
  7: 0x92fb3d74
  8: 0x93fb3d74
  9: 0x93fb3d75
10: 0x94fb3d74
11: 0x94fb3d77
12: 0x87fb3d77
13: 0x8ffb3d77
14: 0x90fb3d77
15: 0x91fb3d77
16: 0x92fb3d77
17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow
18: 0x00000000
19: 0x00000000
20: 0x00000000
21: 0x00000000
22: 0x00000000
23: 0x00000000
24: 0x00000000
25: 0x00000108
26: 0x00000000
27: 0x00000000
28: 0x00000000
29: 0x00000000
30: 0x00000000
31: 0x00000000
32: 0x00000000
33: 0x00000108
34: 0x00000108
35: 0x00000108
36: 0x00000108
37: 0x00000108
38: 0x00000108
39: 0x00000000
40: 0x00000000
41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)
42: 0xff800048 -- timestamp wraparound
43: 0x8f1f36e4 -- tsc hits
44: 0x901f36e4
45: 0x911f36e4
46: 0x921f36e4
47: 0x931f36e4
48: 0x941f36e4
49: 0x871f36e4
50: 0x871f36e7
51: 0x8f1f36e7
52: 0x901f36e9
53: 0x911f36e7
54: 0x921f36e9
55: 0x931f36e7
56: 0x941f36e9
57: 0x904330ac
58: 0x914330ac
59: 0x924330ac
60: 0x934330ac
61: 0x934330ad
62: 0x944330ac
63: 0x944330ad
64: 0x874330ac
65: 0x874330ad
66: 0x8f4330ac
67: 0x8f4330ad
68: 0x904330ad
69: 0x914330ad
70: 0x924330ad
71: 0x8f672a62
72: 0x90672a62
73: 0x91672a62
74: 0x92672a62
75: 0x93672a62
76: 0x94672a62
77: 0x87672a62
78: 0x87672a65
79: 0x8f672a65
80: 0x90672a65
81: 0x91672a65
82: 0x92672a65
83: 0x93672a65
84: 0x94672a65
85: 0xff000049
86: 0x878b2422
87: 0x8f8b2424
88: 0x908b2424
89: 0x918b2424
90: 0x928b2424
91: 0x938b2424
92: 0x938b2425
93: 0x948b2424
94: 0x948b2427
95: 0x878b2427
96: 0x8f8b2427
97: 0x908b2427
98: 0x918b2427
99: 0x928b2427
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.
ReadDataThread read 344 -- next packet
...
</pre>
</pre>


= TODO =
= TODO =


* add FwRev to the UDP data output
* DONE July 2022. add FwRev to the UDP data output
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix "write did not happen" (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp "write" packet is lost?
* PROBLEM GONE Aug 2021. fix reply to wrong socket - udp packets should reply to same socket as they came from, udp data packets should be sent to same socket as requested them, not same socket as last command.
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot
* speed up programming the MLU by writing more than 1 bit at a time
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits
* DONE. add chronobox code
* DONE. add avalon mux for alphag and chronobox packets
* DONE. add chronobox fifo to udp packet sequencer
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.
* DONE. test fiber SFP is working
* complete the UDP flash programmer (parallel flash erase and write)


= End =
= End =


//KO
//KO

Latest revision as of 10:06, 25 July 2022

TRG, the trigger control board for the ALPHA-g detector

Links

General characteristics

Photos

Board schematics

Available hardware

  • Altera Stratix IV - main FPGA
  • Altera Max V - boot FPGA
  • boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.

TRG front panel connections

From top to bottom:

|
| minisas-C - links 8-11
| minisas-D - links 12-15
|
| ethernet sfp - use copper sfp only
| minisas - not used, do not connect
| esata - clock in, trigger out
|
| minisas-A - links 0-3
| minisas-B - links 4-7
|
| LEDs
|

MiniSAS and SATA flail cable connections:

P1 <--> link 3
P2 <--> link 2
P3 <--> link 1
P4 <--> link 0

LEDs:

--PCB-- (left)
LED[0] - trigger out - ag_trig_out
LED[1] - network packet received - sfp_rx_data_valid
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE
LED[3] - not used
(right)

TRG onboard jumpers and switches

  • rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251

Firmware update procedure

  • use quartus to generate the grifc.pof file (use grifc.cof)
  • open quartus programmer
  • attach grifc.pof to the 1st CFI_512 flash
  • mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS
  • check that "initiate configuration after programming" is set in tools->options
  • say "start"
  • should take about 5 minutes
  • grifc should reboot into the new firmware

If CFI_512 flash is not visible to the quartus programmer, load correct code into the MaxV CPLD:

  • open quartus programmer,
  • say "auto detect"
  • change file for the 5M2210 device
  • use .../boot/maxv_3xfmc_normal.pof from the firmware git repository
  • say "program", it should finish in 10-15 seconds
  • say "auto detect"
  • CFI_512 flash should be visible now.

Firmware revisions

  • 0x5bc8f90f - original firmware used for all data
  • 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.
  • 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec
  • 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)
  • 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.
  • 0x62d32d95 - updated cbtrg, switched to edge-triggered cbtrg inputs, improved BSC multiplicity trigger, improved coinc trigger, added burst pulser. installed at CERN 19 Jul 2022.
  • 0x62ded109 - fix cbtrg fifo data corruption, 1st fifo word was missing, 2nd fifo word sent twice.

Firmware build

  • use quartus 20.1
  • see Makefile in the trg_firmware project

Jtag remote connection

  • ssh agmini@daq16
  • /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf
  • netstat -an | grep 1309 ### note listen address is "0.0.0.0", NOT "127.0.0.1"
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     
  • opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work
  • ssh olchansk@daq01
  • cd git/trg_firmware
  • /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh
  • jtagconfig ### should work
daq01:trg_firmware$ jtagconfig
1) DE-SoC on daq16 [2-1.2.3]
  4BA00477   SOCVHPS
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..

2) USB-Blaster on daq16 [2-1.3]
  024090DD   EP4SGX230(.|ES)
  020A40DD   5M(1270ZF324|2210Z)/EPM2210

daq01:trg_firmware$ 

ALPHA-g trigger functions

Trigger options:

  • software trigger
  • pulser trigger
  • trigger on GRIF16 ADC NIM and ESATA inputs ("external trigger")
  • adc16 grand-or
  • adc32 grand-or
  • adc16 wire multiplicity
  • TPC anode wire per-preamp trigger (aw16 section)
    • trigger on coincidences of preamps (removed fw 0x62c77f0b)
    • trigger on multiplicity of preamps (removed fw 0x62c77f0b)
    • trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger
  • BSC trigger
    • BSC grand_or
    • BSC bar multiplicity
  • coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers

software trigger

to programmatically fire the trigger, one should:

  • set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger
  • write value 0x4 to register 0x2B, this will cause the software trigger to fire

pulser trigger

To use the pulser trigger, one should program:

  • pulser period (in clocks)
  • pulser width (in clocks, use value 5, the pulser no longer goes outside of the trigger board, so changing the width does not do anything)
  • set the run_pulser bit in conf_trig_enable, this will cause the pulser to run
  • set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger
  • set the output_pulser bit in conf_trig_enable, this will cause the pulser to be output from the alphag firmware block (the pulser no longer goes outside of the trigger board, so changing the bit does not do anything)

timeout trigger

The event builder uses event timestamps to assemble physics events. The timestamps are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If triggers are generated often (1 per second or more), timestamp wrap around is easily detected by the event builder. If triggers come infrequently, timestamp wrap around may occur while there are no triggers, not be seen by the event builder causing loss of event synchronization.

To avoid this problem in the event builder, a timeout trigger should be generated if no triggers were generated inside a 10 second interval.

The guaranties that even if all physics triggers temporarily stop for any reason, the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).

To enable the timeout trigger:

  • program timeout trigger timeout in reg 0x43 in units of 8 ns clock
  • enable it in bit 23 of #conf_trig_enable bits

adc16 multiplicity trigger

This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.

The 16 adc16 trigger bits (16x16=256) are added together to form the hit multiplicity value (adc16_mult, 16 bits, actual range 0 to 256).

Four threshold signals are computed: adc16_mult_1ormore = adc16_mult>=1, 2ormore, 3ormore, 4ormore.

There is a counter for each of these four signals.

Each of these four signals can fire the trigger, see #conf_trig_enable bits.

TPC anode wire triggers

aw16 bus

TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.

Each bit corresponds to one AW preamp. 16 preamps, 16 bits.

The aw16[15:0] bus can be fed by

  • adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links
  • adc32_or16[15:0] - or16 of 62.5 MHz ADCs, FMC-ADC32 has 32 channels, so 2 bits per ADC: low 16 channels and high 16 channels, sas links 7..0
  • adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8

as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in #conf_control bits

   ///////////////////////////////////////////////////////////
   //           TPC Anode Wire trigger logic (aw16)
   ///////////////////////////////////////////////////////////

   // map adc signals into aw16

   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} & adc16_or16[15:0]) |
			   ({16{conf_enable_aw_adc32a}} & adc32_or16[15:0]) |
			   ({16{conf_enable_aw_adc32b}} & adc32_or16[31:16]);
   ...
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));
   ...
   xaw16 <= xxaw16;

aw16_grand_or

TPC AW "grand or" trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)

(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)

aw16_mlu

TPC AW preamp MLU trigger: the MLU (memory lookup table) implements an arbitrary logical function to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.

Description of the aw16 mlu trigger.

In words:

  • any aw16 signal starts the aw16_prompt_run gate
  • aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)
  • this corresponds to time spread of TPC AW signals due to the drift time in the AW drift cell and to the variation in signal transmission time from the ADC to the TRG (digital trigger data link).
  • when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the "yes/no" trigger decision
  • after the trigger decision is made, we wait for the TPC to become quiet:
  • we wait until all aw16 signals are empty (no timeout)
  • we run the aw16_prompt_wait gate, length conf_mlu_wait (8ns clock), if any aw16 signals arrive, we wait for aw16 empty again, rinse, repeat.
  • now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.

In logic: (see alphag.v)

  • aw16_or <= grand-or of 16 aw16 signals
  • "aw16_or" starts the "aw16_prompt_cnt" counter, opens the aw16_prompt_run gate
  • during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt <= aw16_prompt | aw16)
  • this is the time when we wait for all "prompt" signals from the TPC to arrive into the trigger
  • at the end of the aw16_prompt_run gate, the signal aw16_prompt_out is pulsed, latching the output of the MLU into aw16_mlu_trig
  • this is the MLU trigger "yes/no" trigger decision.
  • after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals
  • the aw16_prompt_wait_cnt and aw_prompt_wait gate opens
  • if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted
  • if no aw16 signals arrive during the full run of the aw16_prompt_wait gate ("TPC quiet time")
  • the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.

Good settings are:

  • conf_mlu_prompt: 64 (512 ns)
  • conf_mlu_wait: 128 (1024 ns)

BSC trigger

bsc_adc16 bus

The BSC trigger is based on the [15:0]bsc_adc16[7:0] bus: 16 trigger discriminator bits from 8 ADC sas links. (8*16 = 64+64 bars, top and bottom).

The bsc_adc16 bus can be fed from sas links 0..7 or 8..15, controlled by conf_bsc_adc16_a and conf_bsc_adc16_b bits on #conf_bsc_control bits.

bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.

bsc64_top and bsc64_bot buses

  • firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));
   ag_bsc_remap bsc_remap_b(.adc(bsc_adc16[1]), .bsc_bot(bsc64_bot[8+7:8+0]), .bsc_top(bsc64_top[8+7:8+0]));
   ag_bsc_remap bsc_remap_c(.adc(bsc_adc16[2]), .bsc_bot(bsc64_bot[2*8+7:2*8+0]), .bsc_top(bsc64_top[2*8+7:2*8+0]));
   ag_bsc_remap bsc_remap_d(.adc(bsc_adc16[3]), .bsc_bot(bsc64_bot[3*8+7:3*8+0]), .bsc_top(bsc64_top[3*8+7:3*8+0]));

   ag_bsc_remap bsc_remap_e(.adc(bsc_adc16[4]), .bsc_bot(bsc64_bot[4*8+7:4*8+0]), .bsc_top(bsc64_top[4*8+7:4*8+0]));
   ag_bsc_remap bsc_remap_f(.adc(bsc_adc16[5]), .bsc_bot(bsc64_bot[5*8+7:5*8+0]), .bsc_top(bsc64_top[5*8+7:5*8+0]));
   ag_bsc_remap bsc_remap_g(.adc(bsc_adc16[6]), .bsc_bot(bsc64_bot[6*8+7:6*8+0]), .bsc_top(bsc64_top[6*8+7:6*8+0]));
   ag_bsc_remap bsc_remap_h(.adc(bsc_adc16[7]), .bsc_bot(bsc64_bot[7*8+7:7*8+0]), .bsc_top(bsc64_top[7*8+7:7*8+0]));

module ag_bsc_remap
  (
   input wire [15:0]  adc,
   output wire [7:0]  bsc_bot,
   output wire [7:0]  bsc_top
   );

   assign bsc_top[3] = adc[0];
   assign bsc_top[2] = adc[1];
   assign bsc_top[1] = adc[2];
   assign bsc_top[0] = adc[3];

   assign bsc_top[7] = adc[4];
   assign bsc_top[6] = adc[5];
   assign bsc_top[5] = adc[6];
   assign bsc_top[4] = adc[7];

   assign bsc_bot[0] = adc[8];
   assign bsc_bot[1] = adc[9];
   assign bsc_bot[2] = adc[10];
   assign bsc_bot[3] = adc[11];

   assign bsc_bot[4] = adc[12];
   assign bsc_bot[5] = adc[13];
   assign bsc_bot[6] = adc[14];
   assign bsc_bot[7] = adc[15];

endmodule

bsc64 bus

the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:

      if (conf_bsc64_bot_only) begin
	 bsc64 <= bsc64_bot;
      end else if (conf_bsc64_top_only) begin
	 bsc64 <= bsc64_top;
      end else if (conf_bsc64_bot_top_or) begin
	 bsc64 <= bsc64_bot | bsc64_top;
      end else if (conf_bsc64_bot_top_and) begin
	 bsc64 <= bsc64_bot & bsc64_top;
      end else begin
	 bsc64 <= 64'b0;
      end

bsc_grand_or_trig

bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus

to enable triggering on bsc_grand_or_trig, set corresponding bit in #conf_trig_enable bits

old bsc_mult_trig

(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)

  • bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)
  • bsc_mult_trig is computed:
      if (bsc64_mult >= conf_bsc64_mult) begin
	 bsc_mult_trig <= 1;
      end else begin
	 bsc_mult_trig <= 0;
      end

to enable the bsc multiplicity trigger, set the multiplicity value conf_bsc64_mult in #conf_bsc_control bits and enable the corresponding bit in #conf_trig_enable bits.

bsc64 multiplicity trigger

bsc64 BSC bar multiplicity trigger uses a time window. this time window is started by bsc64_grand_or and runs for conf_bsc64_mult_window clocks (8 nc clock). During this time, hits in bsc64_bus are accumulated (latched) and their multiplicity is computed. If multiplicity condition is satisfied (bigger or equal to conf_bsc64_mult_min), bsc64_mult_trig is fired and the bsc64 bit pattern is saved to the UDP packet. Then trigger waits for the bsc64_bus to be empty. Then trigger waits for conf_bsc64_empty_window clocks, if there is any bsc64 hits, we wait for empty again. So after bsc64 has been empty for conf_bsc64_empty_window clocks, multiplicity trigger is ready for the next event. This scheme cannot implement max multiplicity.

recommended values:

  • conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).
  • conf_bsc64_mult_min (8 bits): 2
  • conf_bsc64_empty_window (8 bits): 80 (640 ns)

Coincidence trigger

Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:

   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;
   assign coinc_input[1] = aw16_mlu_trig;
   assign coinc_input[2] = bsc_grand_or_trig;
   assign coinc_input[3] = bsc_mult_trig;
   assign coinc_input[4] = esata_nim_grand_or;
   assign coinc_input[5] = 0;
   assign coinc_input[6] = 0;
   assign coinc_input[7] = 0;

Coincidence trigger "start" mask selects which of the inputs can start the coincidence window.

Coincidence trigger "require" mask selects which inputs must have a hits for the coincidence to be satisfied.

Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.

Example settings:

  • coincidence of external scintillator, BSC and TPC AW "grand or" signals: start 0x10, required 0x15
  • coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5
  • coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9

Control registers

Register addresses

Note: all registers are 32 bits unless otherwise noted.

Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the "latch_out" bit

Address Quartus Name Access FwRev Description
0x08 num_sample RW GRIF-C magic 16-bit register to control UDP packet size
0x08 scratch_reg RW 0x618b790b 32-bit scratch register
0x1F compilation_time RO Firmware revision
0x20 conf_trig_width RW Trigger signal width, 16 ns clock
0x21 conf_busy_width RW Busy signal width, 16 ns clock (not used)
0x22 conf_pulser_width RW Pulser signal width, 16 ns clock
0x23 conf_pulser_period RW Pulser signal period, 16 ns clock
0x24 conf_pulser_burst_ctrl RW 0x62d1c47e Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks
0x25 conf_trig_enable RW see #conf_trig_enable bits
0x26 not used
0x27 not used
0x28 not used
0x29 conf_nim_mask RW enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links
0x2A conf_esata_mask RW enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links
0x2B reset_out, latch_out, trigger_out W see #reg 0x2B bits
0x2C conf_aw16_coinc_a RW 0x5bc8f90f configure AW coincidence trigger, see #aw16_coinc
0x2C conf_aw16_coinc_a RW 0x62c77f0b removed
0x2D conf_aw16_coinc_b RW 0x5bc8f90f
0x2E conf_aw16_coinc_c RW 0x5bc8f90f
0x2F conf_aw16_coinc_d RW 0x5bc8f90f
0x30 sas_sd[15:0] ROL 0x5b120c9f (01Jun18_20:18) sas signal detect for each link
0x31 pll_625_status ROL 0x5b2057f5 (12Jun18_16:32) 62.5MHz PLL status, bits: 31=locked, 30=active clock, 29=esata_clk_bad, 28=clk625_bad, 27:0 not used, to be lock counter
0x32 clk_counter ROL 0x5b2057f5 (12Jun18_16:32) frequency counter of the system 125 MHz clock
0x33 clk_625_counter ROL 0x5b2057f5 (12Jun18_16:32) frequency counter of the currently selected 62.5 MHz clock (my_clk_625)
0x34 conf_control RW 0x5b398983 (01Jul18_19:10) see #conf_control bits below
0x35 conf_drift_width RW 0x5b398983 (01Jul18_19:10) width of drift time blank-out in 16 ns clocks
0x36 conf_scaledown RW 0x5b398983 (01Jul18_19:10) trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc
0x37 conf_mlu RW 0x5b398983 (01Jul18_19:10) AW MLU control bits, see #conf_mlu bits
0x38 conf_trig_delay RW 0x5baedfca (28Sep18_19:13) delay the trigger pulse, 16 ns clock
0x39 esata_clk_counter ROL 0x5baedfca (28Sep18_19:13) frequency counter of the TRG 125 MHz clock
0x3A esata_clk_esata_counter ROL 0x5baedfca (28Sep18_19:13) frequency counter of the external clock (eSATA 62.5 MHz clock)
0x3B conf_counter_adc_select RW 0x5bb7f6ae (05Oct18_16:41) select which 16 ADCs are connected to the selected adc counters, 0..15 - connect the adc16 signals, 16..47 connect the adc32 signals
0x3C sysreset_ts RO 0x5bb7f6ae (05Oct18_16:41) 125MHz counter of VME-SYSRESET
0x3C 0x618b790b not used
0x3D GRIF-C csr RW GRIF-C <= csr & ~par_value; // Selective clear
0x3E GRIF-C csr RW GRIF-C par_value; // Selective set
0x3F GRIF-C csr RW GRIF-C <= par_value; // write
0x3D 0x618b790b not used
0x3E 0x618b790b not used
0x3F 0x618b790b not used
0x40 conf_bsc_control RW 0x5bc13541 (12Oct18_16:58) Barrel Scintillator trigger control, see #conf_bsc_control bits
0x41 conf_coinc_control RW 0x5bc13541 (12Oct18_16:58) Coincidence trigger control, see #conf_coinc_control bits
0x42 reconfig_out WO 0x5bc13541 (12Oct18_16:58) reserved for rebooting the FPGA (does not work)
0x43 conf_trigger_timeout RW 0x5bc8f90f (18Oct18_14:20) Generate timeout trigger if there is no other trigger after given timeout, in 8 ns clocks, must be enabled by bit conf_enable_timeout_trig in #conf_trig_enable bits
0x44 eth_clk_counter ROL 0x618b790b
0x45 eth_clk_eth_counter ROL 0x618b790b
0x100 ts_625 ROL latched timestamp
0x101 counter_trig_out ROL counter of issued triggers
0x102 counter_trig_in ROL counter of triggers
0x103 counter_pulser ROL counter of pulser
0x104 counter_adc16_grand_or ROL
0x105 counter_adc32_grand_or ROL
0x106 counter_adc_grand_or ROL
0x107 counter_esata_nim_grand_or ROL
0x108 counter_adc16_mult_1ormore ROL
0x109 counter_adc16_mult_2ormore ROL
0x10A counter_adc16_mult_3ormore ROL
0x10B counter_adc16_mult_4ormore ROL
0x10C counter_aw16_coinc_a ROL 0x5bc8f90f counter of AW coincidence triggers
0x10C counter_aw16_coinc_a ROL 0x62c77f0b removed
0x10D counter_aw16_coinc_b ROL 0x5bc8f90f
0x10E counter_aw16_coinc_c ROL 0x5bc8f90f
0x10F counter_aw16_coinc_d ROL 0x5bc8f90f
0x110 counter_drift ROL 0x5b398983 (01Jul18_19:10) counter of triggers that passed the drift time blank-out
0x111 counter_scaledown ROL 0x5b398983 (01Jul18_19:10) counter of triggers that passed the scaledown
0x112 counter_aw16_coinc ROL 0x5b398983 (01Jul18_19:10) counter of AW coincidence triggers
0x113 counter_aw16_mlu ROL 0x5b398983 (01Jul18_19:10) counter of AW MLU triggers
0x114 counter_aw16_grand_or ROL 0x62c77f0b counter of AW grand-or triggers
0x114 counter_aw16_mult_1ormore ROL 0x5bb7f6ae (05Oct18_16:41) counter of AW 1ormore triggers
0x115 counter_aw16_mult_2ormore ROL 0x5bb7f6ae (05Oct18_16:41) counter of AW 2ormore triggers
0x115 counter_aw16_mult_2ormore ROL 0x62c77f0b removed
0x116 counter_aw16_mult_3ormore ROL 0x5bb7f6ae (05Oct18_16:41) counter of AW 3ormore triggers
0x117 counter_aw16_mult_4ormore ROL 0x5bb7f6ae (05Oct18_16:41) counter of AW 4ormore triggers
0x118 counter_bsc_grand_or ROL 0x5bc13541 (12Oct18_16:58) counter of BSC grand-or triggers
0x119 counter_bsc_mult ROL 0x5bc13541 (12Oct18_16:58) counter of old BSC multiplicity triggers
0x11A counter_coinc ROL 0x5bc13541 (12Oct18_16:58) counter of coincidence triggers
0x11B counter_timeout ROL 0x618b790b counter of timeout triggers
0x11C counter_bsc_mult_start ROL 0x62c77f0b counter of BSC multiplicity windows
0x11D counter_bsc_mult_trig ROL 0x62c77f0b counter of BSC multiplicity triggers
0x11E counter_coinc_start ROL 0x62d1b152 counter of coincidence windows
0x11F counter_aw16_mlu_start ROL 0x62d1b152 counter of TPC AW MLU windows
0x200..0x207 conf_adc16_masks RW all adc16 enable bits
0x300..0x30F conf_adc32_masks RW all adc32 enable bits
0x400..0x41F sas_bits[15:0][63:0] ROL all sas data bits for each link
0x420..0x42F sas_sd_counters[15:0] ROL 0x5b120c9f (01Jun18_20:18) sas signal detect counter for each link
0x430..0x43F counters_adc16_or16[15:0] ROL 0x5b120c9f (01Jun18_20:18) 16 counters of adc16 ORes
0x440..0x45F counters_adc32_or16[31:0] ROL 0x5b120c9f (01Jun18_20:18) 32 counters of adc32 ORes
0x460..0x46F counters_adc_selected[15:0] ROL 0x5bb7f6ae (05Oct18_16:41) 16 counters for selected group of adcs, see conf_counter_adc_select
0x470..0x4AF counters_bsc64[63:0] ROL 0x5bc13541 (12Oct18_16:58) 64 counters for the BSC bars

additional registers

reg  | rw/ro/rol | quartus name  | firmware   | description
-----------------------------------------------------------------
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control
0x61 | rw | cb_status            | 0x618b790b |  chronobox status
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert
0x63 | rw | cb_invert_b_out      | 0x618b790b |
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge 
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | 
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | 
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out <= 1)
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP

conf_control bits

Bit Quartus Name FwRev Description
0 conf_clock_select 0x5b3aa19f (02Jul18_15:05) select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock
1 conf_enable_aw_adc16 0x5baedfca (28Sep18_19:13) select source of TPC AW aw16 bus, see #aw16 bus
2 conf_enable_aw_adc32a 0x5baedfca (28Sep18_19:13)
3 conf_enable_aw_adc32b 0x5baedfca (28Sep18_19:13)
15..4
23..16 conf_mlu_prompt 0x5b3aa19f (02Jul18_15:05) MLU trigger prompt window, see #aw16_mlu
31..24 conf_mlu_wait 0x5b3aa19f (02Jul18_15:05) MLU trigger wait window, see #aw16_mlu

conf_mlu bits

Bit Quartus Name FwRev Description
31 mlu_reset 0x5b3aa19f (02Jul18_15:05) not used
30 mlu_write 0x5b3aa19f (02Jul18_15:05) 1=write data bit into given address
16 mlu_data 0x5b3aa19f (02Jul18_15:05) data bit for writing to MLU RAM
15..0 mlu_write_addr 0x5b3aa19f (02Jul18_15:05) MLU RAM write address for writing the data bit

conf_bsc_control bits

Bit Quartus Name FwRev Description
0 conf_bsc_adc_a 0x5bc13541 (12Oct18_16:58) enable mapping of BSC ADCs to ADC links 0..7
1 conf_bsc_adc_b 0x5bc13541 (12Oct18_16:58) enable mapping of BSC ADCs to ADC links 8..15
2 conf_bsc64_bot_only 0x5bc13541 (12Oct18_16:58) bsc64 uses bottom channels only
3 conf_bsc64_top_only 0x5bc13541 (12Oct18_16:58) bsc64 uses top channels only
4 conf_bsc64_bot_top_or 0x5bc13541 (12Oct18_16:58) bsc64 uses "or" of top and bottom
5 conf_bsc64_bot_top_and 0x5bc13541 (12Oct18_16:58) bsc64 uses "and" of top and bottom
6
7
15..8 conf_bsc64_mult_min 0x5bc13541 (12Oct18_16:58) minimum bsc64 multiplicity
23..16 conf_bsc64_empty_wondow 0x62d1c47e bsc64 empty window length, 8 ns clocks
31..24 conf_bsc64_mult_window 0x62c77f0b bsc64 multiplicity window length, 8 ns clocks

conf_coinc_control bits

Bit Quartus Name FwRev Description
0 conf_coinc_required[0] 0x5bc13541 (12Oct18_16:58) enable aw16_mult_1ormore
0 conf_coinc_required[0] 0x62c77f0b enable aw16_grand_or
1 conf_coinc_required[1] 0x5bc13541 (12Oct18_16:58) enable aw16_mlu_trig
2 conf_coinc_required[2] 0x5bc13541 (12Oct18_16:58) enable bsc_grand_or_trig
3 conf_coinc_required[3] 0x5bc13541 (12Oct18_16:58) enable bsc_mult_trig
3 conf_coinc_required[3] 0x62c77f0b enable bsc64_mult_trig
4 conf_coinc_required[4] 0x5bc13541 (12Oct18_16:58) enable esata_nim_grand_or
5 conf_coinc_required[5]
6 conf_coinc_required[6]
7 conf_coinc_required[7]
15..8 conf_coinc_window[7:0] 0x5bc13541 (12Oct18_16:58) coincidence window length in units of 125MHz clock (8 ns)
23..16 conf_coinc_start[7:0] 0x5bc13541 (12Oct18_16:58) start the coincidence window, same bits as "required"
31..24

conf_trig_enable bits

Bit Quartus Name FwRev Description
0 conf_enable_sw_trigger trigger on software trigger (how generated???)
1 conf_enable_pulser trigger on pulser
2 - 0x5b120c9f (01Jun18_20:18) not used
3 conf_pulser_run allow the pulser to run (frequency has to be set beforehand)
4 conf_output_pulser 0x5bc8f90f does nothing (top level ag_pulser_out is disconnected)
4 0x618b790b not used
5 conf_enable_esata_nim trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)
6 conf_enable_adc16 trigger on adc16_grand_or
7 conf_enable_adc32 trigger on adc32_grand_or
8 conf_enable_adc16_1ormore trigger on adc16_mult_1ormore "1 or more"
9 conf_enable_adc16_2ormore same, "2 or more"
10 conf_enable_adc16_3ormore same, "3 or more"
11 conf_enable_adc16_4ormore same, "4 or more"
12 - 0x5b08938c (25May18_15:51) not used
13 conf_enable_udp 0x5a7a3fbd (06Feb18_15:52) enable sending UDP packets
14 - 0x5bc8f90f not used
15 conf_enable_adc 0x5b120c9f (01Jun18_20:18) trigger on adc_grand_or
16 conf_enable_aw16_coinc_a 0x5bc8f90f enable AW coincidence trigger, see #aw16_coinc
16 - 0x62c77f0b aw16_coinc_x removed
17 conf_enable_aw16_coinc_b 0x5bc8f90f
18 conf_enable_aw16_coinc_c 0x5bc8f90f
19 conf_enable_aw16_coinc_d 0x5bc8f90f
20 - 0x5b3aa19f (02Jul18_15:05) not used
20 conf_enable_aw16_grand_or 0x618b790b enable trigger on aw16_grand_or
21 conf_enable_aw16_coinc 0x5b3aa19f (02Jul18_15:05) enable trigger on aw16_coinc_trig
22 conf_enable_aw16_mlu 0x5b3aa19f (02Jul18_15:05) enable AW MLU trigger
23 conf_enable_timeout_trig 0x5bc8f90f (18Oct18_14:20) enable trigger timeout trigger
24 conf_enable_aw16_1ormore 0x5b3aa19f (02Jul18_15:05) trigger on aw16_mult_1ormore "1 or more"
24 - 0x62c77f0b aw16_mult_xxx removed
25 conf_enable_aw16_2ormore 0x5b3aa19f (02Jul18_15:05) same, "2 or more"
26 conf_enable_aw16_3ormore 0x5b3aa19f (02Jul18_15:05) same, "3 or more"
27 conf_enable_aw16_4ormore 0x5b3aa19f (02Jul18_15:05) same, "4 or more"
28 conf_enable_bsc_grand_or 0x5bc13541 (12Oct18_16:58) trigger on BSC grand-or
29 conf_enable_bsc_mult 0x5bc13541 (12Oct18_16:58) trigger on BSC multiplicity
30 conf_enable_coinc 0x5bc13541 (12Oct18_16:58) trigger on TPC/BSC/ext coincidence trigger
31 - not used

reg 0x2B bits

Write to this register will pulse corresponding fpga signals:

Bit Quartus Name FwRev Description
0 reset_out 0x5b120c9f (01Jun18_20:18) reset counters, etc
1 latch_out 0x5b120c9f (01Jun18_20:18) latch counters, sas bits, etc
2 trigger_out 0x5b120c9f (01Jun18_20:18) generate a software trigger

UDP data format

general format

trigger packet:

[0] udp packet counter
[1] 0x8ccccccc
...
[N] 0xEccccccc

different versions of trigger packets should be decoded according to packet length:
40 bytes: initial firmware
76 bytes: firmware 0x618b790b (Nov 2021)
80 bytes: firmware 0x62d1c47e (Jul 2022)

chronobox fifo packet, firmware 0x618b790b (Nov 2021)

[0] udp packet counter
[1] 0xCccccccc
[2] fifo status
[3] fifo data
...
[N] 0xEccccccc

0x0ccccccc is the 28 bit fifo packet counter

chronobox fifo packet, firmware 0x618b790b (Nov 2021)

[0] udp packet counter
[1] 0xDccccccc
[2] 0xDEADBEEF
[3] fifo status
[4] fifo data
...
[N] 0xEccccccc

0x0ccccccc is the 28 bit fifo packet counter

firmware 0x5bc8f90f

Offset Name Quartus name FwRev Description
0 packet counter none all 31-bit UDP packet counter, counting from 0, reset by reboot. Automatically added by UDP transmitter code in the GRIFC base firmware
1 0x8 packet header all 28 bits of counter_trig_out
2 trigger timestamp trig_ts all 62.5MHz trigger timestamp
3 accepted triggers counter_trig_out all counter of accepted triggers
4 input triggers counter_trig_in all counter of trigger input
5 pulser triggers counter_pulser all counter of pulser triggers
6 trigger bitmap udp_trig_bits 0x5a48448d (30Dec17_17:59) bitmap of trigger information, see below
7 nim bits udp_nim_bits_masked ??? 32 bits of ADC NIM inputs (2 bits per ADC)
8 esata bits udp_esata_bits_masked ??? 32 bits of ADC ESATA inputs (2 bits per ADC)
9 mlu bits aw16_prompt 0x5b398983 (01Jul18_19:10) 16 bits of MLU input, 1 bit per preamp
10 drift-blank-off counter udp_drift_counter 0x5b3aa19f (02Jul18_15:05) counter of triggers that passed the drift blank-off
11 scaledown counter udp_scaledown_counter 0x5b3aa19f (02Jul18_15:05) counter of triggers that passed the scaledown
X
12 0xE packet footer all 28 bits of counter_trig_out

firmware 0x618b790b (Nov 2021)

packet size 76 bytes

0 udp packet counter
1	   udp_data_out  <= {4'h8,udp_counter_trig_out[27:0]};
2	   udp_data_out <= udp_trig_ts_625;
3	   udp_data_out  <= udp_counter_trig_out;
4	   udp_data_out  <= udp_counter_trig_in;
5	   udp_data_out  <= udp_counter_pulser;
6	   udp_data_out  <= udp_trig_bits;
7	   udp_data_out  <= udp_nim_bits;
8	   udp_data_out  <= udp_esata_bits;
9	   udp_data_out  <= { udp_aw16_mlu_out, 7'h00, 8'h00, udp_aw16_prompt[15:0]};
10	   udp_data_out  <= udp_counter_drift;
11	   udp_data_out  <= udp_counter_scaledown;
12	   udp_data_out  <= { 8'h00, udp_adc16_mult[7:0], 16'h0000 };
13	   udp_data_out  <= { 8'h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};
14	   udp_data_out  <= { udp_bsc64_bus[31:0]};
15	   udp_data_out  <= { udp_bsc64_bus[63:32]};
16	   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_bsc64_mult[7:0] };
17	   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_coinc_latch[7:0] };
18	   udp_data_out  <= {4'hE,udp_counter_trig_out[27:0]};

firmware 0x62d1c47e (Jul 2022)

packet size 80 bytes

0 udp packet counter
1	   udp_data_out  <= {4'h8,udp_counter_trig_out[27:0]};
2	   udp_data_out <= udp_trig_ts_625;
3	   udp_data_out  <= udp_counter_trig_out;
4	   udp_data_out  <= udp_counter_trig_in;
5	   udp_data_out  <= udp_counter_pulser;
6	   udp_data_out  <= udp_trig_bits;
7	   udp_data_out  <= udp_nim_bits;
8	   udp_data_out  <= udp_esata_bits;
9	   udp_data_out  <= { udp_aw16_mlu_out, 7'h00, 8'h00, udp_aw16_prompt[15:0]};
10	   udp_data_out  <= udp_counter_drift;
11	   udp_data_out  <= udp_counter_scaledown;
12	   udp_data_out  <= { 8'h00, 8'h00, 16'h0000 };
13	   udp_data_out  <= { 8'h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};
14	   udp_data_out  <= { udp_bsc64_bus[31:0]};
15	   udp_data_out  <= { udp_bsc64_bus[63:32]};
16	   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_bsc64_mult[7:0] };
17	   udp_data_out  <= { 8'h00, 8'h00, 8'h00, udp_coinc_latch[7:0] };
18         udp_data_out  <= conf_fw_rev;
19	   udp_data_out  <= {4'hE,udp_counter_trig_out[27:0]};

Values of udp_coinc_latch[7:0]:

  • aaa

Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:

  • aaa

Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]

  • aaa

trigger bitmap

Firmware ??? (one of the very early revisions)

              udp_trig_bits[0] <= adc16_grand_or;
              udp_trig_bits[1] <= adc32_grand_or;
              udp_trig_bits[2] <= adc_grand_or;
              udp_trig_bits[3] <= esata_nim_grand_or;
              udp_trig_bits[4] <= adc16_coinc_top;
              udp_trig_bits[5] <= adc16_coinc_bot;
              udp_trig_bits[6] <= adc16_coinc;
              udp_trig_bits[7] <= 0;
              udp_trig_bits[23:8] <= adc16_coinc_dff[15:0];
              udp_trig_bits[31:24] <= mult16[7:0];

Firmware 0x5b08938c (25May18_15:51)

              udp_trig_bits[0] <= adc16_grand_or;
              udp_trig_bits[1] <= adc32_grand_or;
              udp_trig_bits[2] <= adc_grand_or;
              udp_trig_bits[3] <= esata_nim_grand_or;
              udp_trig_bits[4] <= 0; // not used
              udp_trig_bits[5] <= 0; // not used
              udp_trig_bits[6] <= 0; // not used
              udp_trig_bits[7] <= 0;
              udp_trig_bits[23:8] <= 0; // not used
              udp_trig_bits[31:24] <= mult16[7:0];

Firmware 0x5b217dc4 (13Jun18_13:25)

              udp_trig_bits[0] <= adc16_grand_or;
              udp_trig_bits[1] <= adc32_grand_or;
              udp_trig_bits[2] <= adc_grand_or;
              udp_trig_bits[3] <= esata_nim_grand_or;
              udp_trig_bits[4] <= 0; // not used
              udp_trig_bits[5] <= 0; // not used
              udp_trig_bits[6] <= 0; // not used
              udp_trig_bits[7] <= 0;
              udp_trig_bits[23:8] <= xadc16_or16[15:0]; // 16x AW preamps hits
              udp_trig_bits[31:24] <= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)

Firmware 0x5b3aa19f (02Jul18_15:05)

              udp_trig_bits[0] <= adc16_grand_or;
              udp_trig_bits[1] <= adc32_grand_or;
              udp_trig_bits[2] <= adc_grand_or;
              udp_trig_bits[3] <= esata_nim_grand_or;
              udp_trig_bits[4] <= 0; // not used
              udp_trig_bits[5] <= 0; // not used
              udp_trig_bits[6] <= 0; // not used
              udp_trig_bits[7] <= udp_mlu_out;
              udp_trig_bits[23:8] <= xadc16_or16[15:0]; // 16x AW preamps hits
              udp_trig_bits[31:24] <= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)

Firmware 0x5bc8f90f (18Oct18_14:20)

   udp_trig_bits  <= trig32_in;
   assign trig32_in[0]  = trigger; // software trigger
   assign trig32_in[1]  = 0; // not used pulser trigger
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or
   assign trig32_in[3]  = 0; // not used conf_run_pulser
   assign trig32_in[4]  = 0; // not used conf_output_pulser
   assign trig32_in[5]  = esata_nim_grand_or;
   assign trig32_in[6]  = adc16_grand_or;
   assign trig32_in[7]  = adc32_grand_or;
   assign trig32_in[8]  = adc16_mult_1ormore;
   assign trig32_in[9]  = adc16_mult_2ormore;
   assign trig32_in[10] = adc16_mult_3ormore;
   assign trig32_in[11] = adc16_mult_4ormore;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc
   assign trig32_in[13] = 0; // not used conf_enable_udp
   assign trig32_in[14] = 0; // not used conf_enable_busy
   assign trig32_in[15] = adc_grand_or;
   assign trig32_in[16] = aw16_coinc_a;
   assign trig32_in[17] = aw16_coinc_b;
   assign trig32_in[18] = aw16_coinc_c;
   assign trig32_in[19] = aw16_coinc_d;
   assign trig32_in[20] = 0; // not used conf_clock_select
   assign trig32_in[21] = aw16_coinc_trig;
   assign trig32_in[22] = aw16_mlu_trig;
   assign trig32_in[23] = timeout_trig;
   assign trig32_in[24] = aw16_mult_1ormore;
   assign trig32_in[25] = aw16_mult_2ormore;
   assign trig32_in[26] = aw16_mult_3ormore;
   assign trig32_in[27] = aw16_mult_4ormore;
   assign trig32_in[28] = bsc_grand_or_trig;
   assign trig32_in[29] = bsc_mult_trig;
   assign trig32_in[30] = coinc_trig;
   assign trig32_in[31] = 0; // not used

Firmware 0x618b790b

   udp_trig_bits  <= trig32_in;
   assign trig32_in[0]  = sw_trigger; // software trigger
   assign trig32_in[1]  = 0; // not used pulser trigger
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or
   assign trig32_in[3]  = 0; // not used conf_pulser_run
   assign trig32_in[4]  = 0; // not used conf_output_pulser
   assign trig32_in[5]  = esata_nim_grand_or;
   assign trig32_in[6]  = adc16_grand_or;
   assign trig32_in[7]  = adc32_grand_or;
   assign trig32_in[8]  = adc16_mult_1ormore;
   assign trig32_in[9]  = adc16_mult_2ormore;
   assign trig32_in[10] = adc16_mult_3ormore;
   assign trig32_in[11] = adc16_mult_4ormore;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc
   assign trig32_in[13] = 0; // not used conf_enable_udp
   assign trig32_in[14] = 0; // not used conf_enable_busy
   assign trig32_in[15] = adc_grand_or;
   assign trig32_in[16] = aw16_coinc_a;
   assign trig32_in[17] = aw16_coinc_b;
   assign trig32_in[18] = aw16_coinc_c;
   assign trig32_in[19] = aw16_coinc_d;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select
   assign trig32_in[21] = aw16_coinc_trig;
   assign trig32_in[22] = aw16_mlu_trig;
   assign trig32_in[23] = timeout_trig;
   assign trig32_in[24] = aw16_mult_1ormore;
   assign trig32_in[25] = aw16_mult_2ormore;
   assign trig32_in[26] = aw16_mult_3ormore;
   assign trig32_in[27] = aw16_mult_4ormore;
   assign trig32_in[28] = bsc_grand_or_trig;
   assign trig32_in[29] = bsc_mult_trig;
   assign trig32_in[30] = coinc_trig;
   assign trig32_in[31] = 0; // not used

Firmware 0x62c77f0b

   udp_trig_bits  <= trig32_in;
   assign trig32_in[0]  = sw_trigger; // software trigger
   assign trig32_in[1]  = 0; // not used pulser trigger
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or
   assign trig32_in[3]  = 0; // not used conf_pulser_run
   assign trig32_in[4]  = 0; // not used conf_output_pulser
   assign trig32_in[5]  = esata_nim_grand_or;
   assign trig32_in[6]  = adc16_grand_or;
   assign trig32_in[7]  = adc32_grand_or;
   assign trig32_in[8]  = adc16_mult_1ormore;
   assign trig32_in[9]  = adc16_mult_2ormore;
   assign trig32_in[10] = adc16_mult_3ormore;
   assign trig32_in[11] = adc16_mult_4ormore;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc
   assign trig32_in[13] = 0; // not used conf_enable_udp
   assign trig32_in[14] = 0; // not used conf_enable_busy
   assign trig32_in[15] = adc_grand_or;
   assign trig32_in[16] = 0; // aw16_coinc_a;
   assign trig32_in[17] = 0; // aw16_coinc_b;
   assign trig32_in[18] = 0; // aw16_coinc_c;
   assign trig32_in[19] = 0; // aw16_coinc_d;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select
   assign trig32_in[21] = aw16_coinc_trig;
   assign trig32_in[22] = aw16_mlu_trig;
   assign trig32_in[23] = timeout_trig;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;
   assign trig32_in[28] = bsc_grand_or_trig;
   assign trig32_in[29] = bsc64_mult_trig;
   assign trig32_in[30] = coinc_trig;
   assign trig32_in[31] = 0; // not used

TRG chronobox inputs

from trg_firmware/toplevel/grifc.v

   localparam CB_N = 23;
   localparam CB_N1 = CB_N-1;

   wire [CB_N1:0]    cb_xinputs_async;

   assign cb_xinputs_async[0] = ag_trig_out;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;
   assign cb_xinputs_async[2] = ag_trig_drift_out;
   assign cb_xinputs_async[3] = ag_trig_received_out;
   
   assign cb_xinputs_async[4] = ag_cb_sw_trig;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;
   
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;
   
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;
   
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;

   assign cb_xinputs_async[22] = ag_cb_timeout_trig;

Example UDP packets

  • trigger data, marker words 0x8
ReadDataThread read 76
  0: 0x003666ed -- UDP packet counter from UDP transmitter
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v
  2: 0x2edf8b41 -- trigger data
  3: 0x00000bf8
  4: 0x00000bf8
  5: 0x00000bee
  6: 0x00000001
  7: 0x00000000
  8: 0x00000000
  9: 0x00000003
 10: 0x00000bf8
 11: 0x00000bf8
 12: 0x00000000
 13: 0x00000000
 14: 0x00000000
 15: 0x00000000
 16: 0x00000000
 17: 0x00000000
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.
ReadDataThread read 76 -- next packet
  0: 0x003666ee -- UDP packet counter from UDP transmitter
...
ReadDataThread read 404
  0: 0x003658ed -- UDP packet counter from UDP transmitter
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow
  3: 0x87fb3d72 -- tsc hits
  4: 0x8ffb3d74
  5: 0x90fb3d74
  6: 0x91fb3d74
  7: 0x92fb3d74
  8: 0x93fb3d74
  9: 0x93fb3d75
 10: 0x94fb3d74
 11: 0x94fb3d77
 12: 0x87fb3d77
 13: 0x8ffb3d77
 14: 0x90fb3d77
 15: 0x91fb3d77
 16: 0x92fb3d77
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow
 18: 0x00000000
 19: 0x00000000
 20: 0x00000000
 21: 0x00000000
 22: 0x00000000
 23: 0x00000000
 24: 0x00000000
 25: 0x00000108
 26: 0x00000000
 27: 0x00000000
 28: 0x00000000
 29: 0x00000000
 30: 0x00000000
 31: 0x00000000
 32: 0x00000000
 33: 0x00000108
 34: 0x00000108
 35: 0x00000108
 36: 0x00000108
 37: 0x00000108
 38: 0x00000108
 39: 0x00000000
 40: 0x00000000
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)
 42: 0xff800048 -- timestamp wraparound
 43: 0x8f1f36e4 -- tsc hits
 44: 0x901f36e4
 45: 0x911f36e4
 46: 0x921f36e4
 47: 0x931f36e4
 48: 0x941f36e4
 49: 0x871f36e4
 50: 0x871f36e7
 51: 0x8f1f36e7
 52: 0x901f36e9
 53: 0x911f36e7
 54: 0x921f36e9
 55: 0x931f36e7
 56: 0x941f36e9
 57: 0x904330ac
 58: 0x914330ac
 59: 0x924330ac
 60: 0x934330ac
 61: 0x934330ad
 62: 0x944330ac
 63: 0x944330ad
 64: 0x874330ac
 65: 0x874330ad
 66: 0x8f4330ac
 67: 0x8f4330ad
 68: 0x904330ad
 69: 0x914330ad
 70: 0x924330ad
 71: 0x8f672a62
 72: 0x90672a62
 73: 0x91672a62
 74: 0x92672a62
 75: 0x93672a62
 76: 0x94672a62
 77: 0x87672a62
 78: 0x87672a65
 79: 0x8f672a65
 80: 0x90672a65
 81: 0x91672a65
 82: 0x92672a65
 83: 0x93672a65
 84: 0x94672a65
 85: 0xff000049
 86: 0x878b2422
 87: 0x8f8b2424
 88: 0x908b2424
 89: 0x918b2424
 90: 0x928b2424
 91: 0x938b2424
 92: 0x938b2425
 93: 0x948b2424
 94: 0x948b2427
 95: 0x878b2427
 96: 0x8f8b2427
 97: 0x908b2427
 98: 0x918b2427
 99: 0x928b2427
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.
ReadDataThread read 344 -- next packet
...

TODO

  • DONE July 2022. add FwRev to the UDP data output
  • RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix "write did not happen" (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp "write" packet is lost?
  • PROBLEM GONE Aug 2021. fix reply to wrong socket - udp packets should reply to same socket as they came from, udp data packets should be sent to same socket as requested them, not same socket as last command.
  • DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).
  • DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer
  • DONE Aug 2021. updated maxv firmware. implement FPGA reboot
  • speed up programming the MLU by writing more than 1 bit at a time
  • DONE Nov 2021. add 64-bit bitmap of BSC trigger bits
  • DONE. add chronobox code
  • DONE. add avalon mux for alphag and chronobox packets
  • DONE. add chronobox fifo to udp packet sequencer
  • check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.
  • DONE. test fiber SFP is working
  • complete the UDP flash programmer (parallel flash erase and write)

End

//KO