<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://daq00.triumf.ca/AgWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Olchansk</id>
	<title>AgWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://daq00.triumf.ca/AgWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Olchansk"/>
	<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php/Special:Contributions/Olchansk"/>
	<updated>2026-04-05T11:58:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=985</id>
		<title>Chronobox</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=985"/>
		<updated>2025-03-27T00:45:28Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Initial hardware setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Chronobox =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_software&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/chrono-box/rev0&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware/src/master/docs/Chrono.pdf&lt;br /&gt;
&lt;br /&gt;
= Chronobox connectors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| LEMO - CLK_IN - jumpers: SINE&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;NIM/TTL and NIM&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;TTL&lt;br /&gt;
|&lt;br /&gt;
| ECL P1&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| ECL P2&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| PLED - power-on LED&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank A direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 0-1&lt;br /&gt;
| LED  0-1&lt;br /&gt;
| LEMO 2-3&lt;br /&gt;
| LED  2-3&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank B direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 4-5&lt;br /&gt;
| LED  4-5&lt;br /&gt;
| LEMO 6-7&lt;br /&gt;
| LED  6-7&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Electrical connections =&lt;br /&gt;
&lt;br /&gt;
* ECL P1 and P2: LeCroy 4616 compatible&lt;br /&gt;
* LEMO TTL inputs: 0..5V, logic level 0: &amp;lt;0.8V, logic level 1: &amp;gt;2V&lt;br /&gt;
* LEMO TTL outputs: logic level 0: 0V, logic level 1: 5V to 3.3V&lt;br /&gt;
* clock NIM input: NIM compatible&lt;br /&gt;
* clock TTL input: ???&lt;br /&gt;
* clock sine wave input: ???&lt;br /&gt;
&lt;br /&gt;
= Input channel mapping =&lt;br /&gt;
&lt;br /&gt;
* 0+16 : first ECL connector&lt;br /&gt;
* 16+16 : second ECL connector&lt;br /&gt;
* 32+8 : LEMO inputs (TTL)&lt;br /&gt;
* 40+18 : GPIO inputs (FPGA pins)&lt;br /&gt;
* 58 : external clock (10 MHz nominal)&lt;br /&gt;
* 59 : internal clock (100 MHz)&lt;br /&gt;
&lt;br /&gt;
= Functional units =&lt;br /&gt;
&lt;br /&gt;
== Scalers ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 10 ns (15 ns is safe) (sampled by 100 MHz/ 10 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 10 ns (15 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (2 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): 25 ns or more is safe&lt;br /&gt;
&lt;br /&gt;
== Timestamps (TSC) ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 100 ns (105 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 100 ns (105 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (5 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 200 ns (205 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
&lt;br /&gt;
Each TSC input has a 256 entry FIFO. (LE is 1 entry, TE is 1 entry, so 128 hits if both LE and TE enabled).&lt;br /&gt;
&lt;br /&gt;
== Output data fifo ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware before 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 4096 entries deep.&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 64k entries deep.&lt;br /&gt;
&lt;br /&gt;
= Initial hardware setup =&lt;br /&gt;
&lt;br /&gt;
* refer to DE10-NANO information here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* prepare hardware:&lt;br /&gt;
** remove chronobox from enclosure (cannot access JTAG connector when installed)&lt;br /&gt;
** remove DE10-Nano from chronobox baseboard&lt;br /&gt;
** check that SW10 jumpers are: U-D-U-U-D-U. (U=up, D=down, when &amp;quot;ALTERA&amp;quot; text on the FPGA is right side up)&lt;br /&gt;
** reinstall DE10-Nano on chronobox baseboard&lt;br /&gt;
** do NOT reinstall chronobox in enclosure&lt;br /&gt;
* prepare software:&lt;br /&gt;
** check that you have quartus 17.1 (at /opt/intelFPGA/17.1/ in this example)&lt;br /&gt;
** check that you installed chronobox software in /home/agdaq/online/chronobox_software&lt;br /&gt;
** check that you installed chronobox firmware project in /home/agdaq/online/firmware/git/chronobox_firmware&lt;br /&gt;
* connect serial console, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#Serial_console&lt;br /&gt;
** connect a mini-USB (*not* Micto-USB!) cable from mini-USB port on the side of the ethernet connection to a PC&lt;br /&gt;
** minicom -D /dev/ttyUSB0 -b 115200&lt;br /&gt;
* connect fpga jtag, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** connect a mini-USB (*not* Micro-USB!) cable on the side of HDMI and power connectors to a PC&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/jtagconfig&lt;br /&gt;
* prepare SD flash card for booting from network: generic instructions are here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_SD_flash&lt;br /&gt;
** connect new or used 8GB SD flash card to USB flash adapter to a linux computer&lt;br /&gt;
** login as root&lt;br /&gt;
** identify the flash device as /dev/sdX. Use &amp;quot;lsblk&amp;quot; or &amp;quot;blkid&amp;quot; or &amp;quot;dmesg&amp;quot;. be careful to not write to the computer system disk (usually /dev/sda)&lt;br /&gt;
** echo -e &#039;o\nn\np\n1\n2048\n4095\nn\np\n2\n4096\n1681816\nn\np\n3\n\n\nt\n1\na2\nt\n2\nb\nw&#039; | fdisk /dev/sdX&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
** remove card, reintall card, this is to ensure we use the new partition table&lt;br /&gt;
** fdisk -l /dev/sdX&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# fdisk -l /dev/sdg&lt;br /&gt;
Disk /dev/sdg: 7.38 GiB, 7910457344 bytes, 15450112 sectors&lt;br /&gt;
Disk model: STORAGE DEVICE  &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0xa033868b&lt;br /&gt;
&lt;br /&gt;
Device     Boot   Start      End  Sectors   Size Id Type&lt;br /&gt;
/dev/sdg1          2048     4095     2048     1M a2 unknown&lt;br /&gt;
/dev/sdg2          4096  1681816  1677721 819.2M  b W95 FAT32&lt;br /&gt;
/dev/sdg3       1683456 15450111 13766656   6.6G 83 Linux&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-1-fpga.img of=/dev/sdX1  bs=1024k&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-2-uboot.img of=/dev/sdX2  bs=1024k&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
* install prepared flash card into the chronobox DE10-Nano&lt;br /&gt;
* cycle power&lt;br /&gt;
* in the minicom window, IMMEDIATELY press the space bar to stop automatic booting (if it doesn&#039;t react, ensure flow control is disabled in minicom)&lt;br /&gt;
* you will have the uboot &amp;quot;=&amp;gt;&amp;quot; prompt&lt;br /&gt;
* confirm uboot version: U-Boot 2013.01.01&lt;br /&gt;
* setup uboot to boot linux from network, more details here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_network&lt;br /&gt;
** setenv ethaddr 02:aa:bb:cc:cb:04 # for cb04, see below for explanation&lt;br /&gt;
** setenv bootcmd &#039;run bridge_enable_handoff; run netboot&#039;&lt;br /&gt;
** setenv ramboot bootz \${loadaddr} - \${fdtaddr}&lt;br /&gt;
** setenv bootargs console=ttyS0,115200 ip=dhcp root=/dev/nfs rw nfsroot=192.168.1.1:/nfsroot/%s,vers=3,nolock,proto=tcp panic=15&lt;br /&gt;
** saveenv&lt;br /&gt;
** reset&lt;br /&gt;
* DE10-Nano should boot into linux:&lt;br /&gt;
** uboot will restart&lt;br /&gt;
** DHCP will run&lt;br /&gt;
** tftp load of linux kernel will run&lt;br /&gt;
** linux kernel will start&lt;br /&gt;
** linux kernel will get an IP address&lt;br /&gt;
** linux kernel will NFS-mount the root filesystem (.../nfsroot/cb04)&lt;br /&gt;
** systemd will start all services&lt;br /&gt;
** there will be a login prompt on minicom console&lt;br /&gt;
** ssh will work (maybe 1 minute delay before it starts)&lt;br /&gt;
* try a few things:&lt;br /&gt;
** from agdaq or agmini account, ssh root@cb04&lt;br /&gt;
** &amp;quot;df&amp;quot; should show /home/agdaq is mounted (and ssh agdaq@cb04 should work)&lt;br /&gt;
** &amp;quot;/home/agdaq/online/chronobox_software/test_cb.exe 0&amp;quot; should fail (&amp;quot;bus error&amp;quot;) because FPGA is not loaded yet&lt;br /&gt;
* load sof file, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/quartus_pgm -m JTAG -o &amp;quot;p;/home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD.sof@2&amp;quot;&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should work now&lt;br /&gt;
* use srunner_cb.exe to load the pof file into FPGA boot flash&lt;br /&gt;
* use reboot_cb.exe to reboot the FPGA from flash&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should report the expected FPGA firmware version number.&lt;br /&gt;
* success.&lt;br /&gt;
&lt;br /&gt;
== assign ethernet MAC address ==&lt;br /&gt;
&lt;br /&gt;
Usually ethernet MAC address is assigned by manufacturer and is stored in a tiny little flash chip. The DE10-Nano board&lt;br /&gt;
is too cheap and does not have it. So a fake ethernet address has to be assigned manually from&lt;br /&gt;
the &amp;quot;locally administered range&amp;quot; of MAC addresses that start from &amp;quot;02:...&amp;quot;, see&lt;br /&gt;
https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses&lt;br /&gt;
&lt;br /&gt;
All MAC addresses must be unique on an ethernet network, but with manual assignement confusion is easy to create.&lt;br /&gt;
&lt;br /&gt;
For chronobox devices, use MAC addresses that start with &amp;quot;l02:aa:bb:cc:xx:yy&amp;quot; and have last digits &amp;quot;cb:01&amp;quot;, &amp;quot;cb:02&amp;quot;, &amp;quot;cb:03&amp;quot;, &amp;quot;cb04&amp;quot; for the first four chronoboxes.&lt;br /&gt;
&lt;br /&gt;
== new board test checklist ==&lt;br /&gt;
&lt;br /&gt;
to check newly built chronobox baseboard, follow this checklist.&lt;br /&gt;
&lt;br /&gt;
=== test ECL inputs ===&lt;br /&gt;
&lt;br /&gt;
* stop midas frontend&lt;br /&gt;
* ssh agdaq@alphagdaq ### or agmini@daq16&lt;br /&gt;
* ssh root@cb03&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe 0 ### read firmware revision, confirm communication with chronobox firmware&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### output should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xe0, gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect ECL ribbon cable from LeCroy 4616 NIM-to-ECL converter to chronobox ECL_P1 input (left one)&lt;br /&gt;
* ecl_p1 input should read 0x0000&lt;br /&gt;
* connect lemo jumper from NIM logic level 1 otput (i.e. any module OUT-bar output) to first channel of LeCroy 4616, ecl_p1 should read 0x0001&lt;br /&gt;
* move to 2nd channel, get 0x0002&lt;br /&gt;
* and so forth until last channel 0x8000.&lt;br /&gt;
* if any channel does not give expected reading, attach label (i.e. &amp;quot;ECL_P1 0x0002 bad&amp;quot;) and send for repair.&lt;br /&gt;
* repeat with ECL_P2 input (right one), watch printed value of ecl_p2.&lt;br /&gt;
&lt;br /&gt;
=== test TTL inputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in [[#Chronobox connectors]]&lt;br /&gt;
* disconnect all LEMO inputs&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_a # set bank A to input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_b # set bank B to input&lt;br /&gt;
* all 8 LEMO LEDs should be on&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### lemo inputs should read 0xFF&lt;br /&gt;
* connect LEMO 0 (left bottom) to TTL output of Lecroy 222 or equivalent, set &amp;quot;scale&amp;quot; to &amp;quot;latch&amp;quot;, operate push buttons to turn output on and off (LED should come in and out).&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xfe (~0x01), gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* change TTL signal from logic level 0 to 1 and back, observe the corresponding LED to turn on and off, observe the correct bit in the &amp;quot;lemo&amp;quot; column (watch the inverted input ~0x01) change.&lt;br /&gt;
* repeat with LEMO input 1 (left top) through 7 (right top).&lt;br /&gt;
&lt;br /&gt;
=== test TTL outputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in #Chronobox connectors&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for output&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0&lt;br /&gt;
* all LEMO LEDs should be off&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 0.135 V&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0xF&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0xF&lt;br /&gt;
* all LEMO LEDs should be on&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 3.4 to 3.8 V&lt;br /&gt;
* if you measure 1.69 V, the bank direction switch is still in the &amp;quot;input&amp;quot; position&lt;br /&gt;
* to test individual output, instead of 0xF use 0x1, 0x2, 0x4 and 0x8.&lt;br /&gt;
&lt;br /&gt;
=== test clock input ===&lt;br /&gt;
&lt;br /&gt;
* we test the TTL input mode first&lt;br /&gt;
* disconnect CLK_IN input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe intclk ### switch to internal timestamp clock&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00000000, freq 0.0 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0xa0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
notice: ts_clk frequency is around 10 MHz (internal oscillator) and ext_clk frequency is zero (nothing connected)&lt;br /&gt;
* if ts_clk is not around 10 MHz, PLL is not locked correctly, reboot the FPGA and try again: /home/agdaq/online/chronobox_software/test_cb.exe reboot&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;TTL&amp;quot; position&lt;br /&gt;
* connect LEMO cable from LEMO output 0 (bottom left) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_clk 0 ### output timestamp clock on LEMO output 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00cccccc, freq 9999999.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is the same as ts_clk frequency&lt;br /&gt;
* to test NIM input mode, we need a NIM clock signal, i.e. from a VME-NIMIO32, etc. Or use a TTL-to-NIM converter to use clock on LEMO output 0.&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;NIM&amp;quot; position&lt;br /&gt;
* connect VME-NIMIO32 NIM output 3 (40 MHz V1190 clock) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x03333c0c, freq 40001687.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is 40 MHz.&lt;br /&gt;
* to test &amp;quot;sine wave&amp;quot; input mode, TBW, do not have a sine wave signal source.&lt;br /&gt;
&lt;br /&gt;
K.O.&lt;br /&gt;
&lt;br /&gt;
=== test GPIO pins ===&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
= Install chronobox software =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_software.git&lt;br /&gt;
cd chronobox_software&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
ls -l *.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 18808 Aug 16 15:26 reboot_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 47256 Aug 16 15:26 srunner_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 20732 Aug 16 15:26 test_cb.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install chronobox quartus firmware project =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/firmware/git&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
git fetch ### update repository&lt;br /&gt;
git tag ### list available tags&lt;br /&gt;
git checkout 20210420_ko ### checkout a specific version&lt;br /&gt;
git status&lt;br /&gt;
cat timestamp.v ### confirm firmware version&lt;br /&gt;
ls -l output_files/*.{jic,sof,rpd}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5aceaed2 - April 2018 - all inputs connected to counters (except ext clock), 58 inputs, 50 MHz clock&lt;br /&gt;
* 0x5b6de806 - August 2018 - added fpga boot flash programmer and fpga reboot&lt;br /&gt;
* 0x5b7c827d - August 2018 - bshaw added debounce on GPIO inputs (for flow meters), 100 MHz clock&lt;br /&gt;
* 0x5b873169 - August 2018 - rebuilt, no changes&lt;br /&gt;
* 0x5b89e4b4 - August 2018 - added external clock signal, 59 inputs, 100 MHz clock&lt;br /&gt;
* 0x5b8de2b0 - September 2018 - added data fifo and timestamp counters (TSCs) for the first 4 inputs&lt;br /&gt;
* 0x5b906c56 - September 2018 - improved overflow markers, added scalers readout into the data fifo&lt;br /&gt;
* 0x5da8e4c2 - October 2019 - timestamps for all inputs, inversion of inputs&lt;br /&gt;
* 0x5db764a7 - October 2019 - FPGA reboot works now.&lt;br /&gt;
* 0x607f6709 - April 2021 - working timestamp synchronization, memory mapped registers, improved sdc file, correct clock transfers&lt;br /&gt;
* 0x60860e61 - April 2021 - faster data FIFO readout (from ~8 Mbytes/sec to ~80 Mbytes/sec)&lt;br /&gt;
* 0x61832695 - Nov 2021 - increase timestamp FIFO from 4k to 64k words&lt;br /&gt;
* 20220406_ko_0x624e22ad - April 2022 - make inputs edge-triggered instead of sampled.&lt;br /&gt;
* 20220420_ko_0x62608957 - April 2022 - fix first fifo data word is zero&lt;br /&gt;
&lt;br /&gt;
= Firmware update =&lt;br /&gt;
&lt;br /&gt;
* use srunner_cb.exe to load firmware RPD file into EPCQ flash memory.&lt;br /&gt;
* if FPGA is not running compatible firmware, srunner_cb will fail&lt;br /&gt;
* connect JTAG and load the firmware sof file from the quartus project (use &amp;quot;make load_sof&amp;quot;)&lt;br /&gt;
* if JTAG is connected, one can use &amp;quot;make load_jic&amp;quot; to load firmware jic file into EPCQ flash memory.&lt;br /&gt;
&lt;br /&gt;
After correct firmware is loaded, access to chronobox registers may fail (srunner_cb will not work)&lt;br /&gt;
because FPGA bridges are not enabled. To check, run following commands. If some bridge reports &amp;quot;disabled&amp;quot;, reboot linux (do not cycle the power!).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb02:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb02:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some DE10-Nano boards have an EPCQ64 flash memory chip, some have the EPCQ128 flash memory chip.&lt;br /&gt;
* identify EPCQ64 and use &amp;quot;-64&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x16 &lt;br /&gt;
Info: Serial Configuration Device - EPCS64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify EPCQ128 and use &amp;quot;-128&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x18 &lt;br /&gt;
Info: Serial Configuration Device - EPCS128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify -64 or -128 flash memory, write RPD file to flash memory, verify and reboot the fpga:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
#./srunner_cb.exe -read -128 test.rpd # read flash contents into a file&lt;br /&gt;
./srunner_cb.exe -program -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./srunner_cb.exe -verify -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./reboot_cb.exe # reboot the fpga into the new firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
for building firmware use: /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh daq01&lt;br /&gt;
cd online&lt;br /&gt;
git clone git@bitbucket.org:expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
/opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
make quartus&lt;br /&gt;
ls -l output_files/*.{sof,jic,rpd}&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7007185 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 olchansk users 8388833 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.jic&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7510701 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.sof&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
other make targets:&lt;br /&gt;
* make quartus - build fpga programmer files: sof, jic and rpd.&lt;br /&gt;
* make clean - clean the quartus project&lt;br /&gt;
* make qsys - regenerate the qsys block&lt;br /&gt;
* make jic - regenerate the jic file&lt;br /&gt;
* make load_sof - load sof file into fpga via jtag&lt;br /&gt;
* make load_jic - load jic file into fpga boot flash (epcq) via jtag&lt;br /&gt;
* make verify_jic - verify jic checksum in fpga boot flash (epcq)&lt;br /&gt;
&lt;br /&gt;
for jtag access, use /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq16:chronobox_firmware$ /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
1) DE-SoC [2-1.4.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) Remote server daq16: Unable to connect&lt;br /&gt;
&lt;br /&gt;
daq16:chronobox_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
* after regenerating qsys, manually edit ./soc_system/synthesis/submodules/hps_sdram_pll.sv to comment-out line &amp;quot;assign pll_dr_clk = clk_out[2];&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Firmware details =&lt;br /&gt;
&lt;br /&gt;
* DDR3 clock is 400 MHz (DDR3-800)&lt;br /&gt;
* memcpy speed ~1500 Mbytes/sec&lt;br /&gt;
* FIFO access single word read: 80, 44, 44 clocks at 10 ns/clock is 2.3 MHz at 4 bytes/word is 9 Mbytes/sec&lt;br /&gt;
* FIFO access memcpy: burst 2, delay 32, b4, delay 36, b5, d1, b5, d1, b5, d1, b1, delay 53, repeat. this reads 16 words in 72 clocks at 10 ns/clock is 1.388 MHz at 4*16=64 bytes/burst is 88.9 Mbytes/sec.&lt;br /&gt;
&lt;br /&gt;
= Chronobox firmware registers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0 | ro | sof_revision_in | all | firmware revision timestamp code&lt;br /&gt;
0 | wo | latch_scalers_out, zero_scalers_out | all | see [[#reg_0x00_write_bits]]&lt;br /&gt;
1 | rw | reg1_led_out | all | DE10-Nano LED output&lt;br /&gt;
2 | ro | switches_in | all | read DE10-Nano switches&lt;br /&gt;
3 | ro | buttons_in | all | read DE10-Nano buttons&lt;br /&gt;
4 | rw | reg4_test | all | 32-bit read-write test register&lt;br /&gt;
5 | rw | flash_programmer_in, reg5_flash_programmer_out | 0x5b6de806 | 0xABCD srunner flash programmer&lt;br /&gt;
6 | ro | ecl_in | all | read state of ECL inputs&lt;br /&gt;
7 | ro | reg7_test_in | all | ???&lt;br /&gt;
8 | rw | scaler_addr_out, reg8_scaler_data_in | all | top 16 bits of address becomes scaler bus address, 32 bit read is the corresponding scaler data&lt;br /&gt;
9 | ro | lemo_in | all | read state of LEMO inputs&lt;br /&gt;
10/0xA | ro | gpio_in | all | read state of GPIO inputs&lt;br /&gt;
11/0xB | rw | regB_lemo_out | all | LEMO output data&lt;br /&gt;
12/0xC | rw | regC_gpio_out | all | GPIO output data&lt;br /&gt;
13/0xD | rw | regD_out_enable_out | all | enable output tristates: [31:24] - LEMO_OUT, [17:0] - GPIO_OUT&lt;br /&gt;
14/0xE | rw | regE, reconfig_out | 0x5b6de806 | FPGA reboot: write inverted firmware revision (reg0) to reboot the FPGA&lt;br /&gt;
15/0xF | ro | regF_input_num_in | 0x5b89e4b4 | number of chronobox inputs (to read scalers, add 1 for the clock counter)&lt;br /&gt;
16/0x10 | ro | reg10_fifo_status | 0x5b8de2b0 | data fifo status, see below&lt;br /&gt;
17/0x11 | ro | reg11_fifo_data | 0x5b8de2b0 | data fifo data, see below&lt;br /&gt;
18/0x12 | rw | cb_invert_a | 0x5bf7557e | invert inputs 31..0&lt;br /&gt;
19/0x13 | rw | cb_invert_b | 0x5bf7557e | invert inputs 63..32&lt;br /&gt;
20/0x14 | rw | cb_enable_le_a | 0x5bf7557e | enable TSC leading edge inputs 31..0&lt;br /&gt;
21/0x15 | rw | cb_enable_le_b | 0x5bf7557e | enable TSC leading edge inputs 63..32&lt;br /&gt;
22/0x16 | rw | cb_enable_te_a | 0x5bf7557e | enable TSC trailing edge inputs 31..0&lt;br /&gt;
23/0x17 | rw | cb_enable_te_b | 0x5bf7557e | enable TSC trailing edge inputs 63..32&lt;br /&gt;
24/0x18 | ro | fc_ext_clk_100_counter | 0x5bf7557e | external clock frequency counter 100MHz reference&lt;br /&gt;
25/0x19 | ro | fc_ext_clk_ext_counter | 0x5bf7557e | external clock frequency counter&lt;br /&gt;
26/0x1A | ro | fc_ts_clk_100_counter | 0x5bf7557e | timestamp clock frequency counter 100MHz reference&lt;br /&gt;
27/0x1B | ro | fc_ts_clk_ts_counter | 0x5bf7557e | timestamp clock frequency counter&lt;br /&gt;
28/0x1C | ro | ts_clk_pll_status | 0x5bf7557e | timestamp clock PLL status&lt;br /&gt;
29/0x1D | rw | cb_lemo_out_mux_ctrl | 0x5bfdc798 | 8*4 bits to control 8 LEMO output multiplexers (4 bits/16 options each mux, see [[#LEMO outputs]])&lt;br /&gt;
30/0x1E | rw | cb_sync_mask[31:0] | 0x607f6709 | source of chronobox sync signal, low bits&lt;br /&gt;
31/0x1F | rw | cb_sync_mask[63:32] | 0x607f6709 | source of chronobox sync signal, high bits&lt;br /&gt;
32 | rw | cb_sync_reg[31:0], cb_sync_status[31:0] | 0x607f6709 | control of timestamp sync&lt;br /&gt;
33 | ro | tdc_fifo_status | DLTDC | TDC fifo status&lt;br /&gt;
34 | ro | tdc_fifo_data_lo | DLTDC | TDC fifo low 32-bits&lt;br /&gt;
35 | ro | tdc_fifo_data_hi | DLTDC | TDC fifo high 32-bits and fifo rdack&lt;br /&gt;
36 | rw | dl_input_mask | DLTDC | DL trigger input mask&lt;br /&gt;
37 | rw | dl_ctrl       | DLTDC | DL trigger control&lt;br /&gt;
38 | rw | tdc_input_mask | DLTDC | TDC input mask&lt;br /&gt;
39 | ro | axi_fifo_status | DLTDC | AXI fifo status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 0x00 write bits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | fw revision | quartus signal | description&lt;br /&gt;
0 | all | | latch scalers&lt;br /&gt;
1 | all | | zero scalers&lt;br /&gt;
2 | ... | fifo_rdreq_out | fifo_rdreq_out (not used in version 0x607f6709 and later)&lt;br /&gt;
3 | ... | ts_clk_pll_extswitch_out | clear ts_clk_pll_extswitch_out&lt;br /&gt;
4 | ... | ts_clk_pll_extswitch_out | set ts_clk_pll_extswitch_out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 16 fifo status ==&lt;br /&gt;
&lt;br /&gt;
Data fifo status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31: fifo_full - data fifo is current full&lt;br /&gt;
30: fifo_empty - data fifo is currently empty&lt;br /&gt;
29: cb_fifo_ch_full - TSC per-channel fifos have overflown at some point&lt;br /&gt;
28: fifo_full_latch - data fifo has overflown at some point&lt;br /&gt;
24+4: 0&lt;br /&gt;
0+24: fifo_usedw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 28 ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock PLL status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : PLL locked&lt;br /&gt;
30 : PLL active clock (0=internal, 1=external&lt;br /&gt;
29 : external clock bad&lt;br /&gt;
28 : internal clock bad&lt;br /&gt;
27 : ts_clk_pll_extswitch&lt;br /&gt;
0..26 : not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 32 timestamp sync ==&lt;br /&gt;
&lt;br /&gt;
Timestamp synchronization register bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : write 1 to arm timestamp sync circuit, scalers and TSCs are placed in reset state&lt;br /&gt;
30 : write 1 to disarm timestamp sync circuit, reset is released&lt;br /&gt;
...&lt;br /&gt;
16 : write 1 to send a timestamp sync signal&lt;br /&gt;
15 : sync circuit armed&lt;br /&gt;
14 : sync done&lt;br /&gt;
13 : sync signal received (cleared by writing bits 31 or 30)&lt;br /&gt;
12 : 0&lt;br /&gt;
11 : sync circuit armed, clk_ts section&lt;br /&gt;
10 : sync done, clk_ts section&lt;br /&gt;
9  : sync signal received, clk_ts section&lt;br /&gt;
8  : 0&lt;br /&gt;
7  : unused&lt;br /&gt;
...&lt;br /&gt;
0  : unused&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nominal sequence for synchronizing timestamps:&lt;br /&gt;
* make sure nothing is sending the external sync signal (i.e. run is stopped, etc)&lt;br /&gt;
* arm the sync circuit: cb_write32(32, 0x80000000); cb_write32(32, 0);&lt;br /&gt;
* check that the arming was successful: cb_read32(32), only bits 0x8800 should be set&lt;br /&gt;
* scalers are in reset state, not incrementing&lt;br /&gt;
* TSCs are in reset state, no data in the TSC FIFO&lt;br /&gt;
* some time later, send the external sync signal&lt;br /&gt;
* or send the internal sync signal: cb_write32(32, 0x10000); cb_write32(32, 0);&lt;br /&gt;
* check that the timestamp reset happened: cb_read32(32), bits 0x6600 should be set, bits 0x8800 should be cleared&lt;br /&gt;
* check that the scalers are counting, check that there is TSC data in the TSC FIFO&lt;br /&gt;
&lt;br /&gt;
== reg 33, 39 TDC and AXI FIFO status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bit |   mask     | description&lt;br /&gt;
  31 | 0x80000000 | fifo empty&lt;br /&gt;
  30 | 0x40000000 | fifo full&lt;br /&gt;
15:0 | 0x0000FFFF | fifo usedw (64-bit words)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timestamp clock ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock is 10 MHz selectable from internal oscillator or external reference on the CLK_IN input.&lt;br /&gt;
&lt;br /&gt;
CLK_IN input can be selected using 2 two-position jumpers:&lt;br /&gt;
* NIM input: CLK&amp;lt;-&amp;gt;NIM/TTL and CLK&amp;lt;-&amp;gt;NIM&lt;br /&gt;
&lt;br /&gt;
To select the clock from command line, use:&lt;br /&gt;
* test_cb.exe intclk # select internal clock&lt;br /&gt;
* test_cb.exe extclk # select external clock&lt;br /&gt;
&lt;br /&gt;
From software:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Chronobox* cb = ...;&lt;br /&gt;
cb-&amp;gt;cb_int_clock(); # select internal clock&lt;br /&gt;
cb-&amp;gt;cb_ext_clock(); # select external clock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see current status, run &amp;quot;test_cb.exe clocks&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./test_cb.exe clocks&lt;br /&gt;
...&lt;br /&gt;
Chronobox firmware revision: 0x5bf7557e&lt;br /&gt;
...&lt;br /&gt;
clock status: ext_clk: counter 0x00cccf2a, freq 10000450.9 Hz, ts_clk: counter 0x00cccf2a, freq 10000450.9 Hz, PLL status 0xc0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reported is external clock frequency, currently selected timestamp clock frequency and PLL status (register 0x1C).&lt;br /&gt;
&lt;br /&gt;
Normal values for the PLL status:&lt;br /&gt;
* internal clock: 0x80000000&lt;br /&gt;
* external clock: 0xC0000000&lt;br /&gt;
* external clock selected, but invalid: 0x60000000&lt;br /&gt;
* internal clock selected, external clock invalid: 0xa0000000&lt;br /&gt;
&lt;br /&gt;
Disconnected/absent/broken external clock will report ext_clk frequency zero, bit 0x20000000 in the PLL status register 0x1C.&lt;br /&gt;
&lt;br /&gt;
If external clock is CDM, set chronobox clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;NIM&amp;quot;, use CDM 10 MHz clock output LEMO3B.&lt;br /&gt;
&lt;br /&gt;
If external clock is another chronobox (usually LEMO output 0), set clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;TTL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== LEMO outputs ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors can be used as TTL level outputs:&lt;br /&gt;
&lt;br /&gt;
* set the &amp;quot;bank a&amp;quot; and/or &amp;quot;bank b&amp;quot; jumpers for &amp;quot;output&amp;quot;&lt;br /&gt;
* set the lemo output multiplexor bits in register 0x1D&lt;br /&gt;
* set the &amp;quot;lemo output enable&amp;quot; bit in register 0x0D, use bits 24..31 for LEMO outputs 0..7.&lt;br /&gt;
* observe the corresponding LED is on or off according to the LEMO output TTL logic level&lt;br /&gt;
&lt;br /&gt;
The function of each LEMO output is controlled by the lemo output multiplexor. Up to 16 different&lt;br /&gt;
signals can be routed into each output. This is controlled by register 0x1D.&lt;br /&gt;
&lt;br /&gt;
Register 0x1D multiplexor control is 32 bits organized into 8 groups of 4 bits, per each of the 8 LEMO outputs: 0x76543210,&lt;br /&gt;
i.e. value 0x00000001 routes signal function 1 into output 0, and signal function 0 into outputs 1..7.&lt;br /&gt;
&lt;br /&gt;
For each output, there are 16 possible signal functions (4 bits):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | firmware signal | firmware revision | signal description&lt;br /&gt;
0 | cb_lemo_out_reg[n] | 0x5bfdc798 | output is controlled by register 0xB bits 0..7 for outputs 0..7&lt;br /&gt;
1 | clk_ts | 0x5bfdc798 | output is the 10MHz timestamp clock&lt;br /&gt;
2 | cb_sync_in_clk_ts | 0x607f6709 | daisy-chained timestamp sync signal (from control register or from sync input, see registers 30 and 31. see bit 0x10000 in register 32)&lt;br /&gt;
3..30 | gnd | 0x5bfdc798 | not used&lt;br /&gt;
31 | vcc | 0x5bfdc798 | logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== front panel LEDs ==&lt;br /&gt;
&lt;br /&gt;
The front panel LEDs are numbered 0..7 per [[#Chronobox_connectors]]&lt;br /&gt;
&lt;br /&gt;
Each LED can be individually lit by setting a bit in register 0x1 bits 8..15.&lt;br /&gt;
&lt;br /&gt;
If LEMO outputs are active, corresponding LEDs will show LEMO output status (logic level 1 -&amp;gt; LED is on, logic level 0 -&amp;gt; LED is off).&lt;br /&gt;
&lt;br /&gt;
If LEMO inputs are active ...&lt;br /&gt;
&lt;br /&gt;
== Synchronization of multiple chronoboxes ==&lt;br /&gt;
&lt;br /&gt;
To operate several chronoboxes as one unit, they must have two common signals, a clock and a sync signal.&lt;br /&gt;
&lt;br /&gt;
Each chronobox must be configured as:&lt;br /&gt;
* master: this will issue the sync signal&lt;br /&gt;
* slave: will receive the clock and sync signals from master&lt;br /&gt;
* slave daisy-chain: and pass them to the next slave down the chain&lt;br /&gt;
* (one can use the CDM or the TRG as sync masters)&lt;br /&gt;
&lt;br /&gt;
For the purpose of this example (recommended configuration), set the LEMO direction jumpers:&lt;br /&gt;
* bank A: set to &amp;quot;out&amp;quot;: master and slave daisy-chain clock and sync output&lt;br /&gt;
* bank B: set to &amp;quot;in&amp;quot;: slave sync input&lt;br /&gt;
&lt;br /&gt;
Clock connections:&lt;br /&gt;
* sync master can be configured with external or internal clock (CLK_IN input)&lt;br /&gt;
* sync slave must be configured with external clock (CLK_IN input)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #0 -&amp;gt; slave CLK_IN, LEMO #0 -&amp;gt; next slave CLK_IN, LEMO #0 -&amp;gt; ...&lt;br /&gt;
10 MHz clock from CDM &amp;amp; etc -&amp;gt; sync master CLK_IN, LEMO #0 -&amp;gt; slave CLK_IN, ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync connections:&lt;br /&gt;
* sync signal can be generated externally by the CDM or TRG&lt;br /&gt;
* sync signal can be generated internally by writing 0x10000 into reg 32 of sync master&lt;br /&gt;
* (sync must be armed on the master and all slaves before sending the first sync signal, write 0x80000000 into reg 32)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #1 -&amp;gt; slave LEMO #4, LEMO #1 -&amp;gt; next slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
external sync -&amp;gt; master LEMO #4, LEMO #1 -&amp;gt; slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync configuration: (see register 32 for explanation!)&lt;br /&gt;
* master and slave: disarm sync: write 0x40000000 to reg 32, write 0 to reg 32, bits 0x8800 and 0x6600 should clear&lt;br /&gt;
* master and slave daisy chain: setup clock and sync outputs:&lt;br /&gt;
** register 29 lemo output mux to 0xXXXX&#039;XX21 (2=output sync signal, 1=output clock)&lt;br /&gt;
** register 13 lemo output enable, set bits 0x0F00&#039;0000 (set bank A jumper for &amp;quot;out&amp;quot;)&lt;br /&gt;
* slave and slave daisy chain: enable external sync from LEMO #4:&lt;br /&gt;
** register 30, write 0&lt;br /&gt;
** register 31, write 0x10&lt;br /&gt;
* master: switch to external or internal clock, as needed&lt;br /&gt;
* slave: switch to external clock&lt;br /&gt;
* master and slave: arm sync: write 0x80000000 to reg 32, write 0 to reg 32, bits 0x8800 should turn on.&lt;br /&gt;
* timestamps, scalers and data fifo go into the reset state, all old data is cleared&lt;br /&gt;
* when sync is received, timestamp is reset to zero, reset state is cleared and there should be data into FIFO. reg 32 will read 0x6600.&lt;br /&gt;
* if using external sync (no master), wait for reg 32 bits to become 0x6600 (sync completed)&lt;br /&gt;
* master: issue sync signal, write 0x10000 to reg 32, write 0 to reg 32. master reg 32 should read 0x6600, slave reg 32 should read 0x6600.&lt;br /&gt;
&lt;br /&gt;
== FIFO data format ==&lt;br /&gt;
&lt;br /&gt;
* 0x8ntttttt: TSC data, 24 bits &amp;quot;tttttt&amp;quot; of timestamp, 7 bits &amp;quot;nn&amp;quot; of channel number, top bit set to 1. Low bit of &amp;quot;t&amp;quot; indicates 0=leading edge, 1=trailing edge.&lt;br /&gt;
* 0xffTTmmmm: (before 20220420_ko_0x62608957) timestamp wrap around marker: &amp;quot;TT&amp;quot; is the top 8 bits of the timestamp, &amp;quot;mmmm&amp;quot; is a 16 bit counter&lt;br /&gt;
* 0xff8mmmmm: timestamp wrap around marker: bit 24 is the top bit of the timestamp (0/8), &amp;quot;mmmmm&amp;quot; is a 23 bit counter&lt;br /&gt;
* 0xfe00nnnn: scaler data, following &amp;quot;nnnn&amp;quot; words are the latched scalers&lt;br /&gt;
* 0xfd000000: start of data after chronobox sync (cbtrg only, for now)&lt;br /&gt;
&lt;br /&gt;
Time range is (before 20220420_ko_0x62608957):&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 15 bits of &amp;quot;mmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x00007FFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$22 = 15.270527886249999 ### in hours&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Time range is:&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 22 bits of &amp;quot;mmmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x003FFFFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$2 = 1954.6867557262499 ### in hours&lt;br /&gt;
$3 = 81.445281488593736 ### in days&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== timestamp wrap around marker ==&lt;br /&gt;
&lt;br /&gt;
The timestamp data is only 24 bits, to allow timestamping&lt;br /&gt;
with longer time range, wrap around markers are added to the&lt;br /&gt;
data stream.&lt;br /&gt;
&lt;br /&gt;
For input signals that arrive close to the time of timestamp wrap around,&lt;br /&gt;
there is ambiguity in the ordering of the data fifo: does the wrap around&lt;br /&gt;
marker or the signal timestamp show up first? For example for rare&lt;br /&gt;
signals, one can see this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1&lt;br /&gt;
wrap 2&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3&lt;br /&gt;
wrap 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
does the hit belong with wrap marker 2 (written to the fifo just after wrap marker 2)&lt;br /&gt;
or with marker 3 (written to the fifo just before wrap marker 3)?&lt;br /&gt;
&lt;br /&gt;
To remove this ambiguity, additional markers are written to the data stream&lt;br /&gt;
half way between the wrap arounds, making it obvious that the signal&lt;br /&gt;
arrived right after wrap marker 3 (but was written to the FIFO before the marker):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1 0x00&lt;br /&gt;
wrap 1 0x80&lt;br /&gt;
wrap 2 0x00&lt;br /&gt;
wrap 2 0x80&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3 0x00&lt;br /&gt;
wrap 3 0x80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= test_cb.exe =&lt;br /&gt;
&lt;br /&gt;
test_cb.exe is the general test program for the chronobox.&lt;br /&gt;
&lt;br /&gt;
* test_cb.exe 0 # read chronobox register 0&lt;br /&gt;
* test_cb.exe 4 0x1234 # write to chronobox register 4&lt;br /&gt;
* test_cb.exe fpga 0 # read FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe fpga 0 0x12345678 # write 0x12345678 to FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe reboot # reboot the FPGA (the ARM CPU keeps running)&lt;br /&gt;
* test_cb.exe scalers # read all scalers in a loop&lt;br /&gt;
* test_cb.exe fifo # read the data fifo in a loop&lt;br /&gt;
* test_cb.exe tsfifo # read the timestamp fifo in a loop (do not latch scalers)&lt;br /&gt;
* test_cb.exe intclk # select internal timestamp clock&lt;br /&gt;
* test_cb.exe extclk # select external timestamp clock (10MHz)&lt;br /&gt;
* test_cb.exe clocks # report current status of timestamp clock&lt;br /&gt;
&lt;br /&gt;
= Errata =&lt;br /&gt;
&lt;br /&gt;
* 0x607f6709 - after FIFO reset (timestamp sync, etc), the first word in the FIFO is always 0x00000000, not a real timestamps.&lt;br /&gt;
* 20220420_ko_0x62608957 - after FIFO reset (timestamp sync), the first word in the FIFO is 0xFF000000, a timestamp overflow marker, as expected. after FPGA reboot (before timestamp sync), the first word in the FIFO is also 0xFF000000 for reasons unknown.&lt;br /&gt;
* linux - after power up, chronobox registers are not accessible, check that the FPGA bridges are enabled, if any bridge reports &amp;quot;disabled&amp;quot;, reboot linux. do NOT cycle power.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb04:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* FIXED 23apr2021 - use updated &amp;quot;bootcmd&amp;quot;. figure out why FPGA bridges are disabled on first power up&lt;br /&gt;
* figure out how to load FPGA sof from Linux, probably need new kernel&lt;br /&gt;
* FIXED apr2022, use fw_printenv build from source - fix fw_printenv, probably requires using newer uboot&lt;br /&gt;
* add mmap driver for FPGA LW bridge, probably need new kernel&lt;br /&gt;
* figure out how to build linux kernel from git (now using kernel from GHRD demo kit)&lt;br /&gt;
* enable watchdog timer to auto-reboot on hang&lt;br /&gt;
* figure out why ssh takes 30 second to start. read this: https://daniel-lange.com/archives/152-Openssh-taking-minutes-to-become-available,-booting-takes-half-an-hour-...-because-your-server-waits-for-a-few-bytes-of-randomness.html https://lwn.net/Articles/800509/&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - fix problem on startup first word in the FIFO is 0x00000000.&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - increase number of bits in the timestamp wraparound counter: 0xFF8mmmmm -&amp;gt; 23 bits is possible, keep high bit 0x00800000 as is.&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=984</id>
		<title>Chronobox</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=984"/>
		<updated>2024-07-15T21:45:27Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* reg 33, 39 TDC and AXI FIFO status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Chronobox =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_software&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/chrono-box/rev0&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware/src/master/docs/Chrono.pdf&lt;br /&gt;
&lt;br /&gt;
= Chronobox connectors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| LEMO - CLK_IN - jumpers: SINE&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;NIM/TTL and NIM&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;TTL&lt;br /&gt;
|&lt;br /&gt;
| ECL P1&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| ECL P2&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| PLED - power-on LED&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank A direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 0-1&lt;br /&gt;
| LED  0-1&lt;br /&gt;
| LEMO 2-3&lt;br /&gt;
| LED  2-3&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank B direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 4-5&lt;br /&gt;
| LED  4-5&lt;br /&gt;
| LEMO 6-7&lt;br /&gt;
| LED  6-7&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Electrical connections =&lt;br /&gt;
&lt;br /&gt;
* ECL P1 and P2: LeCroy 4616 compatible&lt;br /&gt;
* LEMO TTL inputs: 0..5V, logic level 0: &amp;lt;0.8V, logic level 1: &amp;gt;2V&lt;br /&gt;
* LEMO TTL outputs: logic level 0: 0V, logic level 1: 5V to 3.3V&lt;br /&gt;
* clock NIM input: NIM compatible&lt;br /&gt;
* clock TTL input: ???&lt;br /&gt;
* clock sine wave input: ???&lt;br /&gt;
&lt;br /&gt;
= Input channel mapping =&lt;br /&gt;
&lt;br /&gt;
* 0+16 : first ECL connector&lt;br /&gt;
* 16+16 : second ECL connector&lt;br /&gt;
* 32+8 : LEMO inputs (TTL)&lt;br /&gt;
* 40+18 : GPIO inputs (FPGA pins)&lt;br /&gt;
* 58 : external clock (10 MHz nominal)&lt;br /&gt;
* 59 : internal clock (100 MHz)&lt;br /&gt;
&lt;br /&gt;
= Functional units =&lt;br /&gt;
&lt;br /&gt;
== Scalers ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 10 ns (15 ns is safe) (sampled by 100 MHz/ 10 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 10 ns (15 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (2 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): 25 ns or more is safe&lt;br /&gt;
&lt;br /&gt;
== Timestamps (TSC) ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 100 ns (105 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 100 ns (105 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (5 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 200 ns (205 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
&lt;br /&gt;
Each TSC input has a 256 entry FIFO. (LE is 1 entry, TE is 1 entry, so 128 hits if both LE and TE enabled).&lt;br /&gt;
&lt;br /&gt;
== Output data fifo ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware before 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 4096 entries deep.&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 64k entries deep.&lt;br /&gt;
&lt;br /&gt;
= Initial hardware setup =&lt;br /&gt;
&lt;br /&gt;
* refer to DE10-NANO information here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* prepare hardware:&lt;br /&gt;
** remove chronobox from enclosure (cannot access JTAG connector when installed)&lt;br /&gt;
** remove DE10-Nano from chronobox baseboard&lt;br /&gt;
** check that SW10 jumpers are: U-D-U-U-D-U. (U=up, D=down, when &amp;quot;ALTERA&amp;quot; text on the FPGA is right side up)&lt;br /&gt;
** reinstall DE10-Nano on chronobox baseboard&lt;br /&gt;
** do NOT reinstall chronobox in enclosure&lt;br /&gt;
* prepare software:&lt;br /&gt;
** check that you have quartus 17.1 (at /opt/intelFPGA/17.1/ in this example)&lt;br /&gt;
** check that you installed chronobox software in /home/agdaq/online/chronobox_software&lt;br /&gt;
** check that you installed chronobox firmware project in /home/agdaq/online/firmware/git/chronobox_firmware&lt;br /&gt;
* connect serial console, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#Serial_console&lt;br /&gt;
** connect a mini-USB (*not* Micto-USB!) cable from mini-USB port on the side of the ethernet connection to a PC&lt;br /&gt;
** minicom -D /dev/ttyUSB0 -b 115200&lt;br /&gt;
* connect fpga jtag, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** connect a mini-USB (*not* Micro-USB!) cable on the side of HDMI and power connectors to a PC&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/jtagconfig&lt;br /&gt;
* prepare SD flash card for booting from network: generic instructions are here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_SD_flash&lt;br /&gt;
** connect new or used 8GB SD flash card to USB flash adapter to a linux computer&lt;br /&gt;
** login as root&lt;br /&gt;
** identify the flash device as /dev/sdX. Use &amp;quot;lsblk&amp;quot; or &amp;quot;blkid&amp;quot; or &amp;quot;dmesg&amp;quot;. be careful to not write to the computer system disk (usually /dev/sda)&lt;br /&gt;
** echo -e &#039;o\nn\np\n1\n2048\n4095\nn\np\n2\n4096\n1681816\nn\np\n3\n\n\nt\n1\na2\nt\n2\nb\nw&#039; | fdisk /dev/sdX&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
** remove card, reintall card, this is to ensure we use the new partition table&lt;br /&gt;
** fdisk -l /dev/sdX&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# fdisk -l /dev/sdg&lt;br /&gt;
Disk /dev/sdg: 7.38 GiB, 7910457344 bytes, 15450112 sectors&lt;br /&gt;
Disk model: STORAGE DEVICE  &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0xa033868b&lt;br /&gt;
&lt;br /&gt;
Device     Boot   Start      End  Sectors   Size Id Type&lt;br /&gt;
/dev/sdg1          2048     4095     2048     1M a2 unknown&lt;br /&gt;
/dev/sdg2          4096  1681816  1677721 819.2M  b W95 FAT32&lt;br /&gt;
/dev/sdg3       1683456 15450111 13766656   6.6G 83 Linux&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-1-fpga.img of=/dev/sdX1  bs=1024k&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-2-uboot.img of=/dev/sdX2  bs=1024k&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
* install prepared flash card into the chronobox DE10-Nano&lt;br /&gt;
* cycle power&lt;br /&gt;
* in the minicom window, IMMEDIATELY press the space bar to stop automatic booting (if it doesn&#039;t react, ensure flow control is disabled in minicom)&lt;br /&gt;
* you will have the uboot &amp;quot;=&amp;gt;&amp;quot; prompt&lt;br /&gt;
* confirm uboot version: U-Boot 2013.01.01&lt;br /&gt;
* setup uboot to boot linux from network, more details here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_network&lt;br /&gt;
** setenv ethaddr 02:aa:bb:cc:cb:04 # for cb04, see below for explanation&lt;br /&gt;
** setenv bootcmd &#039;run bridge_enable_handoff; run netboot&#039;&lt;br /&gt;
** setenv ramboot bootz \${loadaddr} - \${fdtaddr}&lt;br /&gt;
** setenv bootargs console=ttyS0,115200 ip=dhcp root=/dev/nfs rw nfsroot=192.168.1.1:/zssd1tb/nfsroot/%s,vers=3 panic=15&lt;br /&gt;
** saveenv&lt;br /&gt;
** reset&lt;br /&gt;
* DE10-Nano should boot into linux:&lt;br /&gt;
** uboot will restart&lt;br /&gt;
** DHCP will run&lt;br /&gt;
** tftp load of linux kernel will run&lt;br /&gt;
** linux kernel will start&lt;br /&gt;
** linux kernel will get an IP address&lt;br /&gt;
** linux kernel will NFS-mount the root filesystem (.../nfsroot/cb04)&lt;br /&gt;
** systemd will start all services&lt;br /&gt;
** there will be a login prompt on minicom console&lt;br /&gt;
** ssh will work (maybe 1 minute delay before it starts)&lt;br /&gt;
* try a few things:&lt;br /&gt;
** from agdaq or agmini account, ssh root@cb04&lt;br /&gt;
** &amp;quot;df&amp;quot; should show /home/agdaq is mounted (and ssh agdaq@cb04 should work)&lt;br /&gt;
** &amp;quot;/home/agdaq/online/chronobox_software/test_cb.exe 0&amp;quot; should fail (&amp;quot;bus error&amp;quot;) because FPGA is not loaded yet&lt;br /&gt;
* load sof file, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/quartus_pgm -m JTAG -o &amp;quot;p;/home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD.sof@2&amp;quot;&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should work now&lt;br /&gt;
* use srunner_cb.exe to load the pof file into FPGA boot flash&lt;br /&gt;
* use reboot_cb.exe to reboot the FPGA from flash&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should report the expected FPGA firmware version number.&lt;br /&gt;
* success.&lt;br /&gt;
&lt;br /&gt;
== assign ethernet MAC address ==&lt;br /&gt;
&lt;br /&gt;
Usually ethernet MAC address is assigned by manufacturer and is stored in a tiny little flash chip. The DE10-Nano board&lt;br /&gt;
is too cheap and does not have it. So a fake ethernet address has to be assigned manually from&lt;br /&gt;
the &amp;quot;locally administered range&amp;quot; of MAC addresses that start from &amp;quot;02:...&amp;quot;, see&lt;br /&gt;
https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses&lt;br /&gt;
&lt;br /&gt;
All MAC addresses must be unique on an ethernet network, but with manual assignement confusion is easy to create.&lt;br /&gt;
&lt;br /&gt;
For chronobox devices, use MAC addresses that start with &amp;quot;l02:aa:bb:cc:xx:yy&amp;quot; and have last digits &amp;quot;cb:01&amp;quot;, &amp;quot;cb:02&amp;quot;, &amp;quot;cb:03&amp;quot;, &amp;quot;cb04&amp;quot; for the first four chronoboxes.&lt;br /&gt;
&lt;br /&gt;
== new board test checklist ==&lt;br /&gt;
&lt;br /&gt;
to check newly built chronobox baseboard, follow this checklist.&lt;br /&gt;
&lt;br /&gt;
=== test ECL inputs ===&lt;br /&gt;
&lt;br /&gt;
* stop midas frontend&lt;br /&gt;
* ssh agdaq@alphagdaq ### or agmini@daq16&lt;br /&gt;
* ssh root@cb03&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe 0 ### read firmware revision, confirm communication with chronobox firmware&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### output should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xe0, gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect ECL ribbon cable from LeCroy 4616 NIM-to-ECL converter to chronobox ECL_P1 input (left one)&lt;br /&gt;
* ecl_p1 input should read 0x0000&lt;br /&gt;
* connect lemo jumper from NIM logic level 1 otput (i.e. any module OUT-bar output) to first channel of LeCroy 4616, ecl_p1 should read 0x0001&lt;br /&gt;
* move to 2nd channel, get 0x0002&lt;br /&gt;
* and so forth until last channel 0x8000.&lt;br /&gt;
* if any channel does not give expected reading, attach label (i.e. &amp;quot;ECL_P1 0x0002 bad&amp;quot;) and send for repair.&lt;br /&gt;
* repeat with ECL_P2 input (right one), watch printed value of ecl_p2.&lt;br /&gt;
&lt;br /&gt;
=== test TTL inputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in [[#Chronobox connectors]]&lt;br /&gt;
* disconnect all LEMO inputs&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_a # set bank A to input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_b # set bank B to input&lt;br /&gt;
* all 8 LEMO LEDs should be on&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### lemo inputs should read 0xFF&lt;br /&gt;
* connect LEMO 0 (left bottom) to TTL output of Lecroy 222 or equivalent, set &amp;quot;scale&amp;quot; to &amp;quot;latch&amp;quot;, operate push buttons to turn output on and off (LED should come in and out).&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xfe (~0x01), gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* change TTL signal from logic level 0 to 1 and back, observe the corresponding LED to turn on and off, observe the correct bit in the &amp;quot;lemo&amp;quot; column (watch the inverted input ~0x01) change.&lt;br /&gt;
* repeat with LEMO input 1 (left top) through 7 (right top).&lt;br /&gt;
&lt;br /&gt;
=== test TTL outputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in #Chronobox connectors&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for output&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0&lt;br /&gt;
* all LEMO LEDs should be off&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 0.135 V&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0xF&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0xF&lt;br /&gt;
* all LEMO LEDs should be on&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 3.4 to 3.8 V&lt;br /&gt;
* if you measure 1.69 V, the bank direction switch is still in the &amp;quot;input&amp;quot; position&lt;br /&gt;
* to test individual output, instead of 0xF use 0x1, 0x2, 0x4 and 0x8.&lt;br /&gt;
&lt;br /&gt;
=== test clock input ===&lt;br /&gt;
&lt;br /&gt;
* we test the TTL input mode first&lt;br /&gt;
* disconnect CLK_IN input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe intclk ### switch to internal timestamp clock&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00000000, freq 0.0 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0xa0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
notice: ts_clk frequency is around 10 MHz (internal oscillator) and ext_clk frequency is zero (nothing connected)&lt;br /&gt;
* if ts_clk is not around 10 MHz, PLL is not locked correctly, reboot the FPGA and try again: /home/agdaq/online/chronobox_software/test_cb.exe reboot&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;TTL&amp;quot; position&lt;br /&gt;
* connect LEMO cable from LEMO output 0 (bottom left) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_clk 0 ### output timestamp clock on LEMO output 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00cccccc, freq 9999999.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is the same as ts_clk frequency&lt;br /&gt;
* to test NIM input mode, we need a NIM clock signal, i.e. from a VME-NIMIO32, etc. Or use a TTL-to-NIM converter to use clock on LEMO output 0.&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;NIM&amp;quot; position&lt;br /&gt;
* connect VME-NIMIO32 NIM output 3 (40 MHz V1190 clock) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x03333c0c, freq 40001687.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is 40 MHz.&lt;br /&gt;
* to test &amp;quot;sine wave&amp;quot; input mode, TBW, do not have a sine wave signal source.&lt;br /&gt;
&lt;br /&gt;
K.O.&lt;br /&gt;
&lt;br /&gt;
=== test GPIO pins ===&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
= Install chronobox software =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_software.git&lt;br /&gt;
cd chronobox_software&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
ls -l *.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 18808 Aug 16 15:26 reboot_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 47256 Aug 16 15:26 srunner_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 20732 Aug 16 15:26 test_cb.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install chronobox quartus firmware project =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/firmware/git&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
git fetch ### update repository&lt;br /&gt;
git tag ### list available tags&lt;br /&gt;
git checkout 20210420_ko ### checkout a specific version&lt;br /&gt;
git status&lt;br /&gt;
cat timestamp.v ### confirm firmware version&lt;br /&gt;
ls -l output_files/*.{jic,sof,rpd}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5aceaed2 - April 2018 - all inputs connected to counters (except ext clock), 58 inputs, 50 MHz clock&lt;br /&gt;
* 0x5b6de806 - August 2018 - added fpga boot flash programmer and fpga reboot&lt;br /&gt;
* 0x5b7c827d - August 2018 - bshaw added debounce on GPIO inputs (for flow meters), 100 MHz clock&lt;br /&gt;
* 0x5b873169 - August 2018 - rebuilt, no changes&lt;br /&gt;
* 0x5b89e4b4 - August 2018 - added external clock signal, 59 inputs, 100 MHz clock&lt;br /&gt;
* 0x5b8de2b0 - September 2018 - added data fifo and timestamp counters (TSCs) for the first 4 inputs&lt;br /&gt;
* 0x5b906c56 - September 2018 - improved overflow markers, added scalers readout into the data fifo&lt;br /&gt;
* 0x5da8e4c2 - October 2019 - timestamps for all inputs, inversion of inputs&lt;br /&gt;
* 0x5db764a7 - October 2019 - FPGA reboot works now.&lt;br /&gt;
* 0x607f6709 - April 2021 - working timestamp synchronization, memory mapped registers, improved sdc file, correct clock transfers&lt;br /&gt;
* 0x60860e61 - April 2021 - faster data FIFO readout (from ~8 Mbytes/sec to ~80 Mbytes/sec)&lt;br /&gt;
* 0x61832695 - Nov 2021 - increase timestamp FIFO from 4k to 64k words&lt;br /&gt;
* 20220406_ko_0x624e22ad - April 2022 - make inputs edge-triggered instead of sampled.&lt;br /&gt;
* 20220420_ko_0x62608957 - April 2022 - fix first fifo data word is zero&lt;br /&gt;
&lt;br /&gt;
= Firmware update =&lt;br /&gt;
&lt;br /&gt;
* use srunner_cb.exe to load firmware RPD file into EPCQ flash memory.&lt;br /&gt;
* if FPGA is not running compatible firmware, srunner_cb will fail&lt;br /&gt;
* connect JTAG and load the firmware sof file from the quartus project (use &amp;quot;make load_sof&amp;quot;)&lt;br /&gt;
* if JTAG is connected, one can use &amp;quot;make load_jic&amp;quot; to load firmware jic file into EPCQ flash memory.&lt;br /&gt;
&lt;br /&gt;
After correct firmware is loaded, access to chronobox registers may fail (srunner_cb will not work)&lt;br /&gt;
because FPGA bridges are not enabled. To check, run following commands. If some bridge reports &amp;quot;disabled&amp;quot;, reboot linux (do not cycle the power!).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb02:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb02:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some DE10-Nano boards have an EPCQ64 flash memory chip, some have the EPCQ128 flash memory chip.&lt;br /&gt;
* identify EPCQ64 and use &amp;quot;-64&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x16 &lt;br /&gt;
Info: Serial Configuration Device - EPCS64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify EPCQ128 and use &amp;quot;-128&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x18 &lt;br /&gt;
Info: Serial Configuration Device - EPCS128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify -64 or -128 flash memory, write RPD file to flash memory, verify and reboot the fpga:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
#./srunner_cb.exe -read -128 test.rpd # read flash contents into a file&lt;br /&gt;
./srunner_cb.exe -program -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./srunner_cb.exe -verify -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./reboot_cb.exe # reboot the fpga into the new firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
for building firmware use: /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh daq01&lt;br /&gt;
cd online&lt;br /&gt;
git clone git@bitbucket.org:expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
/opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
make quartus&lt;br /&gt;
ls -l output_files/*.{sof,jic,rpd}&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7007185 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 olchansk users 8388833 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.jic&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7510701 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.sof&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
other make targets:&lt;br /&gt;
* make quartus - build fpga programmer files: sof, jic and rpd.&lt;br /&gt;
* make clean - clean the quartus project&lt;br /&gt;
* make qsys - regenerate the qsys block&lt;br /&gt;
* make jic - regenerate the jic file&lt;br /&gt;
* make load_sof - load sof file into fpga via jtag&lt;br /&gt;
* make load_jic - load jic file into fpga boot flash (epcq) via jtag&lt;br /&gt;
* make verify_jic - verify jic checksum in fpga boot flash (epcq)&lt;br /&gt;
&lt;br /&gt;
for jtag access, use /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq16:chronobox_firmware$ /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
1) DE-SoC [2-1.4.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) Remote server daq16: Unable to connect&lt;br /&gt;
&lt;br /&gt;
daq16:chronobox_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
* after regenerating qsys, manually edit ./soc_system/synthesis/submodules/hps_sdram_pll.sv to comment-out line &amp;quot;assign pll_dr_clk = clk_out[2];&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Firmware details =&lt;br /&gt;
&lt;br /&gt;
* DDR3 clock is 400 MHz (DDR3-800)&lt;br /&gt;
* memcpy speed ~1500 Mbytes/sec&lt;br /&gt;
* FIFO access single word read: 80, 44, 44 clocks at 10 ns/clock is 2.3 MHz at 4 bytes/word is 9 Mbytes/sec&lt;br /&gt;
* FIFO access memcpy: burst 2, delay 32, b4, delay 36, b5, d1, b5, d1, b5, d1, b1, delay 53, repeat. this reads 16 words in 72 clocks at 10 ns/clock is 1.388 MHz at 4*16=64 bytes/burst is 88.9 Mbytes/sec.&lt;br /&gt;
&lt;br /&gt;
= Chronobox firmware registers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0 | ro | sof_revision_in | all | firmware revision timestamp code&lt;br /&gt;
0 | wo | latch_scalers_out, zero_scalers_out | all | see [[#reg_0x00_write_bits]]&lt;br /&gt;
1 | rw | reg1_led_out | all | DE10-Nano LED output&lt;br /&gt;
2 | ro | switches_in | all | read DE10-Nano switches&lt;br /&gt;
3 | ro | buttons_in | all | read DE10-Nano buttons&lt;br /&gt;
4 | rw | reg4_test | all | 32-bit read-write test register&lt;br /&gt;
5 | rw | flash_programmer_in, reg5_flash_programmer_out | 0x5b6de806 | 0xABCD srunner flash programmer&lt;br /&gt;
6 | ro | ecl_in | all | read state of ECL inputs&lt;br /&gt;
7 | ro | reg7_test_in | all | ???&lt;br /&gt;
8 | rw | scaler_addr_out, reg8_scaler_data_in | all | top 16 bits of address becomes scaler bus address, 32 bit read is the corresponding scaler data&lt;br /&gt;
9 | ro | lemo_in | all | read state of LEMO inputs&lt;br /&gt;
10/0xA | ro | gpio_in | all | read state of GPIO inputs&lt;br /&gt;
11/0xB | rw | regB_lemo_out | all | LEMO output data&lt;br /&gt;
12/0xC | rw | regC_gpio_out | all | GPIO output data&lt;br /&gt;
13/0xD | rw | regD_out_enable_out | all | enable output tristates: [31:24] - LEMO_OUT, [17:0] - GPIO_OUT&lt;br /&gt;
14/0xE | rw | regE, reconfig_out | 0x5b6de806 | FPGA reboot: write inverted firmware revision (reg0) to reboot the FPGA&lt;br /&gt;
15/0xF | ro | regF_input_num_in | 0x5b89e4b4 | number of chronobox inputs (to read scalers, add 1 for the clock counter)&lt;br /&gt;
16/0x10 | ro | reg10_fifo_status | 0x5b8de2b0 | data fifo status, see below&lt;br /&gt;
17/0x11 | ro | reg11_fifo_data | 0x5b8de2b0 | data fifo data, see below&lt;br /&gt;
18/0x12 | rw | cb_invert_a | 0x5bf7557e | invert inputs 31..0&lt;br /&gt;
19/0x13 | rw | cb_invert_b | 0x5bf7557e | invert inputs 63..32&lt;br /&gt;
20/0x14 | rw | cb_enable_le_a | 0x5bf7557e | enable TSC leading edge inputs 31..0&lt;br /&gt;
21/0x15 | rw | cb_enable_le_b | 0x5bf7557e | enable TSC leading edge inputs 63..32&lt;br /&gt;
22/0x16 | rw | cb_enable_te_a | 0x5bf7557e | enable TSC trailing edge inputs 31..0&lt;br /&gt;
23/0x17 | rw | cb_enable_te_b | 0x5bf7557e | enable TSC trailing edge inputs 63..32&lt;br /&gt;
24/0x18 | ro | fc_ext_clk_100_counter | 0x5bf7557e | external clock frequency counter 100MHz reference&lt;br /&gt;
25/0x19 | ro | fc_ext_clk_ext_counter | 0x5bf7557e | external clock frequency counter&lt;br /&gt;
26/0x1A | ro | fc_ts_clk_100_counter | 0x5bf7557e | timestamp clock frequency counter 100MHz reference&lt;br /&gt;
27/0x1B | ro | fc_ts_clk_ts_counter | 0x5bf7557e | timestamp clock frequency counter&lt;br /&gt;
28/0x1C | ro | ts_clk_pll_status | 0x5bf7557e | timestamp clock PLL status&lt;br /&gt;
29/0x1D | rw | cb_lemo_out_mux_ctrl | 0x5bfdc798 | 8*4 bits to control 8 LEMO output multiplexers (4 bits/16 options each mux, see [[#LEMO outputs]])&lt;br /&gt;
30/0x1E | rw | cb_sync_mask[31:0] | 0x607f6709 | source of chronobox sync signal, low bits&lt;br /&gt;
31/0x1F | rw | cb_sync_mask[63:32] | 0x607f6709 | source of chronobox sync signal, high bits&lt;br /&gt;
32 | rw | cb_sync_reg[31:0], cb_sync_status[31:0] | 0x607f6709 | control of timestamp sync&lt;br /&gt;
33 | ro | tdc_fifo_status | DLTDC | TDC fifo status&lt;br /&gt;
34 | ro | tdc_fifo_data_lo | DLTDC | TDC fifo low 32-bits&lt;br /&gt;
35 | ro | tdc_fifo_data_hi | DLTDC | TDC fifo high 32-bits and fifo rdack&lt;br /&gt;
36 | rw | dl_input_mask | DLTDC | DL trigger input mask&lt;br /&gt;
37 | rw | dl_ctrl       | DLTDC | DL trigger control&lt;br /&gt;
38 | rw | tdc_input_mask | DLTDC | TDC input mask&lt;br /&gt;
39 | ro | axi_fifo_status | DLTDC | AXI fifo status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 0x00 write bits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | fw revision | quartus signal | description&lt;br /&gt;
0 | all | | latch scalers&lt;br /&gt;
1 | all | | zero scalers&lt;br /&gt;
2 | ... | fifo_rdreq_out | fifo_rdreq_out (not used in version 0x607f6709 and later)&lt;br /&gt;
3 | ... | ts_clk_pll_extswitch_out | clear ts_clk_pll_extswitch_out&lt;br /&gt;
4 | ... | ts_clk_pll_extswitch_out | set ts_clk_pll_extswitch_out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 16 fifo status ==&lt;br /&gt;
&lt;br /&gt;
Data fifo status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31: fifo_full - data fifo is current full&lt;br /&gt;
30: fifo_empty - data fifo is currently empty&lt;br /&gt;
29: cb_fifo_ch_full - TSC per-channel fifos have overflown at some point&lt;br /&gt;
28: fifo_full_latch - data fifo has overflown at some point&lt;br /&gt;
24+4: 0&lt;br /&gt;
0+24: fifo_usedw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 28 ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock PLL status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : PLL locked&lt;br /&gt;
30 : PLL active clock (0=internal, 1=external&lt;br /&gt;
29 : external clock bad&lt;br /&gt;
28 : internal clock bad&lt;br /&gt;
27 : ts_clk_pll_extswitch&lt;br /&gt;
0..26 : not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 32 timestamp sync ==&lt;br /&gt;
&lt;br /&gt;
Timestamp synchronization register bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : write 1 to arm timestamp sync circuit, scalers and TSCs are placed in reset state&lt;br /&gt;
30 : write 1 to disarm timestamp sync circuit, reset is released&lt;br /&gt;
...&lt;br /&gt;
16 : write 1 to send a timestamp sync signal&lt;br /&gt;
15 : sync circuit armed&lt;br /&gt;
14 : sync done&lt;br /&gt;
13 : sync signal received (cleared by writing bits 31 or 30)&lt;br /&gt;
12 : 0&lt;br /&gt;
11 : sync circuit armed, clk_ts section&lt;br /&gt;
10 : sync done, clk_ts section&lt;br /&gt;
9  : sync signal received, clk_ts section&lt;br /&gt;
8  : 0&lt;br /&gt;
7  : unused&lt;br /&gt;
...&lt;br /&gt;
0  : unused&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nominal sequence for synchronizing timestamps:&lt;br /&gt;
* make sure nothing is sending the external sync signal (i.e. run is stopped, etc)&lt;br /&gt;
* arm the sync circuit: cb_write32(32, 0x80000000); cb_write32(32, 0);&lt;br /&gt;
* check that the arming was successful: cb_read32(32), only bits 0x8800 should be set&lt;br /&gt;
* scalers are in reset state, not incrementing&lt;br /&gt;
* TSCs are in reset state, no data in the TSC FIFO&lt;br /&gt;
* some time later, send the external sync signal&lt;br /&gt;
* or send the internal sync signal: cb_write32(32, 0x10000); cb_write32(32, 0);&lt;br /&gt;
* check that the timestamp reset happened: cb_read32(32), bits 0x6600 should be set, bits 0x8800 should be cleared&lt;br /&gt;
* check that the scalers are counting, check that there is TSC data in the TSC FIFO&lt;br /&gt;
&lt;br /&gt;
== reg 33, 39 TDC and AXI FIFO status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bit |   mask     | description&lt;br /&gt;
  31 | 0x80000000 | fifo empty&lt;br /&gt;
  30 | 0x40000000 | fifo full&lt;br /&gt;
15:0 | 0x0000FFFF | fifo usedw (64-bit words)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timestamp clock ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock is 10 MHz selectable from internal oscillator or external reference on the CLK_IN input.&lt;br /&gt;
&lt;br /&gt;
CLK_IN input can be selected using 2 two-position jumpers:&lt;br /&gt;
* NIM input: CLK&amp;lt;-&amp;gt;NIM/TTL and CLK&amp;lt;-&amp;gt;NIM&lt;br /&gt;
&lt;br /&gt;
To select the clock from command line, use:&lt;br /&gt;
* test_cb.exe intclk # select internal clock&lt;br /&gt;
* test_cb.exe extclk # select external clock&lt;br /&gt;
&lt;br /&gt;
From software:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Chronobox* cb = ...;&lt;br /&gt;
cb-&amp;gt;cb_int_clock(); # select internal clock&lt;br /&gt;
cb-&amp;gt;cb_ext_clock(); # select external clock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see current status, run &amp;quot;test_cb.exe clocks&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./test_cb.exe clocks&lt;br /&gt;
...&lt;br /&gt;
Chronobox firmware revision: 0x5bf7557e&lt;br /&gt;
...&lt;br /&gt;
clock status: ext_clk: counter 0x00cccf2a, freq 10000450.9 Hz, ts_clk: counter 0x00cccf2a, freq 10000450.9 Hz, PLL status 0xc0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reported is external clock frequency, currently selected timestamp clock frequency and PLL status (register 0x1C).&lt;br /&gt;
&lt;br /&gt;
Normal values for the PLL status:&lt;br /&gt;
* internal clock: 0x80000000&lt;br /&gt;
* external clock: 0xC0000000&lt;br /&gt;
* external clock selected, but invalid: 0x60000000&lt;br /&gt;
* internal clock selected, external clock invalid: 0xa0000000&lt;br /&gt;
&lt;br /&gt;
Disconnected/absent/broken external clock will report ext_clk frequency zero, bit 0x20000000 in the PLL status register 0x1C.&lt;br /&gt;
&lt;br /&gt;
If external clock is CDM, set chronobox clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;NIM&amp;quot;, use CDM 10 MHz clock output LEMO3B.&lt;br /&gt;
&lt;br /&gt;
If external clock is another chronobox (usually LEMO output 0), set clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;TTL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== LEMO outputs ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors can be used as TTL level outputs:&lt;br /&gt;
&lt;br /&gt;
* set the &amp;quot;bank a&amp;quot; and/or &amp;quot;bank b&amp;quot; jumpers for &amp;quot;output&amp;quot;&lt;br /&gt;
* set the lemo output multiplexor bits in register 0x1D&lt;br /&gt;
* set the &amp;quot;lemo output enable&amp;quot; bit in register 0x0D, use bits 24..31 for LEMO outputs 0..7.&lt;br /&gt;
* observe the corresponding LED is on or off according to the LEMO output TTL logic level&lt;br /&gt;
&lt;br /&gt;
The function of each LEMO output is controlled by the lemo output multiplexor. Up to 16 different&lt;br /&gt;
signals can be routed into each output. This is controlled by register 0x1D.&lt;br /&gt;
&lt;br /&gt;
Register 0x1D multiplexor control is 32 bits organized into 8 groups of 4 bits, per each of the 8 LEMO outputs: 0x76543210,&lt;br /&gt;
i.e. value 0x00000001 routes signal function 1 into output 0, and signal function 0 into outputs 1..7.&lt;br /&gt;
&lt;br /&gt;
For each output, there are 16 possible signal functions (4 bits):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | firmware signal | firmware revision | signal description&lt;br /&gt;
0 | cb_lemo_out_reg[n] | 0x5bfdc798 | output is controlled by register 0xB bits 0..7 for outputs 0..7&lt;br /&gt;
1 | clk_ts | 0x5bfdc798 | output is the 10MHz timestamp clock&lt;br /&gt;
2 | cb_sync_in_clk_ts | 0x607f6709 | daisy-chained timestamp sync signal (from control register or from sync input, see registers 30 and 31. see bit 0x10000 in register 32)&lt;br /&gt;
3..30 | gnd | 0x5bfdc798 | not used&lt;br /&gt;
31 | vcc | 0x5bfdc798 | logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== front panel LEDs ==&lt;br /&gt;
&lt;br /&gt;
The front panel LEDs are numbered 0..7 per [[#Chronobox_connectors]]&lt;br /&gt;
&lt;br /&gt;
Each LED can be individually lit by setting a bit in register 0x1 bits 8..15.&lt;br /&gt;
&lt;br /&gt;
If LEMO outputs are active, corresponding LEDs will show LEMO output status (logic level 1 -&amp;gt; LED is on, logic level 0 -&amp;gt; LED is off).&lt;br /&gt;
&lt;br /&gt;
If LEMO inputs are active ...&lt;br /&gt;
&lt;br /&gt;
== Synchronization of multiple chronoboxes ==&lt;br /&gt;
&lt;br /&gt;
To operate several chronoboxes as one unit, they must have two common signals, a clock and a sync signal.&lt;br /&gt;
&lt;br /&gt;
Each chronobox must be configured as:&lt;br /&gt;
* master: this will issue the sync signal&lt;br /&gt;
* slave: will receive the clock and sync signals from master&lt;br /&gt;
* slave daisy-chain: and pass them to the next slave down the chain&lt;br /&gt;
* (one can use the CDM or the TRG as sync masters)&lt;br /&gt;
&lt;br /&gt;
For the purpose of this example (recommended configuration), set the LEMO direction jumpers:&lt;br /&gt;
* bank A: set to &amp;quot;out&amp;quot;: master and slave daisy-chain clock and sync output&lt;br /&gt;
* bank B: set to &amp;quot;in&amp;quot;: slave sync input&lt;br /&gt;
&lt;br /&gt;
Clock connections:&lt;br /&gt;
* sync master can be configured with external or internal clock (CLK_IN input)&lt;br /&gt;
* sync slave must be configured with external clock (CLK_IN input)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #0 -&amp;gt; slave CLK_IN, LEMO #0 -&amp;gt; next slave CLK_IN, LEMO #0 -&amp;gt; ...&lt;br /&gt;
10 MHz clock from CDM &amp;amp; etc -&amp;gt; sync master CLK_IN, LEMO #0 -&amp;gt; slave CLK_IN, ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync connections:&lt;br /&gt;
* sync signal can be generated externally by the CDM or TRG&lt;br /&gt;
* sync signal can be generated internally by writing 0x10000 into reg 32 of sync master&lt;br /&gt;
* (sync must be armed on the master and all slaves before sending the first sync signal, write 0x80000000 into reg 32)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #1 -&amp;gt; slave LEMO #4, LEMO #1 -&amp;gt; next slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
external sync -&amp;gt; master LEMO #4, LEMO #1 -&amp;gt; slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync configuration: (see register 32 for explanation!)&lt;br /&gt;
* master and slave: disarm sync: write 0x40000000 to reg 32, write 0 to reg 32, bits 0x8800 and 0x6600 should clear&lt;br /&gt;
* master and slave daisy chain: setup clock and sync outputs:&lt;br /&gt;
** register 29 lemo output mux to 0xXXXX&#039;XX21 (2=output sync signal, 1=output clock)&lt;br /&gt;
** register 13 lemo output enable, set bits 0x0F00&#039;0000 (set bank A jumper for &amp;quot;out&amp;quot;)&lt;br /&gt;
* slave and slave daisy chain: enable external sync from LEMO #4:&lt;br /&gt;
** register 30, write 0&lt;br /&gt;
** register 31, write 0x10&lt;br /&gt;
* master: switch to external or internal clock, as needed&lt;br /&gt;
* slave: switch to external clock&lt;br /&gt;
* master and slave: arm sync: write 0x80000000 to reg 32, write 0 to reg 32, bits 0x8800 should turn on.&lt;br /&gt;
* timestamps, scalers and data fifo go into the reset state, all old data is cleared&lt;br /&gt;
* when sync is received, timestamp is reset to zero, reset state is cleared and there should be data into FIFO. reg 32 will read 0x6600.&lt;br /&gt;
* if using external sync (no master), wait for reg 32 bits to become 0x6600 (sync completed)&lt;br /&gt;
* master: issue sync signal, write 0x10000 to reg 32, write 0 to reg 32. master reg 32 should read 0x6600, slave reg 32 should read 0x6600.&lt;br /&gt;
&lt;br /&gt;
== FIFO data format ==&lt;br /&gt;
&lt;br /&gt;
* 0x8ntttttt: TSC data, 24 bits &amp;quot;tttttt&amp;quot; of timestamp, 7 bits &amp;quot;nn&amp;quot; of channel number, top bit set to 1. Low bit of &amp;quot;t&amp;quot; indicates 0=leading edge, 1=trailing edge.&lt;br /&gt;
* 0xffTTmmmm: (before 20220420_ko_0x62608957) timestamp wrap around marker: &amp;quot;TT&amp;quot; is the top 8 bits of the timestamp, &amp;quot;mmmm&amp;quot; is a 16 bit counter&lt;br /&gt;
* 0xff8mmmmm: timestamp wrap around marker: bit 24 is the top bit of the timestamp (0/8), &amp;quot;mmmmm&amp;quot; is a 23 bit counter&lt;br /&gt;
* 0xfe00nnnn: scaler data, following &amp;quot;nnnn&amp;quot; words are the latched scalers&lt;br /&gt;
* 0xfd000000: start of data after chronobox sync (cbtrg only, for now)&lt;br /&gt;
&lt;br /&gt;
Time range is (before 20220420_ko_0x62608957):&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 15 bits of &amp;quot;mmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x00007FFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$22 = 15.270527886249999 ### in hours&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Time range is:&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 22 bits of &amp;quot;mmmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x003FFFFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$2 = 1954.6867557262499 ### in hours&lt;br /&gt;
$3 = 81.445281488593736 ### in days&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== timestamp wrap around marker ==&lt;br /&gt;
&lt;br /&gt;
The timestamp data is only 24 bits, to allow timestamping&lt;br /&gt;
with longer time range, wrap around markers are added to the&lt;br /&gt;
data stream.&lt;br /&gt;
&lt;br /&gt;
For input signals that arrive close to the time of timestamp wrap around,&lt;br /&gt;
there is ambiguity in the ordering of the data fifo: does the wrap around&lt;br /&gt;
marker or the signal timestamp show up first? For example for rare&lt;br /&gt;
signals, one can see this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1&lt;br /&gt;
wrap 2&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3&lt;br /&gt;
wrap 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
does the hit belong with wrap marker 2 (written to the fifo just after wrap marker 2)&lt;br /&gt;
or with marker 3 (written to the fifo just before wrap marker 3)?&lt;br /&gt;
&lt;br /&gt;
To remove this ambiguity, additional markers are written to the data stream&lt;br /&gt;
half way between the wrap arounds, making it obvious that the signal&lt;br /&gt;
arrived right after wrap marker 3 (but was written to the FIFO before the marker):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1 0x00&lt;br /&gt;
wrap 1 0x80&lt;br /&gt;
wrap 2 0x00&lt;br /&gt;
wrap 2 0x80&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3 0x00&lt;br /&gt;
wrap 3 0x80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= test_cb.exe =&lt;br /&gt;
&lt;br /&gt;
test_cb.exe is the general test program for the chronobox.&lt;br /&gt;
&lt;br /&gt;
* test_cb.exe 0 # read chronobox register 0&lt;br /&gt;
* test_cb.exe 4 0x1234 # write to chronobox register 4&lt;br /&gt;
* test_cb.exe fpga 0 # read FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe fpga 0 0x12345678 # write 0x12345678 to FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe reboot # reboot the FPGA (the ARM CPU keeps running)&lt;br /&gt;
* test_cb.exe scalers # read all scalers in a loop&lt;br /&gt;
* test_cb.exe fifo # read the data fifo in a loop&lt;br /&gt;
* test_cb.exe tsfifo # read the timestamp fifo in a loop (do not latch scalers)&lt;br /&gt;
* test_cb.exe intclk # select internal timestamp clock&lt;br /&gt;
* test_cb.exe extclk # select external timestamp clock (10MHz)&lt;br /&gt;
* test_cb.exe clocks # report current status of timestamp clock&lt;br /&gt;
&lt;br /&gt;
= Errata =&lt;br /&gt;
&lt;br /&gt;
* 0x607f6709 - after FIFO reset (timestamp sync, etc), the first word in the FIFO is always 0x00000000, not a real timestamps.&lt;br /&gt;
* 20220420_ko_0x62608957 - after FIFO reset (timestamp sync), the first word in the FIFO is 0xFF000000, a timestamp overflow marker, as expected. after FPGA reboot (before timestamp sync), the first word in the FIFO is also 0xFF000000 for reasons unknown.&lt;br /&gt;
* linux - after power up, chronobox registers are not accessible, check that the FPGA bridges are enabled, if any bridge reports &amp;quot;disabled&amp;quot;, reboot linux. do NOT cycle power.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb04:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* FIXED 23apr2021 - use updated &amp;quot;bootcmd&amp;quot;. figure out why FPGA bridges are disabled on first power up&lt;br /&gt;
* figure out how to load FPGA sof from Linux, probably need new kernel&lt;br /&gt;
* FIXED apr2022, use fw_printenv build from source - fix fw_printenv, probably requires using newer uboot&lt;br /&gt;
* add mmap driver for FPGA LW bridge, probably need new kernel&lt;br /&gt;
* figure out how to build linux kernel from git (now using kernel from GHRD demo kit)&lt;br /&gt;
* enable watchdog timer to auto-reboot on hang&lt;br /&gt;
* figure out why ssh takes 30 second to start. read this: https://daniel-lange.com/archives/152-Openssh-taking-minutes-to-become-available,-booting-takes-half-an-hour-...-because-your-server-waits-for-a-few-bytes-of-randomness.html https://lwn.net/Articles/800509/&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - fix problem on startup first word in the FIFO is 0x00000000.&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - increase number of bits in the timestamp wraparound counter: 0xFF8mmmmm -&amp;gt; 23 bits is possible, keep high bit 0x00800000 as is.&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=983</id>
		<title>Chronobox</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=983"/>
		<updated>2024-07-15T21:45:16Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* reg 33, 39 TDC and AXI FIFO status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Chronobox =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_software&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/chrono-box/rev0&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware/src/master/docs/Chrono.pdf&lt;br /&gt;
&lt;br /&gt;
= Chronobox connectors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| LEMO - CLK_IN - jumpers: SINE&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;NIM/TTL and NIM&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;TTL&lt;br /&gt;
|&lt;br /&gt;
| ECL P1&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| ECL P2&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| PLED - power-on LED&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank A direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 0-1&lt;br /&gt;
| LED  0-1&lt;br /&gt;
| LEMO 2-3&lt;br /&gt;
| LED  2-3&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank B direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 4-5&lt;br /&gt;
| LED  4-5&lt;br /&gt;
| LEMO 6-7&lt;br /&gt;
| LED  6-7&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Electrical connections =&lt;br /&gt;
&lt;br /&gt;
* ECL P1 and P2: LeCroy 4616 compatible&lt;br /&gt;
* LEMO TTL inputs: 0..5V, logic level 0: &amp;lt;0.8V, logic level 1: &amp;gt;2V&lt;br /&gt;
* LEMO TTL outputs: logic level 0: 0V, logic level 1: 5V to 3.3V&lt;br /&gt;
* clock NIM input: NIM compatible&lt;br /&gt;
* clock TTL input: ???&lt;br /&gt;
* clock sine wave input: ???&lt;br /&gt;
&lt;br /&gt;
= Input channel mapping =&lt;br /&gt;
&lt;br /&gt;
* 0+16 : first ECL connector&lt;br /&gt;
* 16+16 : second ECL connector&lt;br /&gt;
* 32+8 : LEMO inputs (TTL)&lt;br /&gt;
* 40+18 : GPIO inputs (FPGA pins)&lt;br /&gt;
* 58 : external clock (10 MHz nominal)&lt;br /&gt;
* 59 : internal clock (100 MHz)&lt;br /&gt;
&lt;br /&gt;
= Functional units =&lt;br /&gt;
&lt;br /&gt;
== Scalers ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 10 ns (15 ns is safe) (sampled by 100 MHz/ 10 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 10 ns (15 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (2 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): 25 ns or more is safe&lt;br /&gt;
&lt;br /&gt;
== Timestamps (TSC) ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 100 ns (105 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 100 ns (105 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (5 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 200 ns (205 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
&lt;br /&gt;
Each TSC input has a 256 entry FIFO. (LE is 1 entry, TE is 1 entry, so 128 hits if both LE and TE enabled).&lt;br /&gt;
&lt;br /&gt;
== Output data fifo ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware before 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 4096 entries deep.&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 64k entries deep.&lt;br /&gt;
&lt;br /&gt;
= Initial hardware setup =&lt;br /&gt;
&lt;br /&gt;
* refer to DE10-NANO information here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* prepare hardware:&lt;br /&gt;
** remove chronobox from enclosure (cannot access JTAG connector when installed)&lt;br /&gt;
** remove DE10-Nano from chronobox baseboard&lt;br /&gt;
** check that SW10 jumpers are: U-D-U-U-D-U. (U=up, D=down, when &amp;quot;ALTERA&amp;quot; text on the FPGA is right side up)&lt;br /&gt;
** reinstall DE10-Nano on chronobox baseboard&lt;br /&gt;
** do NOT reinstall chronobox in enclosure&lt;br /&gt;
* prepare software:&lt;br /&gt;
** check that you have quartus 17.1 (at /opt/intelFPGA/17.1/ in this example)&lt;br /&gt;
** check that you installed chronobox software in /home/agdaq/online/chronobox_software&lt;br /&gt;
** check that you installed chronobox firmware project in /home/agdaq/online/firmware/git/chronobox_firmware&lt;br /&gt;
* connect serial console, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#Serial_console&lt;br /&gt;
** connect a mini-USB (*not* Micto-USB!) cable from mini-USB port on the side of the ethernet connection to a PC&lt;br /&gt;
** minicom -D /dev/ttyUSB0 -b 115200&lt;br /&gt;
* connect fpga jtag, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** connect a mini-USB (*not* Micro-USB!) cable on the side of HDMI and power connectors to a PC&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/jtagconfig&lt;br /&gt;
* prepare SD flash card for booting from network: generic instructions are here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_SD_flash&lt;br /&gt;
** connect new or used 8GB SD flash card to USB flash adapter to a linux computer&lt;br /&gt;
** login as root&lt;br /&gt;
** identify the flash device as /dev/sdX. Use &amp;quot;lsblk&amp;quot; or &amp;quot;blkid&amp;quot; or &amp;quot;dmesg&amp;quot;. be careful to not write to the computer system disk (usually /dev/sda)&lt;br /&gt;
** echo -e &#039;o\nn\np\n1\n2048\n4095\nn\np\n2\n4096\n1681816\nn\np\n3\n\n\nt\n1\na2\nt\n2\nb\nw&#039; | fdisk /dev/sdX&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
** remove card, reintall card, this is to ensure we use the new partition table&lt;br /&gt;
** fdisk -l /dev/sdX&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# fdisk -l /dev/sdg&lt;br /&gt;
Disk /dev/sdg: 7.38 GiB, 7910457344 bytes, 15450112 sectors&lt;br /&gt;
Disk model: STORAGE DEVICE  &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0xa033868b&lt;br /&gt;
&lt;br /&gt;
Device     Boot   Start      End  Sectors   Size Id Type&lt;br /&gt;
/dev/sdg1          2048     4095     2048     1M a2 unknown&lt;br /&gt;
/dev/sdg2          4096  1681816  1677721 819.2M  b W95 FAT32&lt;br /&gt;
/dev/sdg3       1683456 15450111 13766656   6.6G 83 Linux&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-1-fpga.img of=/dev/sdX1  bs=1024k&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-2-uboot.img of=/dev/sdX2  bs=1024k&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
* install prepared flash card into the chronobox DE10-Nano&lt;br /&gt;
* cycle power&lt;br /&gt;
* in the minicom window, IMMEDIATELY press the space bar to stop automatic booting (if it doesn&#039;t react, ensure flow control is disabled in minicom)&lt;br /&gt;
* you will have the uboot &amp;quot;=&amp;gt;&amp;quot; prompt&lt;br /&gt;
* confirm uboot version: U-Boot 2013.01.01&lt;br /&gt;
* setup uboot to boot linux from network, more details here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_network&lt;br /&gt;
** setenv ethaddr 02:aa:bb:cc:cb:04 # for cb04, see below for explanation&lt;br /&gt;
** setenv bootcmd &#039;run bridge_enable_handoff; run netboot&#039;&lt;br /&gt;
** setenv ramboot bootz \${loadaddr} - \${fdtaddr}&lt;br /&gt;
** setenv bootargs console=ttyS0,115200 ip=dhcp root=/dev/nfs rw nfsroot=192.168.1.1:/zssd1tb/nfsroot/%s,vers=3 panic=15&lt;br /&gt;
** saveenv&lt;br /&gt;
** reset&lt;br /&gt;
* DE10-Nano should boot into linux:&lt;br /&gt;
** uboot will restart&lt;br /&gt;
** DHCP will run&lt;br /&gt;
** tftp load of linux kernel will run&lt;br /&gt;
** linux kernel will start&lt;br /&gt;
** linux kernel will get an IP address&lt;br /&gt;
** linux kernel will NFS-mount the root filesystem (.../nfsroot/cb04)&lt;br /&gt;
** systemd will start all services&lt;br /&gt;
** there will be a login prompt on minicom console&lt;br /&gt;
** ssh will work (maybe 1 minute delay before it starts)&lt;br /&gt;
* try a few things:&lt;br /&gt;
** from agdaq or agmini account, ssh root@cb04&lt;br /&gt;
** &amp;quot;df&amp;quot; should show /home/agdaq is mounted (and ssh agdaq@cb04 should work)&lt;br /&gt;
** &amp;quot;/home/agdaq/online/chronobox_software/test_cb.exe 0&amp;quot; should fail (&amp;quot;bus error&amp;quot;) because FPGA is not loaded yet&lt;br /&gt;
* load sof file, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/quartus_pgm -m JTAG -o &amp;quot;p;/home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD.sof@2&amp;quot;&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should work now&lt;br /&gt;
* use srunner_cb.exe to load the pof file into FPGA boot flash&lt;br /&gt;
* use reboot_cb.exe to reboot the FPGA from flash&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should report the expected FPGA firmware version number.&lt;br /&gt;
* success.&lt;br /&gt;
&lt;br /&gt;
== assign ethernet MAC address ==&lt;br /&gt;
&lt;br /&gt;
Usually ethernet MAC address is assigned by manufacturer and is stored in a tiny little flash chip. The DE10-Nano board&lt;br /&gt;
is too cheap and does not have it. So a fake ethernet address has to be assigned manually from&lt;br /&gt;
the &amp;quot;locally administered range&amp;quot; of MAC addresses that start from &amp;quot;02:...&amp;quot;, see&lt;br /&gt;
https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses&lt;br /&gt;
&lt;br /&gt;
All MAC addresses must be unique on an ethernet network, but with manual assignement confusion is easy to create.&lt;br /&gt;
&lt;br /&gt;
For chronobox devices, use MAC addresses that start with &amp;quot;l02:aa:bb:cc:xx:yy&amp;quot; and have last digits &amp;quot;cb:01&amp;quot;, &amp;quot;cb:02&amp;quot;, &amp;quot;cb:03&amp;quot;, &amp;quot;cb04&amp;quot; for the first four chronoboxes.&lt;br /&gt;
&lt;br /&gt;
== new board test checklist ==&lt;br /&gt;
&lt;br /&gt;
to check newly built chronobox baseboard, follow this checklist.&lt;br /&gt;
&lt;br /&gt;
=== test ECL inputs ===&lt;br /&gt;
&lt;br /&gt;
* stop midas frontend&lt;br /&gt;
* ssh agdaq@alphagdaq ### or agmini@daq16&lt;br /&gt;
* ssh root@cb03&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe 0 ### read firmware revision, confirm communication with chronobox firmware&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### output should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xe0, gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect ECL ribbon cable from LeCroy 4616 NIM-to-ECL converter to chronobox ECL_P1 input (left one)&lt;br /&gt;
* ecl_p1 input should read 0x0000&lt;br /&gt;
* connect lemo jumper from NIM logic level 1 otput (i.e. any module OUT-bar output) to first channel of LeCroy 4616, ecl_p1 should read 0x0001&lt;br /&gt;
* move to 2nd channel, get 0x0002&lt;br /&gt;
* and so forth until last channel 0x8000.&lt;br /&gt;
* if any channel does not give expected reading, attach label (i.e. &amp;quot;ECL_P1 0x0002 bad&amp;quot;) and send for repair.&lt;br /&gt;
* repeat with ECL_P2 input (right one), watch printed value of ecl_p2.&lt;br /&gt;
&lt;br /&gt;
=== test TTL inputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in [[#Chronobox connectors]]&lt;br /&gt;
* disconnect all LEMO inputs&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_a # set bank A to input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_b # set bank B to input&lt;br /&gt;
* all 8 LEMO LEDs should be on&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### lemo inputs should read 0xFF&lt;br /&gt;
* connect LEMO 0 (left bottom) to TTL output of Lecroy 222 or equivalent, set &amp;quot;scale&amp;quot; to &amp;quot;latch&amp;quot;, operate push buttons to turn output on and off (LED should come in and out).&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xfe (~0x01), gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* change TTL signal from logic level 0 to 1 and back, observe the corresponding LED to turn on and off, observe the correct bit in the &amp;quot;lemo&amp;quot; column (watch the inverted input ~0x01) change.&lt;br /&gt;
* repeat with LEMO input 1 (left top) through 7 (right top).&lt;br /&gt;
&lt;br /&gt;
=== test TTL outputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in #Chronobox connectors&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for output&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0&lt;br /&gt;
* all LEMO LEDs should be off&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 0.135 V&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0xF&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0xF&lt;br /&gt;
* all LEMO LEDs should be on&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 3.4 to 3.8 V&lt;br /&gt;
* if you measure 1.69 V, the bank direction switch is still in the &amp;quot;input&amp;quot; position&lt;br /&gt;
* to test individual output, instead of 0xF use 0x1, 0x2, 0x4 and 0x8.&lt;br /&gt;
&lt;br /&gt;
=== test clock input ===&lt;br /&gt;
&lt;br /&gt;
* we test the TTL input mode first&lt;br /&gt;
* disconnect CLK_IN input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe intclk ### switch to internal timestamp clock&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00000000, freq 0.0 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0xa0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
notice: ts_clk frequency is around 10 MHz (internal oscillator) and ext_clk frequency is zero (nothing connected)&lt;br /&gt;
* if ts_clk is not around 10 MHz, PLL is not locked correctly, reboot the FPGA and try again: /home/agdaq/online/chronobox_software/test_cb.exe reboot&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;TTL&amp;quot; position&lt;br /&gt;
* connect LEMO cable from LEMO output 0 (bottom left) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_clk 0 ### output timestamp clock on LEMO output 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00cccccc, freq 9999999.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is the same as ts_clk frequency&lt;br /&gt;
* to test NIM input mode, we need a NIM clock signal, i.e. from a VME-NIMIO32, etc. Or use a TTL-to-NIM converter to use clock on LEMO output 0.&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;NIM&amp;quot; position&lt;br /&gt;
* connect VME-NIMIO32 NIM output 3 (40 MHz V1190 clock) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x03333c0c, freq 40001687.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is 40 MHz.&lt;br /&gt;
* to test &amp;quot;sine wave&amp;quot; input mode, TBW, do not have a sine wave signal source.&lt;br /&gt;
&lt;br /&gt;
K.O.&lt;br /&gt;
&lt;br /&gt;
=== test GPIO pins ===&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
= Install chronobox software =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_software.git&lt;br /&gt;
cd chronobox_software&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
ls -l *.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 18808 Aug 16 15:26 reboot_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 47256 Aug 16 15:26 srunner_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 20732 Aug 16 15:26 test_cb.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install chronobox quartus firmware project =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/firmware/git&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
git fetch ### update repository&lt;br /&gt;
git tag ### list available tags&lt;br /&gt;
git checkout 20210420_ko ### checkout a specific version&lt;br /&gt;
git status&lt;br /&gt;
cat timestamp.v ### confirm firmware version&lt;br /&gt;
ls -l output_files/*.{jic,sof,rpd}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5aceaed2 - April 2018 - all inputs connected to counters (except ext clock), 58 inputs, 50 MHz clock&lt;br /&gt;
* 0x5b6de806 - August 2018 - added fpga boot flash programmer and fpga reboot&lt;br /&gt;
* 0x5b7c827d - August 2018 - bshaw added debounce on GPIO inputs (for flow meters), 100 MHz clock&lt;br /&gt;
* 0x5b873169 - August 2018 - rebuilt, no changes&lt;br /&gt;
* 0x5b89e4b4 - August 2018 - added external clock signal, 59 inputs, 100 MHz clock&lt;br /&gt;
* 0x5b8de2b0 - September 2018 - added data fifo and timestamp counters (TSCs) for the first 4 inputs&lt;br /&gt;
* 0x5b906c56 - September 2018 - improved overflow markers, added scalers readout into the data fifo&lt;br /&gt;
* 0x5da8e4c2 - October 2019 - timestamps for all inputs, inversion of inputs&lt;br /&gt;
* 0x5db764a7 - October 2019 - FPGA reboot works now.&lt;br /&gt;
* 0x607f6709 - April 2021 - working timestamp synchronization, memory mapped registers, improved sdc file, correct clock transfers&lt;br /&gt;
* 0x60860e61 - April 2021 - faster data FIFO readout (from ~8 Mbytes/sec to ~80 Mbytes/sec)&lt;br /&gt;
* 0x61832695 - Nov 2021 - increase timestamp FIFO from 4k to 64k words&lt;br /&gt;
* 20220406_ko_0x624e22ad - April 2022 - make inputs edge-triggered instead of sampled.&lt;br /&gt;
* 20220420_ko_0x62608957 - April 2022 - fix first fifo data word is zero&lt;br /&gt;
&lt;br /&gt;
= Firmware update =&lt;br /&gt;
&lt;br /&gt;
* use srunner_cb.exe to load firmware RPD file into EPCQ flash memory.&lt;br /&gt;
* if FPGA is not running compatible firmware, srunner_cb will fail&lt;br /&gt;
* connect JTAG and load the firmware sof file from the quartus project (use &amp;quot;make load_sof&amp;quot;)&lt;br /&gt;
* if JTAG is connected, one can use &amp;quot;make load_jic&amp;quot; to load firmware jic file into EPCQ flash memory.&lt;br /&gt;
&lt;br /&gt;
After correct firmware is loaded, access to chronobox registers may fail (srunner_cb will not work)&lt;br /&gt;
because FPGA bridges are not enabled. To check, run following commands. If some bridge reports &amp;quot;disabled&amp;quot;, reboot linux (do not cycle the power!).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb02:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb02:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some DE10-Nano boards have an EPCQ64 flash memory chip, some have the EPCQ128 flash memory chip.&lt;br /&gt;
* identify EPCQ64 and use &amp;quot;-64&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x16 &lt;br /&gt;
Info: Serial Configuration Device - EPCS64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify EPCQ128 and use &amp;quot;-128&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x18 &lt;br /&gt;
Info: Serial Configuration Device - EPCS128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify -64 or -128 flash memory, write RPD file to flash memory, verify and reboot the fpga:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
#./srunner_cb.exe -read -128 test.rpd # read flash contents into a file&lt;br /&gt;
./srunner_cb.exe -program -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./srunner_cb.exe -verify -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./reboot_cb.exe # reboot the fpga into the new firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
for building firmware use: /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh daq01&lt;br /&gt;
cd online&lt;br /&gt;
git clone git@bitbucket.org:expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
/opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
make quartus&lt;br /&gt;
ls -l output_files/*.{sof,jic,rpd}&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7007185 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 olchansk users 8388833 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.jic&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7510701 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.sof&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
other make targets:&lt;br /&gt;
* make quartus - build fpga programmer files: sof, jic and rpd.&lt;br /&gt;
* make clean - clean the quartus project&lt;br /&gt;
* make qsys - regenerate the qsys block&lt;br /&gt;
* make jic - regenerate the jic file&lt;br /&gt;
* make load_sof - load sof file into fpga via jtag&lt;br /&gt;
* make load_jic - load jic file into fpga boot flash (epcq) via jtag&lt;br /&gt;
* make verify_jic - verify jic checksum in fpga boot flash (epcq)&lt;br /&gt;
&lt;br /&gt;
for jtag access, use /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq16:chronobox_firmware$ /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
1) DE-SoC [2-1.4.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) Remote server daq16: Unable to connect&lt;br /&gt;
&lt;br /&gt;
daq16:chronobox_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
* after regenerating qsys, manually edit ./soc_system/synthesis/submodules/hps_sdram_pll.sv to comment-out line &amp;quot;assign pll_dr_clk = clk_out[2];&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Firmware details =&lt;br /&gt;
&lt;br /&gt;
* DDR3 clock is 400 MHz (DDR3-800)&lt;br /&gt;
* memcpy speed ~1500 Mbytes/sec&lt;br /&gt;
* FIFO access single word read: 80, 44, 44 clocks at 10 ns/clock is 2.3 MHz at 4 bytes/word is 9 Mbytes/sec&lt;br /&gt;
* FIFO access memcpy: burst 2, delay 32, b4, delay 36, b5, d1, b5, d1, b5, d1, b1, delay 53, repeat. this reads 16 words in 72 clocks at 10 ns/clock is 1.388 MHz at 4*16=64 bytes/burst is 88.9 Mbytes/sec.&lt;br /&gt;
&lt;br /&gt;
= Chronobox firmware registers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0 | ro | sof_revision_in | all | firmware revision timestamp code&lt;br /&gt;
0 | wo | latch_scalers_out, zero_scalers_out | all | see [[#reg_0x00_write_bits]]&lt;br /&gt;
1 | rw | reg1_led_out | all | DE10-Nano LED output&lt;br /&gt;
2 | ro | switches_in | all | read DE10-Nano switches&lt;br /&gt;
3 | ro | buttons_in | all | read DE10-Nano buttons&lt;br /&gt;
4 | rw | reg4_test | all | 32-bit read-write test register&lt;br /&gt;
5 | rw | flash_programmer_in, reg5_flash_programmer_out | 0x5b6de806 | 0xABCD srunner flash programmer&lt;br /&gt;
6 | ro | ecl_in | all | read state of ECL inputs&lt;br /&gt;
7 | ro | reg7_test_in | all | ???&lt;br /&gt;
8 | rw | scaler_addr_out, reg8_scaler_data_in | all | top 16 bits of address becomes scaler bus address, 32 bit read is the corresponding scaler data&lt;br /&gt;
9 | ro | lemo_in | all | read state of LEMO inputs&lt;br /&gt;
10/0xA | ro | gpio_in | all | read state of GPIO inputs&lt;br /&gt;
11/0xB | rw | regB_lemo_out | all | LEMO output data&lt;br /&gt;
12/0xC | rw | regC_gpio_out | all | GPIO output data&lt;br /&gt;
13/0xD | rw | regD_out_enable_out | all | enable output tristates: [31:24] - LEMO_OUT, [17:0] - GPIO_OUT&lt;br /&gt;
14/0xE | rw | regE, reconfig_out | 0x5b6de806 | FPGA reboot: write inverted firmware revision (reg0) to reboot the FPGA&lt;br /&gt;
15/0xF | ro | regF_input_num_in | 0x5b89e4b4 | number of chronobox inputs (to read scalers, add 1 for the clock counter)&lt;br /&gt;
16/0x10 | ro | reg10_fifo_status | 0x5b8de2b0 | data fifo status, see below&lt;br /&gt;
17/0x11 | ro | reg11_fifo_data | 0x5b8de2b0 | data fifo data, see below&lt;br /&gt;
18/0x12 | rw | cb_invert_a | 0x5bf7557e | invert inputs 31..0&lt;br /&gt;
19/0x13 | rw | cb_invert_b | 0x5bf7557e | invert inputs 63..32&lt;br /&gt;
20/0x14 | rw | cb_enable_le_a | 0x5bf7557e | enable TSC leading edge inputs 31..0&lt;br /&gt;
21/0x15 | rw | cb_enable_le_b | 0x5bf7557e | enable TSC leading edge inputs 63..32&lt;br /&gt;
22/0x16 | rw | cb_enable_te_a | 0x5bf7557e | enable TSC trailing edge inputs 31..0&lt;br /&gt;
23/0x17 | rw | cb_enable_te_b | 0x5bf7557e | enable TSC trailing edge inputs 63..32&lt;br /&gt;
24/0x18 | ro | fc_ext_clk_100_counter | 0x5bf7557e | external clock frequency counter 100MHz reference&lt;br /&gt;
25/0x19 | ro | fc_ext_clk_ext_counter | 0x5bf7557e | external clock frequency counter&lt;br /&gt;
26/0x1A | ro | fc_ts_clk_100_counter | 0x5bf7557e | timestamp clock frequency counter 100MHz reference&lt;br /&gt;
27/0x1B | ro | fc_ts_clk_ts_counter | 0x5bf7557e | timestamp clock frequency counter&lt;br /&gt;
28/0x1C | ro | ts_clk_pll_status | 0x5bf7557e | timestamp clock PLL status&lt;br /&gt;
29/0x1D | rw | cb_lemo_out_mux_ctrl | 0x5bfdc798 | 8*4 bits to control 8 LEMO output multiplexers (4 bits/16 options each mux, see [[#LEMO outputs]])&lt;br /&gt;
30/0x1E | rw | cb_sync_mask[31:0] | 0x607f6709 | source of chronobox sync signal, low bits&lt;br /&gt;
31/0x1F | rw | cb_sync_mask[63:32] | 0x607f6709 | source of chronobox sync signal, high bits&lt;br /&gt;
32 | rw | cb_sync_reg[31:0], cb_sync_status[31:0] | 0x607f6709 | control of timestamp sync&lt;br /&gt;
33 | ro | tdc_fifo_status | DLTDC | TDC fifo status&lt;br /&gt;
34 | ro | tdc_fifo_data_lo | DLTDC | TDC fifo low 32-bits&lt;br /&gt;
35 | ro | tdc_fifo_data_hi | DLTDC | TDC fifo high 32-bits and fifo rdack&lt;br /&gt;
36 | rw | dl_input_mask | DLTDC | DL trigger input mask&lt;br /&gt;
37 | rw | dl_ctrl       | DLTDC | DL trigger control&lt;br /&gt;
38 | rw | tdc_input_mask | DLTDC | TDC input mask&lt;br /&gt;
39 | ro | axi_fifo_status | DLTDC | AXI fifo status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 0x00 write bits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | fw revision | quartus signal | description&lt;br /&gt;
0 | all | | latch scalers&lt;br /&gt;
1 | all | | zero scalers&lt;br /&gt;
2 | ... | fifo_rdreq_out | fifo_rdreq_out (not used in version 0x607f6709 and later)&lt;br /&gt;
3 | ... | ts_clk_pll_extswitch_out | clear ts_clk_pll_extswitch_out&lt;br /&gt;
4 | ... | ts_clk_pll_extswitch_out | set ts_clk_pll_extswitch_out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 16 fifo status ==&lt;br /&gt;
&lt;br /&gt;
Data fifo status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31: fifo_full - data fifo is current full&lt;br /&gt;
30: fifo_empty - data fifo is currently empty&lt;br /&gt;
29: cb_fifo_ch_full - TSC per-channel fifos have overflown at some point&lt;br /&gt;
28: fifo_full_latch - data fifo has overflown at some point&lt;br /&gt;
24+4: 0&lt;br /&gt;
0+24: fifo_usedw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 28 ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock PLL status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : PLL locked&lt;br /&gt;
30 : PLL active clock (0=internal, 1=external&lt;br /&gt;
29 : external clock bad&lt;br /&gt;
28 : internal clock bad&lt;br /&gt;
27 : ts_clk_pll_extswitch&lt;br /&gt;
0..26 : not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 32 timestamp sync ==&lt;br /&gt;
&lt;br /&gt;
Timestamp synchronization register bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : write 1 to arm timestamp sync circuit, scalers and TSCs are placed in reset state&lt;br /&gt;
30 : write 1 to disarm timestamp sync circuit, reset is released&lt;br /&gt;
...&lt;br /&gt;
16 : write 1 to send a timestamp sync signal&lt;br /&gt;
15 : sync circuit armed&lt;br /&gt;
14 : sync done&lt;br /&gt;
13 : sync signal received (cleared by writing bits 31 or 30)&lt;br /&gt;
12 : 0&lt;br /&gt;
11 : sync circuit armed, clk_ts section&lt;br /&gt;
10 : sync done, clk_ts section&lt;br /&gt;
9  : sync signal received, clk_ts section&lt;br /&gt;
8  : 0&lt;br /&gt;
7  : unused&lt;br /&gt;
...&lt;br /&gt;
0  : unused&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nominal sequence for synchronizing timestamps:&lt;br /&gt;
* make sure nothing is sending the external sync signal (i.e. run is stopped, etc)&lt;br /&gt;
* arm the sync circuit: cb_write32(32, 0x80000000); cb_write32(32, 0);&lt;br /&gt;
* check that the arming was successful: cb_read32(32), only bits 0x8800 should be set&lt;br /&gt;
* scalers are in reset state, not incrementing&lt;br /&gt;
* TSCs are in reset state, no data in the TSC FIFO&lt;br /&gt;
* some time later, send the external sync signal&lt;br /&gt;
* or send the internal sync signal: cb_write32(32, 0x10000); cb_write32(32, 0);&lt;br /&gt;
* check that the timestamp reset happened: cb_read32(32), bits 0x6600 should be set, bits 0x8800 should be cleared&lt;br /&gt;
* check that the scalers are counting, check that there is TSC data in the TSC FIFO&lt;br /&gt;
&lt;br /&gt;
== reg 33, 39 TDC and AXI FIFO status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bit |   mask     | description&lt;br /&gt;
  31 | 0x80000000 | fifo empty&lt;br /&gt;
  30 | 0x40000000 | fifo full&lt;br /&gt;
15:0 | 0x000000FF | fifo usedw (64-bit words)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timestamp clock ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock is 10 MHz selectable from internal oscillator or external reference on the CLK_IN input.&lt;br /&gt;
&lt;br /&gt;
CLK_IN input can be selected using 2 two-position jumpers:&lt;br /&gt;
* NIM input: CLK&amp;lt;-&amp;gt;NIM/TTL and CLK&amp;lt;-&amp;gt;NIM&lt;br /&gt;
&lt;br /&gt;
To select the clock from command line, use:&lt;br /&gt;
* test_cb.exe intclk # select internal clock&lt;br /&gt;
* test_cb.exe extclk # select external clock&lt;br /&gt;
&lt;br /&gt;
From software:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Chronobox* cb = ...;&lt;br /&gt;
cb-&amp;gt;cb_int_clock(); # select internal clock&lt;br /&gt;
cb-&amp;gt;cb_ext_clock(); # select external clock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see current status, run &amp;quot;test_cb.exe clocks&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./test_cb.exe clocks&lt;br /&gt;
...&lt;br /&gt;
Chronobox firmware revision: 0x5bf7557e&lt;br /&gt;
...&lt;br /&gt;
clock status: ext_clk: counter 0x00cccf2a, freq 10000450.9 Hz, ts_clk: counter 0x00cccf2a, freq 10000450.9 Hz, PLL status 0xc0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reported is external clock frequency, currently selected timestamp clock frequency and PLL status (register 0x1C).&lt;br /&gt;
&lt;br /&gt;
Normal values for the PLL status:&lt;br /&gt;
* internal clock: 0x80000000&lt;br /&gt;
* external clock: 0xC0000000&lt;br /&gt;
* external clock selected, but invalid: 0x60000000&lt;br /&gt;
* internal clock selected, external clock invalid: 0xa0000000&lt;br /&gt;
&lt;br /&gt;
Disconnected/absent/broken external clock will report ext_clk frequency zero, bit 0x20000000 in the PLL status register 0x1C.&lt;br /&gt;
&lt;br /&gt;
If external clock is CDM, set chronobox clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;NIM&amp;quot;, use CDM 10 MHz clock output LEMO3B.&lt;br /&gt;
&lt;br /&gt;
If external clock is another chronobox (usually LEMO output 0), set clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;TTL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== LEMO outputs ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors can be used as TTL level outputs:&lt;br /&gt;
&lt;br /&gt;
* set the &amp;quot;bank a&amp;quot; and/or &amp;quot;bank b&amp;quot; jumpers for &amp;quot;output&amp;quot;&lt;br /&gt;
* set the lemo output multiplexor bits in register 0x1D&lt;br /&gt;
* set the &amp;quot;lemo output enable&amp;quot; bit in register 0x0D, use bits 24..31 for LEMO outputs 0..7.&lt;br /&gt;
* observe the corresponding LED is on or off according to the LEMO output TTL logic level&lt;br /&gt;
&lt;br /&gt;
The function of each LEMO output is controlled by the lemo output multiplexor. Up to 16 different&lt;br /&gt;
signals can be routed into each output. This is controlled by register 0x1D.&lt;br /&gt;
&lt;br /&gt;
Register 0x1D multiplexor control is 32 bits organized into 8 groups of 4 bits, per each of the 8 LEMO outputs: 0x76543210,&lt;br /&gt;
i.e. value 0x00000001 routes signal function 1 into output 0, and signal function 0 into outputs 1..7.&lt;br /&gt;
&lt;br /&gt;
For each output, there are 16 possible signal functions (4 bits):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | firmware signal | firmware revision | signal description&lt;br /&gt;
0 | cb_lemo_out_reg[n] | 0x5bfdc798 | output is controlled by register 0xB bits 0..7 for outputs 0..7&lt;br /&gt;
1 | clk_ts | 0x5bfdc798 | output is the 10MHz timestamp clock&lt;br /&gt;
2 | cb_sync_in_clk_ts | 0x607f6709 | daisy-chained timestamp sync signal (from control register or from sync input, see registers 30 and 31. see bit 0x10000 in register 32)&lt;br /&gt;
3..30 | gnd | 0x5bfdc798 | not used&lt;br /&gt;
31 | vcc | 0x5bfdc798 | logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== front panel LEDs ==&lt;br /&gt;
&lt;br /&gt;
The front panel LEDs are numbered 0..7 per [[#Chronobox_connectors]]&lt;br /&gt;
&lt;br /&gt;
Each LED can be individually lit by setting a bit in register 0x1 bits 8..15.&lt;br /&gt;
&lt;br /&gt;
If LEMO outputs are active, corresponding LEDs will show LEMO output status (logic level 1 -&amp;gt; LED is on, logic level 0 -&amp;gt; LED is off).&lt;br /&gt;
&lt;br /&gt;
If LEMO inputs are active ...&lt;br /&gt;
&lt;br /&gt;
== Synchronization of multiple chronoboxes ==&lt;br /&gt;
&lt;br /&gt;
To operate several chronoboxes as one unit, they must have two common signals, a clock and a sync signal.&lt;br /&gt;
&lt;br /&gt;
Each chronobox must be configured as:&lt;br /&gt;
* master: this will issue the sync signal&lt;br /&gt;
* slave: will receive the clock and sync signals from master&lt;br /&gt;
* slave daisy-chain: and pass them to the next slave down the chain&lt;br /&gt;
* (one can use the CDM or the TRG as sync masters)&lt;br /&gt;
&lt;br /&gt;
For the purpose of this example (recommended configuration), set the LEMO direction jumpers:&lt;br /&gt;
* bank A: set to &amp;quot;out&amp;quot;: master and slave daisy-chain clock and sync output&lt;br /&gt;
* bank B: set to &amp;quot;in&amp;quot;: slave sync input&lt;br /&gt;
&lt;br /&gt;
Clock connections:&lt;br /&gt;
* sync master can be configured with external or internal clock (CLK_IN input)&lt;br /&gt;
* sync slave must be configured with external clock (CLK_IN input)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #0 -&amp;gt; slave CLK_IN, LEMO #0 -&amp;gt; next slave CLK_IN, LEMO #0 -&amp;gt; ...&lt;br /&gt;
10 MHz clock from CDM &amp;amp; etc -&amp;gt; sync master CLK_IN, LEMO #0 -&amp;gt; slave CLK_IN, ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync connections:&lt;br /&gt;
* sync signal can be generated externally by the CDM or TRG&lt;br /&gt;
* sync signal can be generated internally by writing 0x10000 into reg 32 of sync master&lt;br /&gt;
* (sync must be armed on the master and all slaves before sending the first sync signal, write 0x80000000 into reg 32)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #1 -&amp;gt; slave LEMO #4, LEMO #1 -&amp;gt; next slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
external sync -&amp;gt; master LEMO #4, LEMO #1 -&amp;gt; slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync configuration: (see register 32 for explanation!)&lt;br /&gt;
* master and slave: disarm sync: write 0x40000000 to reg 32, write 0 to reg 32, bits 0x8800 and 0x6600 should clear&lt;br /&gt;
* master and slave daisy chain: setup clock and sync outputs:&lt;br /&gt;
** register 29 lemo output mux to 0xXXXX&#039;XX21 (2=output sync signal, 1=output clock)&lt;br /&gt;
** register 13 lemo output enable, set bits 0x0F00&#039;0000 (set bank A jumper for &amp;quot;out&amp;quot;)&lt;br /&gt;
* slave and slave daisy chain: enable external sync from LEMO #4:&lt;br /&gt;
** register 30, write 0&lt;br /&gt;
** register 31, write 0x10&lt;br /&gt;
* master: switch to external or internal clock, as needed&lt;br /&gt;
* slave: switch to external clock&lt;br /&gt;
* master and slave: arm sync: write 0x80000000 to reg 32, write 0 to reg 32, bits 0x8800 should turn on.&lt;br /&gt;
* timestamps, scalers and data fifo go into the reset state, all old data is cleared&lt;br /&gt;
* when sync is received, timestamp is reset to zero, reset state is cleared and there should be data into FIFO. reg 32 will read 0x6600.&lt;br /&gt;
* if using external sync (no master), wait for reg 32 bits to become 0x6600 (sync completed)&lt;br /&gt;
* master: issue sync signal, write 0x10000 to reg 32, write 0 to reg 32. master reg 32 should read 0x6600, slave reg 32 should read 0x6600.&lt;br /&gt;
&lt;br /&gt;
== FIFO data format ==&lt;br /&gt;
&lt;br /&gt;
* 0x8ntttttt: TSC data, 24 bits &amp;quot;tttttt&amp;quot; of timestamp, 7 bits &amp;quot;nn&amp;quot; of channel number, top bit set to 1. Low bit of &amp;quot;t&amp;quot; indicates 0=leading edge, 1=trailing edge.&lt;br /&gt;
* 0xffTTmmmm: (before 20220420_ko_0x62608957) timestamp wrap around marker: &amp;quot;TT&amp;quot; is the top 8 bits of the timestamp, &amp;quot;mmmm&amp;quot; is a 16 bit counter&lt;br /&gt;
* 0xff8mmmmm: timestamp wrap around marker: bit 24 is the top bit of the timestamp (0/8), &amp;quot;mmmmm&amp;quot; is a 23 bit counter&lt;br /&gt;
* 0xfe00nnnn: scaler data, following &amp;quot;nnnn&amp;quot; words are the latched scalers&lt;br /&gt;
* 0xfd000000: start of data after chronobox sync (cbtrg only, for now)&lt;br /&gt;
&lt;br /&gt;
Time range is (before 20220420_ko_0x62608957):&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 15 bits of &amp;quot;mmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x00007FFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$22 = 15.270527886249999 ### in hours&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Time range is:&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 22 bits of &amp;quot;mmmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x003FFFFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$2 = 1954.6867557262499 ### in hours&lt;br /&gt;
$3 = 81.445281488593736 ### in days&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== timestamp wrap around marker ==&lt;br /&gt;
&lt;br /&gt;
The timestamp data is only 24 bits, to allow timestamping&lt;br /&gt;
with longer time range, wrap around markers are added to the&lt;br /&gt;
data stream.&lt;br /&gt;
&lt;br /&gt;
For input signals that arrive close to the time of timestamp wrap around,&lt;br /&gt;
there is ambiguity in the ordering of the data fifo: does the wrap around&lt;br /&gt;
marker or the signal timestamp show up first? For example for rare&lt;br /&gt;
signals, one can see this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1&lt;br /&gt;
wrap 2&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3&lt;br /&gt;
wrap 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
does the hit belong with wrap marker 2 (written to the fifo just after wrap marker 2)&lt;br /&gt;
or with marker 3 (written to the fifo just before wrap marker 3)?&lt;br /&gt;
&lt;br /&gt;
To remove this ambiguity, additional markers are written to the data stream&lt;br /&gt;
half way between the wrap arounds, making it obvious that the signal&lt;br /&gt;
arrived right after wrap marker 3 (but was written to the FIFO before the marker):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1 0x00&lt;br /&gt;
wrap 1 0x80&lt;br /&gt;
wrap 2 0x00&lt;br /&gt;
wrap 2 0x80&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3 0x00&lt;br /&gt;
wrap 3 0x80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= test_cb.exe =&lt;br /&gt;
&lt;br /&gt;
test_cb.exe is the general test program for the chronobox.&lt;br /&gt;
&lt;br /&gt;
* test_cb.exe 0 # read chronobox register 0&lt;br /&gt;
* test_cb.exe 4 0x1234 # write to chronobox register 4&lt;br /&gt;
* test_cb.exe fpga 0 # read FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe fpga 0 0x12345678 # write 0x12345678 to FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe reboot # reboot the FPGA (the ARM CPU keeps running)&lt;br /&gt;
* test_cb.exe scalers # read all scalers in a loop&lt;br /&gt;
* test_cb.exe fifo # read the data fifo in a loop&lt;br /&gt;
* test_cb.exe tsfifo # read the timestamp fifo in a loop (do not latch scalers)&lt;br /&gt;
* test_cb.exe intclk # select internal timestamp clock&lt;br /&gt;
* test_cb.exe extclk # select external timestamp clock (10MHz)&lt;br /&gt;
* test_cb.exe clocks # report current status of timestamp clock&lt;br /&gt;
&lt;br /&gt;
= Errata =&lt;br /&gt;
&lt;br /&gt;
* 0x607f6709 - after FIFO reset (timestamp sync, etc), the first word in the FIFO is always 0x00000000, not a real timestamps.&lt;br /&gt;
* 20220420_ko_0x62608957 - after FIFO reset (timestamp sync), the first word in the FIFO is 0xFF000000, a timestamp overflow marker, as expected. after FPGA reboot (before timestamp sync), the first word in the FIFO is also 0xFF000000 for reasons unknown.&lt;br /&gt;
* linux - after power up, chronobox registers are not accessible, check that the FPGA bridges are enabled, if any bridge reports &amp;quot;disabled&amp;quot;, reboot linux. do NOT cycle power.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb04:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* FIXED 23apr2021 - use updated &amp;quot;bootcmd&amp;quot;. figure out why FPGA bridges are disabled on first power up&lt;br /&gt;
* figure out how to load FPGA sof from Linux, probably need new kernel&lt;br /&gt;
* FIXED apr2022, use fw_printenv build from source - fix fw_printenv, probably requires using newer uboot&lt;br /&gt;
* add mmap driver for FPGA LW bridge, probably need new kernel&lt;br /&gt;
* figure out how to build linux kernel from git (now using kernel from GHRD demo kit)&lt;br /&gt;
* enable watchdog timer to auto-reboot on hang&lt;br /&gt;
* figure out why ssh takes 30 second to start. read this: https://daniel-lange.com/archives/152-Openssh-taking-minutes-to-become-available,-booting-takes-half-an-hour-...-because-your-server-waits-for-a-few-bytes-of-randomness.html https://lwn.net/Articles/800509/&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - fix problem on startup first word in the FIFO is 0x00000000.&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - increase number of bits in the timestamp wraparound counter: 0xFF8mmmmm -&amp;gt; 23 bits is possible, keep high bit 0x00800000 as is.&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=982</id>
		<title>Chronobox</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=982"/>
		<updated>2024-07-15T00:16:54Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* reg 33, 39 TDC and AXI FIFO status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Chronobox =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_software&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/chrono-box/rev0&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware/src/master/docs/Chrono.pdf&lt;br /&gt;
&lt;br /&gt;
= Chronobox connectors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| LEMO - CLK_IN - jumpers: SINE&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;NIM/TTL and NIM&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;TTL&lt;br /&gt;
|&lt;br /&gt;
| ECL P1&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| ECL P2&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| PLED - power-on LED&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank A direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 0-1&lt;br /&gt;
| LED  0-1&lt;br /&gt;
| LEMO 2-3&lt;br /&gt;
| LED  2-3&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank B direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 4-5&lt;br /&gt;
| LED  4-5&lt;br /&gt;
| LEMO 6-7&lt;br /&gt;
| LED  6-7&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Electrical connections =&lt;br /&gt;
&lt;br /&gt;
* ECL P1 and P2: LeCroy 4616 compatible&lt;br /&gt;
* LEMO TTL inputs: 0..5V, logic level 0: &amp;lt;0.8V, logic level 1: &amp;gt;2V&lt;br /&gt;
* LEMO TTL outputs: logic level 0: 0V, logic level 1: 5V to 3.3V&lt;br /&gt;
* clock NIM input: NIM compatible&lt;br /&gt;
* clock TTL input: ???&lt;br /&gt;
* clock sine wave input: ???&lt;br /&gt;
&lt;br /&gt;
= Input channel mapping =&lt;br /&gt;
&lt;br /&gt;
* 0+16 : first ECL connector&lt;br /&gt;
* 16+16 : second ECL connector&lt;br /&gt;
* 32+8 : LEMO inputs (TTL)&lt;br /&gt;
* 40+18 : GPIO inputs (FPGA pins)&lt;br /&gt;
* 58 : external clock (10 MHz nominal)&lt;br /&gt;
* 59 : internal clock (100 MHz)&lt;br /&gt;
&lt;br /&gt;
= Functional units =&lt;br /&gt;
&lt;br /&gt;
== Scalers ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 10 ns (15 ns is safe) (sampled by 100 MHz/ 10 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 10 ns (15 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (2 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): 25 ns or more is safe&lt;br /&gt;
&lt;br /&gt;
== Timestamps (TSC) ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 100 ns (105 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 100 ns (105 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (5 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 200 ns (205 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
&lt;br /&gt;
Each TSC input has a 256 entry FIFO. (LE is 1 entry, TE is 1 entry, so 128 hits if both LE and TE enabled).&lt;br /&gt;
&lt;br /&gt;
== Output data fifo ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware before 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 4096 entries deep.&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 64k entries deep.&lt;br /&gt;
&lt;br /&gt;
= Initial hardware setup =&lt;br /&gt;
&lt;br /&gt;
* refer to DE10-NANO information here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* prepare hardware:&lt;br /&gt;
** remove chronobox from enclosure (cannot access JTAG connector when installed)&lt;br /&gt;
** remove DE10-Nano from chronobox baseboard&lt;br /&gt;
** check that SW10 jumpers are: U-D-U-U-D-U. (U=up, D=down, when &amp;quot;ALTERA&amp;quot; text on the FPGA is right side up)&lt;br /&gt;
** reinstall DE10-Nano on chronobox baseboard&lt;br /&gt;
** do NOT reinstall chronobox in enclosure&lt;br /&gt;
* prepare software:&lt;br /&gt;
** check that you have quartus 17.1 (at /opt/intelFPGA/17.1/ in this example)&lt;br /&gt;
** check that you installed chronobox software in /home/agdaq/online/chronobox_software&lt;br /&gt;
** check that you installed chronobox firmware project in /home/agdaq/online/firmware/git/chronobox_firmware&lt;br /&gt;
* connect serial console, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#Serial_console&lt;br /&gt;
** connect a mini-USB (*not* Micto-USB!) cable from mini-USB port on the side of the ethernet connection to a PC&lt;br /&gt;
** minicom -D /dev/ttyUSB0 -b 115200&lt;br /&gt;
* connect fpga jtag, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** connect a mini-USB (*not* Micro-USB!) cable on the side of HDMI and power connectors to a PC&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/jtagconfig&lt;br /&gt;
* prepare SD flash card for booting from network: generic instructions are here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_SD_flash&lt;br /&gt;
** connect new or used 8GB SD flash card to USB flash adapter to a linux computer&lt;br /&gt;
** login as root&lt;br /&gt;
** identify the flash device as /dev/sdX. Use &amp;quot;lsblk&amp;quot; or &amp;quot;blkid&amp;quot; or &amp;quot;dmesg&amp;quot;. be careful to not write to the computer system disk (usually /dev/sda)&lt;br /&gt;
** echo -e &#039;o\nn\np\n1\n2048\n4095\nn\np\n2\n4096\n1681816\nn\np\n3\n\n\nt\n1\na2\nt\n2\nb\nw&#039; | fdisk /dev/sdX&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
** remove card, reintall card, this is to ensure we use the new partition table&lt;br /&gt;
** fdisk -l /dev/sdX&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# fdisk -l /dev/sdg&lt;br /&gt;
Disk /dev/sdg: 7.38 GiB, 7910457344 bytes, 15450112 sectors&lt;br /&gt;
Disk model: STORAGE DEVICE  &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0xa033868b&lt;br /&gt;
&lt;br /&gt;
Device     Boot   Start      End  Sectors   Size Id Type&lt;br /&gt;
/dev/sdg1          2048     4095     2048     1M a2 unknown&lt;br /&gt;
/dev/sdg2          4096  1681816  1677721 819.2M  b W95 FAT32&lt;br /&gt;
/dev/sdg3       1683456 15450111 13766656   6.6G 83 Linux&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-1-fpga.img of=/dev/sdX1  bs=1024k&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-2-uboot.img of=/dev/sdX2  bs=1024k&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
* install prepared flash card into the chronobox DE10-Nano&lt;br /&gt;
* cycle power&lt;br /&gt;
* in the minicom window, IMMEDIATELY press the space bar to stop automatic booting (if it doesn&#039;t react, ensure flow control is disabled in minicom)&lt;br /&gt;
* you will have the uboot &amp;quot;=&amp;gt;&amp;quot; prompt&lt;br /&gt;
* confirm uboot version: U-Boot 2013.01.01&lt;br /&gt;
* setup uboot to boot linux from network, more details here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_network&lt;br /&gt;
** setenv ethaddr 02:aa:bb:cc:cb:04 # for cb04, see below for explanation&lt;br /&gt;
** setenv bootcmd &#039;run bridge_enable_handoff; run netboot&#039;&lt;br /&gt;
** setenv ramboot bootz \${loadaddr} - \${fdtaddr}&lt;br /&gt;
** setenv bootargs console=ttyS0,115200 ip=dhcp root=/dev/nfs rw nfsroot=192.168.1.1:/zssd1tb/nfsroot/%s,vers=3 panic=15&lt;br /&gt;
** saveenv&lt;br /&gt;
** reset&lt;br /&gt;
* DE10-Nano should boot into linux:&lt;br /&gt;
** uboot will restart&lt;br /&gt;
** DHCP will run&lt;br /&gt;
** tftp load of linux kernel will run&lt;br /&gt;
** linux kernel will start&lt;br /&gt;
** linux kernel will get an IP address&lt;br /&gt;
** linux kernel will NFS-mount the root filesystem (.../nfsroot/cb04)&lt;br /&gt;
** systemd will start all services&lt;br /&gt;
** there will be a login prompt on minicom console&lt;br /&gt;
** ssh will work (maybe 1 minute delay before it starts)&lt;br /&gt;
* try a few things:&lt;br /&gt;
** from agdaq or agmini account, ssh root@cb04&lt;br /&gt;
** &amp;quot;df&amp;quot; should show /home/agdaq is mounted (and ssh agdaq@cb04 should work)&lt;br /&gt;
** &amp;quot;/home/agdaq/online/chronobox_software/test_cb.exe 0&amp;quot; should fail (&amp;quot;bus error&amp;quot;) because FPGA is not loaded yet&lt;br /&gt;
* load sof file, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/quartus_pgm -m JTAG -o &amp;quot;p;/home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD.sof@2&amp;quot;&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should work now&lt;br /&gt;
* use srunner_cb.exe to load the pof file into FPGA boot flash&lt;br /&gt;
* use reboot_cb.exe to reboot the FPGA from flash&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should report the expected FPGA firmware version number.&lt;br /&gt;
* success.&lt;br /&gt;
&lt;br /&gt;
== assign ethernet MAC address ==&lt;br /&gt;
&lt;br /&gt;
Usually ethernet MAC address is assigned by manufacturer and is stored in a tiny little flash chip. The DE10-Nano board&lt;br /&gt;
is too cheap and does not have it. So a fake ethernet address has to be assigned manually from&lt;br /&gt;
the &amp;quot;locally administered range&amp;quot; of MAC addresses that start from &amp;quot;02:...&amp;quot;, see&lt;br /&gt;
https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses&lt;br /&gt;
&lt;br /&gt;
All MAC addresses must be unique on an ethernet network, but with manual assignement confusion is easy to create.&lt;br /&gt;
&lt;br /&gt;
For chronobox devices, use MAC addresses that start with &amp;quot;l02:aa:bb:cc:xx:yy&amp;quot; and have last digits &amp;quot;cb:01&amp;quot;, &amp;quot;cb:02&amp;quot;, &amp;quot;cb:03&amp;quot;, &amp;quot;cb04&amp;quot; for the first four chronoboxes.&lt;br /&gt;
&lt;br /&gt;
== new board test checklist ==&lt;br /&gt;
&lt;br /&gt;
to check newly built chronobox baseboard, follow this checklist.&lt;br /&gt;
&lt;br /&gt;
=== test ECL inputs ===&lt;br /&gt;
&lt;br /&gt;
* stop midas frontend&lt;br /&gt;
* ssh agdaq@alphagdaq ### or agmini@daq16&lt;br /&gt;
* ssh root@cb03&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe 0 ### read firmware revision, confirm communication with chronobox firmware&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### output should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xe0, gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect ECL ribbon cable from LeCroy 4616 NIM-to-ECL converter to chronobox ECL_P1 input (left one)&lt;br /&gt;
* ecl_p1 input should read 0x0000&lt;br /&gt;
* connect lemo jumper from NIM logic level 1 otput (i.e. any module OUT-bar output) to first channel of LeCroy 4616, ecl_p1 should read 0x0001&lt;br /&gt;
* move to 2nd channel, get 0x0002&lt;br /&gt;
* and so forth until last channel 0x8000.&lt;br /&gt;
* if any channel does not give expected reading, attach label (i.e. &amp;quot;ECL_P1 0x0002 bad&amp;quot;) and send for repair.&lt;br /&gt;
* repeat with ECL_P2 input (right one), watch printed value of ecl_p2.&lt;br /&gt;
&lt;br /&gt;
=== test TTL inputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in [[#Chronobox connectors]]&lt;br /&gt;
* disconnect all LEMO inputs&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_a # set bank A to input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_b # set bank B to input&lt;br /&gt;
* all 8 LEMO LEDs should be on&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### lemo inputs should read 0xFF&lt;br /&gt;
* connect LEMO 0 (left bottom) to TTL output of Lecroy 222 or equivalent, set &amp;quot;scale&amp;quot; to &amp;quot;latch&amp;quot;, operate push buttons to turn output on and off (LED should come in and out).&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xfe (~0x01), gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* change TTL signal from logic level 0 to 1 and back, observe the corresponding LED to turn on and off, observe the correct bit in the &amp;quot;lemo&amp;quot; column (watch the inverted input ~0x01) change.&lt;br /&gt;
* repeat with LEMO input 1 (left top) through 7 (right top).&lt;br /&gt;
&lt;br /&gt;
=== test TTL outputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in #Chronobox connectors&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for output&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0&lt;br /&gt;
* all LEMO LEDs should be off&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 0.135 V&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0xF&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0xF&lt;br /&gt;
* all LEMO LEDs should be on&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 3.4 to 3.8 V&lt;br /&gt;
* if you measure 1.69 V, the bank direction switch is still in the &amp;quot;input&amp;quot; position&lt;br /&gt;
* to test individual output, instead of 0xF use 0x1, 0x2, 0x4 and 0x8.&lt;br /&gt;
&lt;br /&gt;
=== test clock input ===&lt;br /&gt;
&lt;br /&gt;
* we test the TTL input mode first&lt;br /&gt;
* disconnect CLK_IN input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe intclk ### switch to internal timestamp clock&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00000000, freq 0.0 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0xa0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
notice: ts_clk frequency is around 10 MHz (internal oscillator) and ext_clk frequency is zero (nothing connected)&lt;br /&gt;
* if ts_clk is not around 10 MHz, PLL is not locked correctly, reboot the FPGA and try again: /home/agdaq/online/chronobox_software/test_cb.exe reboot&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;TTL&amp;quot; position&lt;br /&gt;
* connect LEMO cable from LEMO output 0 (bottom left) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_clk 0 ### output timestamp clock on LEMO output 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00cccccc, freq 9999999.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is the same as ts_clk frequency&lt;br /&gt;
* to test NIM input mode, we need a NIM clock signal, i.e. from a VME-NIMIO32, etc. Or use a TTL-to-NIM converter to use clock on LEMO output 0.&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;NIM&amp;quot; position&lt;br /&gt;
* connect VME-NIMIO32 NIM output 3 (40 MHz V1190 clock) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x03333c0c, freq 40001687.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is 40 MHz.&lt;br /&gt;
* to test &amp;quot;sine wave&amp;quot; input mode, TBW, do not have a sine wave signal source.&lt;br /&gt;
&lt;br /&gt;
K.O.&lt;br /&gt;
&lt;br /&gt;
=== test GPIO pins ===&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
= Install chronobox software =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_software.git&lt;br /&gt;
cd chronobox_software&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
ls -l *.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 18808 Aug 16 15:26 reboot_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 47256 Aug 16 15:26 srunner_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 20732 Aug 16 15:26 test_cb.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install chronobox quartus firmware project =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/firmware/git&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
git fetch ### update repository&lt;br /&gt;
git tag ### list available tags&lt;br /&gt;
git checkout 20210420_ko ### checkout a specific version&lt;br /&gt;
git status&lt;br /&gt;
cat timestamp.v ### confirm firmware version&lt;br /&gt;
ls -l output_files/*.{jic,sof,rpd}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5aceaed2 - April 2018 - all inputs connected to counters (except ext clock), 58 inputs, 50 MHz clock&lt;br /&gt;
* 0x5b6de806 - August 2018 - added fpga boot flash programmer and fpga reboot&lt;br /&gt;
* 0x5b7c827d - August 2018 - bshaw added debounce on GPIO inputs (for flow meters), 100 MHz clock&lt;br /&gt;
* 0x5b873169 - August 2018 - rebuilt, no changes&lt;br /&gt;
* 0x5b89e4b4 - August 2018 - added external clock signal, 59 inputs, 100 MHz clock&lt;br /&gt;
* 0x5b8de2b0 - September 2018 - added data fifo and timestamp counters (TSCs) for the first 4 inputs&lt;br /&gt;
* 0x5b906c56 - September 2018 - improved overflow markers, added scalers readout into the data fifo&lt;br /&gt;
* 0x5da8e4c2 - October 2019 - timestamps for all inputs, inversion of inputs&lt;br /&gt;
* 0x5db764a7 - October 2019 - FPGA reboot works now.&lt;br /&gt;
* 0x607f6709 - April 2021 - working timestamp synchronization, memory mapped registers, improved sdc file, correct clock transfers&lt;br /&gt;
* 0x60860e61 - April 2021 - faster data FIFO readout (from ~8 Mbytes/sec to ~80 Mbytes/sec)&lt;br /&gt;
* 0x61832695 - Nov 2021 - increase timestamp FIFO from 4k to 64k words&lt;br /&gt;
* 20220406_ko_0x624e22ad - April 2022 - make inputs edge-triggered instead of sampled.&lt;br /&gt;
* 20220420_ko_0x62608957 - April 2022 - fix first fifo data word is zero&lt;br /&gt;
&lt;br /&gt;
= Firmware update =&lt;br /&gt;
&lt;br /&gt;
* use srunner_cb.exe to load firmware RPD file into EPCQ flash memory.&lt;br /&gt;
* if FPGA is not running compatible firmware, srunner_cb will fail&lt;br /&gt;
* connect JTAG and load the firmware sof file from the quartus project (use &amp;quot;make load_sof&amp;quot;)&lt;br /&gt;
* if JTAG is connected, one can use &amp;quot;make load_jic&amp;quot; to load firmware jic file into EPCQ flash memory.&lt;br /&gt;
&lt;br /&gt;
After correct firmware is loaded, access to chronobox registers may fail (srunner_cb will not work)&lt;br /&gt;
because FPGA bridges are not enabled. To check, run following commands. If some bridge reports &amp;quot;disabled&amp;quot;, reboot linux (do not cycle the power!).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb02:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb02:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some DE10-Nano boards have an EPCQ64 flash memory chip, some have the EPCQ128 flash memory chip.&lt;br /&gt;
* identify EPCQ64 and use &amp;quot;-64&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x16 &lt;br /&gt;
Info: Serial Configuration Device - EPCS64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify EPCQ128 and use &amp;quot;-128&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x18 &lt;br /&gt;
Info: Serial Configuration Device - EPCS128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify -64 or -128 flash memory, write RPD file to flash memory, verify and reboot the fpga:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
#./srunner_cb.exe -read -128 test.rpd # read flash contents into a file&lt;br /&gt;
./srunner_cb.exe -program -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./srunner_cb.exe -verify -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./reboot_cb.exe # reboot the fpga into the new firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
for building firmware use: /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh daq01&lt;br /&gt;
cd online&lt;br /&gt;
git clone git@bitbucket.org:expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
/opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
make quartus&lt;br /&gt;
ls -l output_files/*.{sof,jic,rpd}&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7007185 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 olchansk users 8388833 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.jic&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7510701 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.sof&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
other make targets:&lt;br /&gt;
* make quartus - build fpga programmer files: sof, jic and rpd.&lt;br /&gt;
* make clean - clean the quartus project&lt;br /&gt;
* make qsys - regenerate the qsys block&lt;br /&gt;
* make jic - regenerate the jic file&lt;br /&gt;
* make load_sof - load sof file into fpga via jtag&lt;br /&gt;
* make load_jic - load jic file into fpga boot flash (epcq) via jtag&lt;br /&gt;
* make verify_jic - verify jic checksum in fpga boot flash (epcq)&lt;br /&gt;
&lt;br /&gt;
for jtag access, use /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq16:chronobox_firmware$ /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
1) DE-SoC [2-1.4.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) Remote server daq16: Unable to connect&lt;br /&gt;
&lt;br /&gt;
daq16:chronobox_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
* after regenerating qsys, manually edit ./soc_system/synthesis/submodules/hps_sdram_pll.sv to comment-out line &amp;quot;assign pll_dr_clk = clk_out[2];&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Firmware details =&lt;br /&gt;
&lt;br /&gt;
* DDR3 clock is 400 MHz (DDR3-800)&lt;br /&gt;
* memcpy speed ~1500 Mbytes/sec&lt;br /&gt;
* FIFO access single word read: 80, 44, 44 clocks at 10 ns/clock is 2.3 MHz at 4 bytes/word is 9 Mbytes/sec&lt;br /&gt;
* FIFO access memcpy: burst 2, delay 32, b4, delay 36, b5, d1, b5, d1, b5, d1, b1, delay 53, repeat. this reads 16 words in 72 clocks at 10 ns/clock is 1.388 MHz at 4*16=64 bytes/burst is 88.9 Mbytes/sec.&lt;br /&gt;
&lt;br /&gt;
= Chronobox firmware registers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0 | ro | sof_revision_in | all | firmware revision timestamp code&lt;br /&gt;
0 | wo | latch_scalers_out, zero_scalers_out | all | see [[#reg_0x00_write_bits]]&lt;br /&gt;
1 | rw | reg1_led_out | all | DE10-Nano LED output&lt;br /&gt;
2 | ro | switches_in | all | read DE10-Nano switches&lt;br /&gt;
3 | ro | buttons_in | all | read DE10-Nano buttons&lt;br /&gt;
4 | rw | reg4_test | all | 32-bit read-write test register&lt;br /&gt;
5 | rw | flash_programmer_in, reg5_flash_programmer_out | 0x5b6de806 | 0xABCD srunner flash programmer&lt;br /&gt;
6 | ro | ecl_in | all | read state of ECL inputs&lt;br /&gt;
7 | ro | reg7_test_in | all | ???&lt;br /&gt;
8 | rw | scaler_addr_out, reg8_scaler_data_in | all | top 16 bits of address becomes scaler bus address, 32 bit read is the corresponding scaler data&lt;br /&gt;
9 | ro | lemo_in | all | read state of LEMO inputs&lt;br /&gt;
10/0xA | ro | gpio_in | all | read state of GPIO inputs&lt;br /&gt;
11/0xB | rw | regB_lemo_out | all | LEMO output data&lt;br /&gt;
12/0xC | rw | regC_gpio_out | all | GPIO output data&lt;br /&gt;
13/0xD | rw | regD_out_enable_out | all | enable output tristates: [31:24] - LEMO_OUT, [17:0] - GPIO_OUT&lt;br /&gt;
14/0xE | rw | regE, reconfig_out | 0x5b6de806 | FPGA reboot: write inverted firmware revision (reg0) to reboot the FPGA&lt;br /&gt;
15/0xF | ro | regF_input_num_in | 0x5b89e4b4 | number of chronobox inputs (to read scalers, add 1 for the clock counter)&lt;br /&gt;
16/0x10 | ro | reg10_fifo_status | 0x5b8de2b0 | data fifo status, see below&lt;br /&gt;
17/0x11 | ro | reg11_fifo_data | 0x5b8de2b0 | data fifo data, see below&lt;br /&gt;
18/0x12 | rw | cb_invert_a | 0x5bf7557e | invert inputs 31..0&lt;br /&gt;
19/0x13 | rw | cb_invert_b | 0x5bf7557e | invert inputs 63..32&lt;br /&gt;
20/0x14 | rw | cb_enable_le_a | 0x5bf7557e | enable TSC leading edge inputs 31..0&lt;br /&gt;
21/0x15 | rw | cb_enable_le_b | 0x5bf7557e | enable TSC leading edge inputs 63..32&lt;br /&gt;
22/0x16 | rw | cb_enable_te_a | 0x5bf7557e | enable TSC trailing edge inputs 31..0&lt;br /&gt;
23/0x17 | rw | cb_enable_te_b | 0x5bf7557e | enable TSC trailing edge inputs 63..32&lt;br /&gt;
24/0x18 | ro | fc_ext_clk_100_counter | 0x5bf7557e | external clock frequency counter 100MHz reference&lt;br /&gt;
25/0x19 | ro | fc_ext_clk_ext_counter | 0x5bf7557e | external clock frequency counter&lt;br /&gt;
26/0x1A | ro | fc_ts_clk_100_counter | 0x5bf7557e | timestamp clock frequency counter 100MHz reference&lt;br /&gt;
27/0x1B | ro | fc_ts_clk_ts_counter | 0x5bf7557e | timestamp clock frequency counter&lt;br /&gt;
28/0x1C | ro | ts_clk_pll_status | 0x5bf7557e | timestamp clock PLL status&lt;br /&gt;
29/0x1D | rw | cb_lemo_out_mux_ctrl | 0x5bfdc798 | 8*4 bits to control 8 LEMO output multiplexers (4 bits/16 options each mux, see [[#LEMO outputs]])&lt;br /&gt;
30/0x1E | rw | cb_sync_mask[31:0] | 0x607f6709 | source of chronobox sync signal, low bits&lt;br /&gt;
31/0x1F | rw | cb_sync_mask[63:32] | 0x607f6709 | source of chronobox sync signal, high bits&lt;br /&gt;
32 | rw | cb_sync_reg[31:0], cb_sync_status[31:0] | 0x607f6709 | control of timestamp sync&lt;br /&gt;
33 | ro | tdc_fifo_status | DLTDC | TDC fifo status&lt;br /&gt;
34 | ro | tdc_fifo_data_lo | DLTDC | TDC fifo low 32-bits&lt;br /&gt;
35 | ro | tdc_fifo_data_hi | DLTDC | TDC fifo high 32-bits and fifo rdack&lt;br /&gt;
36 | rw | dl_input_mask | DLTDC | DL trigger input mask&lt;br /&gt;
37 | rw | dl_ctrl       | DLTDC | DL trigger control&lt;br /&gt;
38 | rw | tdc_input_mask | DLTDC | TDC input mask&lt;br /&gt;
39 | ro | axi_fifo_status | DLTDC | AXI fifo status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 0x00 write bits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | fw revision | quartus signal | description&lt;br /&gt;
0 | all | | latch scalers&lt;br /&gt;
1 | all | | zero scalers&lt;br /&gt;
2 | ... | fifo_rdreq_out | fifo_rdreq_out (not used in version 0x607f6709 and later)&lt;br /&gt;
3 | ... | ts_clk_pll_extswitch_out | clear ts_clk_pll_extswitch_out&lt;br /&gt;
4 | ... | ts_clk_pll_extswitch_out | set ts_clk_pll_extswitch_out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 16 fifo status ==&lt;br /&gt;
&lt;br /&gt;
Data fifo status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31: fifo_full - data fifo is current full&lt;br /&gt;
30: fifo_empty - data fifo is currently empty&lt;br /&gt;
29: cb_fifo_ch_full - TSC per-channel fifos have overflown at some point&lt;br /&gt;
28: fifo_full_latch - data fifo has overflown at some point&lt;br /&gt;
24+4: 0&lt;br /&gt;
0+24: fifo_usedw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 28 ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock PLL status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : PLL locked&lt;br /&gt;
30 : PLL active clock (0=internal, 1=external&lt;br /&gt;
29 : external clock bad&lt;br /&gt;
28 : internal clock bad&lt;br /&gt;
27 : ts_clk_pll_extswitch&lt;br /&gt;
0..26 : not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 32 timestamp sync ==&lt;br /&gt;
&lt;br /&gt;
Timestamp synchronization register bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : write 1 to arm timestamp sync circuit, scalers and TSCs are placed in reset state&lt;br /&gt;
30 : write 1 to disarm timestamp sync circuit, reset is released&lt;br /&gt;
...&lt;br /&gt;
16 : write 1 to send a timestamp sync signal&lt;br /&gt;
15 : sync circuit armed&lt;br /&gt;
14 : sync done&lt;br /&gt;
13 : sync signal received (cleared by writing bits 31 or 30)&lt;br /&gt;
12 : 0&lt;br /&gt;
11 : sync circuit armed, clk_ts section&lt;br /&gt;
10 : sync done, clk_ts section&lt;br /&gt;
9  : sync signal received, clk_ts section&lt;br /&gt;
8  : 0&lt;br /&gt;
7  : unused&lt;br /&gt;
...&lt;br /&gt;
0  : unused&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nominal sequence for synchronizing timestamps:&lt;br /&gt;
* make sure nothing is sending the external sync signal (i.e. run is stopped, etc)&lt;br /&gt;
* arm the sync circuit: cb_write32(32, 0x80000000); cb_write32(32, 0);&lt;br /&gt;
* check that the arming was successful: cb_read32(32), only bits 0x8800 should be set&lt;br /&gt;
* scalers are in reset state, not incrementing&lt;br /&gt;
* TSCs are in reset state, no data in the TSC FIFO&lt;br /&gt;
* some time later, send the external sync signal&lt;br /&gt;
* or send the internal sync signal: cb_write32(32, 0x10000); cb_write32(32, 0);&lt;br /&gt;
* check that the timestamp reset happened: cb_read32(32), bits 0x6600 should be set, bits 0x8800 should be cleared&lt;br /&gt;
* check that the scalers are counting, check that there is TSC data in the TSC FIFO&lt;br /&gt;
&lt;br /&gt;
== reg 33, 39 TDC and AXI FIFO status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | mask       | quartus signal | description&lt;br /&gt;
 31 | 0x80000000 | fifo empty&lt;br /&gt;
  8 | 0x00000100 | fifo full&lt;br /&gt;
7:0 | 0x000000FF | fifo usedw (64-bit words)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timestamp clock ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock is 10 MHz selectable from internal oscillator or external reference on the CLK_IN input.&lt;br /&gt;
&lt;br /&gt;
CLK_IN input can be selected using 2 two-position jumpers:&lt;br /&gt;
* NIM input: CLK&amp;lt;-&amp;gt;NIM/TTL and CLK&amp;lt;-&amp;gt;NIM&lt;br /&gt;
&lt;br /&gt;
To select the clock from command line, use:&lt;br /&gt;
* test_cb.exe intclk # select internal clock&lt;br /&gt;
* test_cb.exe extclk # select external clock&lt;br /&gt;
&lt;br /&gt;
From software:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Chronobox* cb = ...;&lt;br /&gt;
cb-&amp;gt;cb_int_clock(); # select internal clock&lt;br /&gt;
cb-&amp;gt;cb_ext_clock(); # select external clock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see current status, run &amp;quot;test_cb.exe clocks&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./test_cb.exe clocks&lt;br /&gt;
...&lt;br /&gt;
Chronobox firmware revision: 0x5bf7557e&lt;br /&gt;
...&lt;br /&gt;
clock status: ext_clk: counter 0x00cccf2a, freq 10000450.9 Hz, ts_clk: counter 0x00cccf2a, freq 10000450.9 Hz, PLL status 0xc0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reported is external clock frequency, currently selected timestamp clock frequency and PLL status (register 0x1C).&lt;br /&gt;
&lt;br /&gt;
Normal values for the PLL status:&lt;br /&gt;
* internal clock: 0x80000000&lt;br /&gt;
* external clock: 0xC0000000&lt;br /&gt;
* external clock selected, but invalid: 0x60000000&lt;br /&gt;
* internal clock selected, external clock invalid: 0xa0000000&lt;br /&gt;
&lt;br /&gt;
Disconnected/absent/broken external clock will report ext_clk frequency zero, bit 0x20000000 in the PLL status register 0x1C.&lt;br /&gt;
&lt;br /&gt;
If external clock is CDM, set chronobox clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;NIM&amp;quot;, use CDM 10 MHz clock output LEMO3B.&lt;br /&gt;
&lt;br /&gt;
If external clock is another chronobox (usually LEMO output 0), set clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;TTL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== LEMO outputs ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors can be used as TTL level outputs:&lt;br /&gt;
&lt;br /&gt;
* set the &amp;quot;bank a&amp;quot; and/or &amp;quot;bank b&amp;quot; jumpers for &amp;quot;output&amp;quot;&lt;br /&gt;
* set the lemo output multiplexor bits in register 0x1D&lt;br /&gt;
* set the &amp;quot;lemo output enable&amp;quot; bit in register 0x0D, use bits 24..31 for LEMO outputs 0..7.&lt;br /&gt;
* observe the corresponding LED is on or off according to the LEMO output TTL logic level&lt;br /&gt;
&lt;br /&gt;
The function of each LEMO output is controlled by the lemo output multiplexor. Up to 16 different&lt;br /&gt;
signals can be routed into each output. This is controlled by register 0x1D.&lt;br /&gt;
&lt;br /&gt;
Register 0x1D multiplexor control is 32 bits organized into 8 groups of 4 bits, per each of the 8 LEMO outputs: 0x76543210,&lt;br /&gt;
i.e. value 0x00000001 routes signal function 1 into output 0, and signal function 0 into outputs 1..7.&lt;br /&gt;
&lt;br /&gt;
For each output, there are 16 possible signal functions (4 bits):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | firmware signal | firmware revision | signal description&lt;br /&gt;
0 | cb_lemo_out_reg[n] | 0x5bfdc798 | output is controlled by register 0xB bits 0..7 for outputs 0..7&lt;br /&gt;
1 | clk_ts | 0x5bfdc798 | output is the 10MHz timestamp clock&lt;br /&gt;
2 | cb_sync_in_clk_ts | 0x607f6709 | daisy-chained timestamp sync signal (from control register or from sync input, see registers 30 and 31. see bit 0x10000 in register 32)&lt;br /&gt;
3..30 | gnd | 0x5bfdc798 | not used&lt;br /&gt;
31 | vcc | 0x5bfdc798 | logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== front panel LEDs ==&lt;br /&gt;
&lt;br /&gt;
The front panel LEDs are numbered 0..7 per [[#Chronobox_connectors]]&lt;br /&gt;
&lt;br /&gt;
Each LED can be individually lit by setting a bit in register 0x1 bits 8..15.&lt;br /&gt;
&lt;br /&gt;
If LEMO outputs are active, corresponding LEDs will show LEMO output status (logic level 1 -&amp;gt; LED is on, logic level 0 -&amp;gt; LED is off).&lt;br /&gt;
&lt;br /&gt;
If LEMO inputs are active ...&lt;br /&gt;
&lt;br /&gt;
== Synchronization of multiple chronoboxes ==&lt;br /&gt;
&lt;br /&gt;
To operate several chronoboxes as one unit, they must have two common signals, a clock and a sync signal.&lt;br /&gt;
&lt;br /&gt;
Each chronobox must be configured as:&lt;br /&gt;
* master: this will issue the sync signal&lt;br /&gt;
* slave: will receive the clock and sync signals from master&lt;br /&gt;
* slave daisy-chain: and pass them to the next slave down the chain&lt;br /&gt;
* (one can use the CDM or the TRG as sync masters)&lt;br /&gt;
&lt;br /&gt;
For the purpose of this example (recommended configuration), set the LEMO direction jumpers:&lt;br /&gt;
* bank A: set to &amp;quot;out&amp;quot;: master and slave daisy-chain clock and sync output&lt;br /&gt;
* bank B: set to &amp;quot;in&amp;quot;: slave sync input&lt;br /&gt;
&lt;br /&gt;
Clock connections:&lt;br /&gt;
* sync master can be configured with external or internal clock (CLK_IN input)&lt;br /&gt;
* sync slave must be configured with external clock (CLK_IN input)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #0 -&amp;gt; slave CLK_IN, LEMO #0 -&amp;gt; next slave CLK_IN, LEMO #0 -&amp;gt; ...&lt;br /&gt;
10 MHz clock from CDM &amp;amp; etc -&amp;gt; sync master CLK_IN, LEMO #0 -&amp;gt; slave CLK_IN, ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync connections:&lt;br /&gt;
* sync signal can be generated externally by the CDM or TRG&lt;br /&gt;
* sync signal can be generated internally by writing 0x10000 into reg 32 of sync master&lt;br /&gt;
* (sync must be armed on the master and all slaves before sending the first sync signal, write 0x80000000 into reg 32)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #1 -&amp;gt; slave LEMO #4, LEMO #1 -&amp;gt; next slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
external sync -&amp;gt; master LEMO #4, LEMO #1 -&amp;gt; slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync configuration: (see register 32 for explanation!)&lt;br /&gt;
* master and slave: disarm sync: write 0x40000000 to reg 32, write 0 to reg 32, bits 0x8800 and 0x6600 should clear&lt;br /&gt;
* master and slave daisy chain: setup clock and sync outputs:&lt;br /&gt;
** register 29 lemo output mux to 0xXXXX&#039;XX21 (2=output sync signal, 1=output clock)&lt;br /&gt;
** register 13 lemo output enable, set bits 0x0F00&#039;0000 (set bank A jumper for &amp;quot;out&amp;quot;)&lt;br /&gt;
* slave and slave daisy chain: enable external sync from LEMO #4:&lt;br /&gt;
** register 30, write 0&lt;br /&gt;
** register 31, write 0x10&lt;br /&gt;
* master: switch to external or internal clock, as needed&lt;br /&gt;
* slave: switch to external clock&lt;br /&gt;
* master and slave: arm sync: write 0x80000000 to reg 32, write 0 to reg 32, bits 0x8800 should turn on.&lt;br /&gt;
* timestamps, scalers and data fifo go into the reset state, all old data is cleared&lt;br /&gt;
* when sync is received, timestamp is reset to zero, reset state is cleared and there should be data into FIFO. reg 32 will read 0x6600.&lt;br /&gt;
* if using external sync (no master), wait for reg 32 bits to become 0x6600 (sync completed)&lt;br /&gt;
* master: issue sync signal, write 0x10000 to reg 32, write 0 to reg 32. master reg 32 should read 0x6600, slave reg 32 should read 0x6600.&lt;br /&gt;
&lt;br /&gt;
== FIFO data format ==&lt;br /&gt;
&lt;br /&gt;
* 0x8ntttttt: TSC data, 24 bits &amp;quot;tttttt&amp;quot; of timestamp, 7 bits &amp;quot;nn&amp;quot; of channel number, top bit set to 1. Low bit of &amp;quot;t&amp;quot; indicates 0=leading edge, 1=trailing edge.&lt;br /&gt;
* 0xffTTmmmm: (before 20220420_ko_0x62608957) timestamp wrap around marker: &amp;quot;TT&amp;quot; is the top 8 bits of the timestamp, &amp;quot;mmmm&amp;quot; is a 16 bit counter&lt;br /&gt;
* 0xff8mmmmm: timestamp wrap around marker: bit 24 is the top bit of the timestamp (0/8), &amp;quot;mmmmm&amp;quot; is a 23 bit counter&lt;br /&gt;
* 0xfe00nnnn: scaler data, following &amp;quot;nnnn&amp;quot; words are the latched scalers&lt;br /&gt;
* 0xfd000000: start of data after chronobox sync (cbtrg only, for now)&lt;br /&gt;
&lt;br /&gt;
Time range is (before 20220420_ko_0x62608957):&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 15 bits of &amp;quot;mmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x00007FFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$22 = 15.270527886249999 ### in hours&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Time range is:&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 22 bits of &amp;quot;mmmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x003FFFFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$2 = 1954.6867557262499 ### in hours&lt;br /&gt;
$3 = 81.445281488593736 ### in days&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== timestamp wrap around marker ==&lt;br /&gt;
&lt;br /&gt;
The timestamp data is only 24 bits, to allow timestamping&lt;br /&gt;
with longer time range, wrap around markers are added to the&lt;br /&gt;
data stream.&lt;br /&gt;
&lt;br /&gt;
For input signals that arrive close to the time of timestamp wrap around,&lt;br /&gt;
there is ambiguity in the ordering of the data fifo: does the wrap around&lt;br /&gt;
marker or the signal timestamp show up first? For example for rare&lt;br /&gt;
signals, one can see this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1&lt;br /&gt;
wrap 2&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3&lt;br /&gt;
wrap 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
does the hit belong with wrap marker 2 (written to the fifo just after wrap marker 2)&lt;br /&gt;
or with marker 3 (written to the fifo just before wrap marker 3)?&lt;br /&gt;
&lt;br /&gt;
To remove this ambiguity, additional markers are written to the data stream&lt;br /&gt;
half way between the wrap arounds, making it obvious that the signal&lt;br /&gt;
arrived right after wrap marker 3 (but was written to the FIFO before the marker):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1 0x00&lt;br /&gt;
wrap 1 0x80&lt;br /&gt;
wrap 2 0x00&lt;br /&gt;
wrap 2 0x80&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3 0x00&lt;br /&gt;
wrap 3 0x80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= test_cb.exe =&lt;br /&gt;
&lt;br /&gt;
test_cb.exe is the general test program for the chronobox.&lt;br /&gt;
&lt;br /&gt;
* test_cb.exe 0 # read chronobox register 0&lt;br /&gt;
* test_cb.exe 4 0x1234 # write to chronobox register 4&lt;br /&gt;
* test_cb.exe fpga 0 # read FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe fpga 0 0x12345678 # write 0x12345678 to FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe reboot # reboot the FPGA (the ARM CPU keeps running)&lt;br /&gt;
* test_cb.exe scalers # read all scalers in a loop&lt;br /&gt;
* test_cb.exe fifo # read the data fifo in a loop&lt;br /&gt;
* test_cb.exe tsfifo # read the timestamp fifo in a loop (do not latch scalers)&lt;br /&gt;
* test_cb.exe intclk # select internal timestamp clock&lt;br /&gt;
* test_cb.exe extclk # select external timestamp clock (10MHz)&lt;br /&gt;
* test_cb.exe clocks # report current status of timestamp clock&lt;br /&gt;
&lt;br /&gt;
= Errata =&lt;br /&gt;
&lt;br /&gt;
* 0x607f6709 - after FIFO reset (timestamp sync, etc), the first word in the FIFO is always 0x00000000, not a real timestamps.&lt;br /&gt;
* 20220420_ko_0x62608957 - after FIFO reset (timestamp sync), the first word in the FIFO is 0xFF000000, a timestamp overflow marker, as expected. after FPGA reboot (before timestamp sync), the first word in the FIFO is also 0xFF000000 for reasons unknown.&lt;br /&gt;
* linux - after power up, chronobox registers are not accessible, check that the FPGA bridges are enabled, if any bridge reports &amp;quot;disabled&amp;quot;, reboot linux. do NOT cycle power.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb04:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* FIXED 23apr2021 - use updated &amp;quot;bootcmd&amp;quot;. figure out why FPGA bridges are disabled on first power up&lt;br /&gt;
* figure out how to load FPGA sof from Linux, probably need new kernel&lt;br /&gt;
* FIXED apr2022, use fw_printenv build from source - fix fw_printenv, probably requires using newer uboot&lt;br /&gt;
* add mmap driver for FPGA LW bridge, probably need new kernel&lt;br /&gt;
* figure out how to build linux kernel from git (now using kernel from GHRD demo kit)&lt;br /&gt;
* enable watchdog timer to auto-reboot on hang&lt;br /&gt;
* figure out why ssh takes 30 second to start. read this: https://daniel-lange.com/archives/152-Openssh-taking-minutes-to-become-available,-booting-takes-half-an-hour-...-because-your-server-waits-for-a-few-bytes-of-randomness.html https://lwn.net/Articles/800509/&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - fix problem on startup first word in the FIFO is 0x00000000.&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - increase number of bits in the timestamp wraparound counter: 0xFF8mmmmm -&amp;gt; 23 bits is possible, keep high bit 0x00800000 as is.&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=981</id>
		<title>Chronobox</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Chronobox&amp;diff=981"/>
		<updated>2024-07-15T00:16:31Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Chronobox firmware registers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Chronobox =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_software&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/chrono-box/rev0&lt;br /&gt;
* https://bitbucket.org/expalpha/chronobox_firmware/src/master/docs/Chrono.pdf&lt;br /&gt;
&lt;br /&gt;
= Chronobox connectors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| LEMO - CLK_IN - jumpers: SINE&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;NIM/TTL and NIM&amp;lt;-&amp;gt;CLK&amp;lt;-&amp;gt;TTL&lt;br /&gt;
|&lt;br /&gt;
| ECL P1&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| ECL P2&lt;br /&gt;
| 32&lt;br /&gt;
| |&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
| PLED - power-on LED&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank A direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 0-1&lt;br /&gt;
| LED  0-1&lt;br /&gt;
| LEMO 2-3&lt;br /&gt;
| LED  2-3&lt;br /&gt;
|&lt;br /&gt;
| jumper: bank B direction IN&amp;lt;-&amp;gt;X&amp;lt;-&amp;gt;OUT&lt;br /&gt;
| LEMO 4-5&lt;br /&gt;
| LED  4-5&lt;br /&gt;
| LEMO 6-7&lt;br /&gt;
| LED  6-7&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Electrical connections =&lt;br /&gt;
&lt;br /&gt;
* ECL P1 and P2: LeCroy 4616 compatible&lt;br /&gt;
* LEMO TTL inputs: 0..5V, logic level 0: &amp;lt;0.8V, logic level 1: &amp;gt;2V&lt;br /&gt;
* LEMO TTL outputs: logic level 0: 0V, logic level 1: 5V to 3.3V&lt;br /&gt;
* clock NIM input: NIM compatible&lt;br /&gt;
* clock TTL input: ???&lt;br /&gt;
* clock sine wave input: ???&lt;br /&gt;
&lt;br /&gt;
= Input channel mapping =&lt;br /&gt;
&lt;br /&gt;
* 0+16 : first ECL connector&lt;br /&gt;
* 16+16 : second ECL connector&lt;br /&gt;
* 32+8 : LEMO inputs (TTL)&lt;br /&gt;
* 40+18 : GPIO inputs (FPGA pins)&lt;br /&gt;
* 58 : external clock (10 MHz nominal)&lt;br /&gt;
* 59 : internal clock (100 MHz)&lt;br /&gt;
&lt;br /&gt;
= Functional units =&lt;br /&gt;
&lt;br /&gt;
== Scalers ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 10 ns (15 ns is safe) (sampled by 100 MHz/ 10 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 10 ns (15 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (2 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): 25 ns or more is safe&lt;br /&gt;
&lt;br /&gt;
== Timestamps (TSC) ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width (leading edge to trailing edge): longer than 100 ns (105 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 100 ns (105 ns is safe) (ditto)&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
* minimum pulse width: leading edge triggered (5 ns is safe)&lt;br /&gt;
* minimum time between pulses (trailing edge to next leading edge): longer than 200 ns (205 ns is safe) (sampled by 10 MHz/100 ns clock)&lt;br /&gt;
&lt;br /&gt;
Each TSC input has a 256 entry FIFO. (LE is 1 entry, TE is 1 entry, so 128 hits if both LE and TE enabled).&lt;br /&gt;
&lt;br /&gt;
== Output data fifo ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
=== Firmware before 0x61832695 ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 4096 entries deep.&lt;br /&gt;
&lt;br /&gt;
=== Firmware 0x624e22ad ===&lt;br /&gt;
&lt;br /&gt;
Output fifo is 64k entries deep.&lt;br /&gt;
&lt;br /&gt;
= Initial hardware setup =&lt;br /&gt;
&lt;br /&gt;
* refer to DE10-NANO information here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano&lt;br /&gt;
* prepare hardware:&lt;br /&gt;
** remove chronobox from enclosure (cannot access JTAG connector when installed)&lt;br /&gt;
** remove DE10-Nano from chronobox baseboard&lt;br /&gt;
** check that SW10 jumpers are: U-D-U-U-D-U. (U=up, D=down, when &amp;quot;ALTERA&amp;quot; text on the FPGA is right side up)&lt;br /&gt;
** reinstall DE10-Nano on chronobox baseboard&lt;br /&gt;
** do NOT reinstall chronobox in enclosure&lt;br /&gt;
* prepare software:&lt;br /&gt;
** check that you have quartus 17.1 (at /opt/intelFPGA/17.1/ in this example)&lt;br /&gt;
** check that you installed chronobox software in /home/agdaq/online/chronobox_software&lt;br /&gt;
** check that you installed chronobox firmware project in /home/agdaq/online/firmware/git/chronobox_firmware&lt;br /&gt;
* connect serial console, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#Serial_console&lt;br /&gt;
** connect a mini-USB (*not* Micto-USB!) cable from mini-USB port on the side of the ethernet connection to a PC&lt;br /&gt;
** minicom -D /dev/ttyUSB0 -b 115200&lt;br /&gt;
* connect fpga jtag, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** connect a mini-USB (*not* Micro-USB!) cable on the side of HDMI and power connectors to a PC&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/jtagconfig&lt;br /&gt;
* prepare SD flash card for booting from network: generic instructions are here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_SD_flash&lt;br /&gt;
** connect new or used 8GB SD flash card to USB flash adapter to a linux computer&lt;br /&gt;
** login as root&lt;br /&gt;
** identify the flash device as /dev/sdX. Use &amp;quot;lsblk&amp;quot; or &amp;quot;blkid&amp;quot; or &amp;quot;dmesg&amp;quot;. be careful to not write to the computer system disk (usually /dev/sda)&lt;br /&gt;
** echo -e &#039;o\nn\np\n1\n2048\n4095\nn\np\n2\n4096\n1681816\nn\np\n3\n\n\nt\n1\na2\nt\n2\nb\nw&#039; | fdisk /dev/sdX&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
** remove card, reintall card, this is to ensure we use the new partition table&lt;br /&gt;
** fdisk -l /dev/sdX&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# fdisk -l /dev/sdg&lt;br /&gt;
Disk /dev/sdg: 7.38 GiB, 7910457344 bytes, 15450112 sectors&lt;br /&gt;
Disk model: STORAGE DEVICE  &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0xa033868b&lt;br /&gt;
&lt;br /&gt;
Device     Boot   Start      End  Sectors   Size Id Type&lt;br /&gt;
/dev/sdg1          2048     4095     2048     1M a2 unknown&lt;br /&gt;
/dev/sdg2          4096  1681816  1677721 819.2M  b W95 FAT32&lt;br /&gt;
/dev/sdg3       1683456 15450111 13766656   6.6G 83 Linux&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-1-fpga.img of=/dev/sdX1  bs=1024k&lt;br /&gt;
** dd if=/daq/daqstore/olchansk/daq/DE10-Nano/image-2-uboot.img of=/dev/sdX2  bs=1024k&lt;br /&gt;
** eject /dev/sdX&lt;br /&gt;
* install prepared flash card into the chronobox DE10-Nano&lt;br /&gt;
* cycle power&lt;br /&gt;
* in the minicom window, IMMEDIATELY press the space bar to stop automatic booting (if it doesn&#039;t react, ensure flow control is disabled in minicom)&lt;br /&gt;
* you will have the uboot &amp;quot;=&amp;gt;&amp;quot; prompt&lt;br /&gt;
* confirm uboot version: U-Boot 2013.01.01&lt;br /&gt;
* setup uboot to boot linux from network, more details here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#boot_Linux_from_network&lt;br /&gt;
** setenv ethaddr 02:aa:bb:cc:cb:04 # for cb04, see below for explanation&lt;br /&gt;
** setenv bootcmd &#039;run bridge_enable_handoff; run netboot&#039;&lt;br /&gt;
** setenv ramboot bootz \${loadaddr} - \${fdtaddr}&lt;br /&gt;
** setenv bootargs console=ttyS0,115200 ip=dhcp root=/dev/nfs rw nfsroot=192.168.1.1:/zssd1tb/nfsroot/%s,vers=3 panic=15&lt;br /&gt;
** saveenv&lt;br /&gt;
** reset&lt;br /&gt;
* DE10-Nano should boot into linux:&lt;br /&gt;
** uboot will restart&lt;br /&gt;
** DHCP will run&lt;br /&gt;
** tftp load of linux kernel will run&lt;br /&gt;
** linux kernel will start&lt;br /&gt;
** linux kernel will get an IP address&lt;br /&gt;
** linux kernel will NFS-mount the root filesystem (.../nfsroot/cb04)&lt;br /&gt;
** systemd will start all services&lt;br /&gt;
** there will be a login prompt on minicom console&lt;br /&gt;
** ssh will work (maybe 1 minute delay before it starts)&lt;br /&gt;
* try a few things:&lt;br /&gt;
** from agdaq or agmini account, ssh root@cb04&lt;br /&gt;
** &amp;quot;df&amp;quot; should show /home/agdaq is mounted (and ssh agdaq@cb04 should work)&lt;br /&gt;
** &amp;quot;/home/agdaq/online/chronobox_software/test_cb.exe 0&amp;quot; should fail (&amp;quot;bus error&amp;quot;) because FPGA is not loaded yet&lt;br /&gt;
* load sof file, for more info, go here: https://daq.triumf.ca/DaqWiki/index.php/DE10-Nano#JTAG&lt;br /&gt;
** /opt/intelFPGA/17.1/quartus/bin/quartus_pgm -m JTAG -o &amp;quot;p;/home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD.sof@2&amp;quot;&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should work now&lt;br /&gt;
* use srunner_cb.exe to load the pof file into FPGA boot flash&lt;br /&gt;
* use reboot_cb.exe to reboot the FPGA from flash&lt;br /&gt;
* &amp;quot;test_cb.exe 0&amp;quot; should report the expected FPGA firmware version number.&lt;br /&gt;
* success.&lt;br /&gt;
&lt;br /&gt;
== assign ethernet MAC address ==&lt;br /&gt;
&lt;br /&gt;
Usually ethernet MAC address is assigned by manufacturer and is stored in a tiny little flash chip. The DE10-Nano board&lt;br /&gt;
is too cheap and does not have it. So a fake ethernet address has to be assigned manually from&lt;br /&gt;
the &amp;quot;locally administered range&amp;quot; of MAC addresses that start from &amp;quot;02:...&amp;quot;, see&lt;br /&gt;
https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses&lt;br /&gt;
&lt;br /&gt;
All MAC addresses must be unique on an ethernet network, but with manual assignement confusion is easy to create.&lt;br /&gt;
&lt;br /&gt;
For chronobox devices, use MAC addresses that start with &amp;quot;l02:aa:bb:cc:xx:yy&amp;quot; and have last digits &amp;quot;cb:01&amp;quot;, &amp;quot;cb:02&amp;quot;, &amp;quot;cb:03&amp;quot;, &amp;quot;cb04&amp;quot; for the first four chronoboxes.&lt;br /&gt;
&lt;br /&gt;
== new board test checklist ==&lt;br /&gt;
&lt;br /&gt;
to check newly built chronobox baseboard, follow this checklist.&lt;br /&gt;
&lt;br /&gt;
=== test ECL inputs ===&lt;br /&gt;
&lt;br /&gt;
* stop midas frontend&lt;br /&gt;
* ssh agdaq@alphagdaq ### or agmini@daq16&lt;br /&gt;
* ssh root@cb03&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe 0 ### read firmware revision, confirm communication with chronobox firmware&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### output should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xe0, gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect ECL ribbon cable from LeCroy 4616 NIM-to-ECL converter to chronobox ECL_P1 input (left one)&lt;br /&gt;
* ecl_p1 input should read 0x0000&lt;br /&gt;
* connect lemo jumper from NIM logic level 1 otput (i.e. any module OUT-bar output) to first channel of LeCroy 4616, ecl_p1 should read 0x0001&lt;br /&gt;
* move to 2nd channel, get 0x0002&lt;br /&gt;
* and so forth until last channel 0x8000.&lt;br /&gt;
* if any channel does not give expected reading, attach label (i.e. &amp;quot;ECL_P1 0x0002 bad&amp;quot;) and send for repair.&lt;br /&gt;
* repeat with ECL_P2 input (right one), watch printed value of ecl_p2.&lt;br /&gt;
&lt;br /&gt;
=== test TTL inputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in [[#Chronobox connectors]]&lt;br /&gt;
* disconnect all LEMO inputs&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_a # set bank A to input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_in_b # set bank B to input&lt;br /&gt;
* all 8 LEMO LEDs should be on&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs ### lemo inputs should read 0xFF&lt;br /&gt;
* connect LEMO 0 (left bottom) to TTL output of Lecroy 222 or equivalent, set &amp;quot;scale&amp;quot; to &amp;quot;latch&amp;quot;, operate push buttons to turn output on and off (LED should come in and out).&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inputs: ecl_p1: 0xaa55, ecl_p2: 0xaa55, lemo: 0xfe (~0x01), gpio: 0x3ffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* change TTL signal from logic level 0 to 1 and back, observe the corresponding LED to turn on and off, observe the correct bit in the &amp;quot;lemo&amp;quot; column (watch the inverted input ~0x01) change.&lt;br /&gt;
* repeat with LEMO input 1 (left top) through 7 (right top).&lt;br /&gt;
&lt;br /&gt;
=== test TTL outputs ===&lt;br /&gt;
&lt;br /&gt;
* NOTE: front panel LEMO connector labels are wrong. correct numbering of LEMO connectors is as shown in #Chronobox connectors&lt;br /&gt;
* set &amp;quot;bank A direction&amp;quot; and &amp;quot;bank B direction&amp;quot; for output&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0&lt;br /&gt;
* all LEMO LEDs should be off&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 0.135 V&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_a 0xF&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_b 0xF&lt;br /&gt;
* all LEMO LEDs should be on&lt;br /&gt;
* with voltmeter measure LEMO output voltage should be 3.4 to 3.8 V&lt;br /&gt;
* if you measure 1.69 V, the bank direction switch is still in the &amp;quot;input&amp;quot; position&lt;br /&gt;
* to test individual output, instead of 0xF use 0x1, 0x2, 0x4 and 0x8.&lt;br /&gt;
&lt;br /&gt;
=== test clock input ===&lt;br /&gt;
&lt;br /&gt;
* we test the TTL input mode first&lt;br /&gt;
* disconnect CLK_IN input&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe intclk ### switch to internal timestamp clock&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00000000, freq 0.0 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0xa0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
notice: ts_clk frequency is around 10 MHz (internal oscillator) and ext_clk frequency is zero (nothing connected)&lt;br /&gt;
* if ts_clk is not around 10 MHz, PLL is not locked correctly, reboot the FPGA and try again: /home/agdaq/online/chronobox_software/test_cb.exe reboot&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;TTL&amp;quot; position&lt;br /&gt;
* connect LEMO cable from LEMO output 0 (bottom left) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe lemo_out_clk 0 ### output timestamp clock on LEMO output 0&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x00cccccc, freq 9999999.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is the same as ts_clk frequency&lt;br /&gt;
* to test NIM input mode, we need a NIM clock signal, i.e. from a VME-NIMIO32, etc. Or use a TTL-to-NIM converter to use clock on LEMO output 0.&lt;br /&gt;
* set CLK_IN jumpers to &amp;quot;TTL/NIM&amp;quot; and &amp;quot;NIM&amp;quot; position&lt;br /&gt;
* connect VME-NIMIO32 NIM output 3 (40 MHz V1190 clock) to CLK_IN&lt;br /&gt;
* /home/agdaq/online/chronobox_software/test_cb.exe clocks&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clock status: ext_clk: counter 0x03333c0c, freq 40001687.4 Hz, ts_clk: counter 0x00cccccc, freq 9999999.4 Hz, PLL status 0x80000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe ext_clk frequency is 40 MHz.&lt;br /&gt;
* to test &amp;quot;sine wave&amp;quot; input mode, TBW, do not have a sine wave signal source.&lt;br /&gt;
&lt;br /&gt;
K.O.&lt;br /&gt;
&lt;br /&gt;
=== test GPIO pins ===&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
= Install chronobox software =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_software.git&lt;br /&gt;
cd chronobox_software&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
ls -l *.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 18808 Aug 16 15:26 reboot_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 47256 Aug 16 15:26 srunner_cb.exe&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 20732 Aug 16 15:26 test_cb.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install chronobox quartus firmware project =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/firmware/git&lt;br /&gt;
git clone https://bitbucket.org/expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
git fetch ### update repository&lt;br /&gt;
git tag ### list available tags&lt;br /&gt;
git checkout 20210420_ko ### checkout a specific version&lt;br /&gt;
git status&lt;br /&gt;
cat timestamp.v ### confirm firmware version&lt;br /&gt;
ls -l output_files/*.{jic,sof,rpd}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5aceaed2 - April 2018 - all inputs connected to counters (except ext clock), 58 inputs, 50 MHz clock&lt;br /&gt;
* 0x5b6de806 - August 2018 - added fpga boot flash programmer and fpga reboot&lt;br /&gt;
* 0x5b7c827d - August 2018 - bshaw added debounce on GPIO inputs (for flow meters), 100 MHz clock&lt;br /&gt;
* 0x5b873169 - August 2018 - rebuilt, no changes&lt;br /&gt;
* 0x5b89e4b4 - August 2018 - added external clock signal, 59 inputs, 100 MHz clock&lt;br /&gt;
* 0x5b8de2b0 - September 2018 - added data fifo and timestamp counters (TSCs) for the first 4 inputs&lt;br /&gt;
* 0x5b906c56 - September 2018 - improved overflow markers, added scalers readout into the data fifo&lt;br /&gt;
* 0x5da8e4c2 - October 2019 - timestamps for all inputs, inversion of inputs&lt;br /&gt;
* 0x5db764a7 - October 2019 - FPGA reboot works now.&lt;br /&gt;
* 0x607f6709 - April 2021 - working timestamp synchronization, memory mapped registers, improved sdc file, correct clock transfers&lt;br /&gt;
* 0x60860e61 - April 2021 - faster data FIFO readout (from ~8 Mbytes/sec to ~80 Mbytes/sec)&lt;br /&gt;
* 0x61832695 - Nov 2021 - increase timestamp FIFO from 4k to 64k words&lt;br /&gt;
* 20220406_ko_0x624e22ad - April 2022 - make inputs edge-triggered instead of sampled.&lt;br /&gt;
* 20220420_ko_0x62608957 - April 2022 - fix first fifo data word is zero&lt;br /&gt;
&lt;br /&gt;
= Firmware update =&lt;br /&gt;
&lt;br /&gt;
* use srunner_cb.exe to load firmware RPD file into EPCQ flash memory.&lt;br /&gt;
* if FPGA is not running compatible firmware, srunner_cb will fail&lt;br /&gt;
* connect JTAG and load the firmware sof file from the quartus project (use &amp;quot;make load_sof&amp;quot;)&lt;br /&gt;
* if JTAG is connected, one can use &amp;quot;make load_jic&amp;quot; to load firmware jic file into EPCQ flash memory.&lt;br /&gt;
&lt;br /&gt;
After correct firmware is loaded, access to chronobox registers may fail (srunner_cb will not work)&lt;br /&gt;
because FPGA bridges are not enabled. To check, run following commands. If some bridge reports &amp;quot;disabled&amp;quot;, reboot linux (do not cycle the power!).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb02:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb02:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some DE10-Nano boards have an EPCQ64 flash memory chip, some have the EPCQ128 flash memory chip.&lt;br /&gt;
* identify EPCQ64 and use &amp;quot;-64&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x16 &lt;br /&gt;
Info: Serial Configuration Device - EPCS64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify EPCQ128 and use &amp;quot;-128&amp;quot; with all srunner commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
...&lt;br /&gt;
Info: Silicon ID - 0x18 &lt;br /&gt;
Info: Serial Configuration Device - EPCS128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify -64 or -128 flash memory, write RPD file to flash memory, verify and reboot the fpga:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/agdaq/online/chronobox_software&lt;br /&gt;
./srunner_cb.exe -id -64 /dev/null # identify EPCS64 flash&lt;br /&gt;
./srunner_cb.exe -id -128 /dev/null # identify EPCQ128 flash&lt;br /&gt;
#./srunner_cb.exe -read -128 test.rpd # read flash contents into a file&lt;br /&gt;
./srunner_cb.exe -program -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./srunner_cb.exe -verify -128 /home/agdaq/online/firmware/git/chronobox_firmware/output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
./reboot_cb.exe # reboot the fpga into the new firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
for building firmware use: /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh daq01&lt;br /&gt;
cd online&lt;br /&gt;
git clone git@bitbucket.org:expalpha/chronobox_firmware.git&lt;br /&gt;
cd chronobox_firmware&lt;br /&gt;
/opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
make quartus&lt;br /&gt;
ls -l output_files/*.{sof,jic,rpd}&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7007185 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 olchansk users 8388833 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.jic&lt;br /&gt;
-rw-r--r-- 1 olchansk users 7510701 Apr 20 16:57 output_files/DE10_NANO_SoC_GHRD.sof&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
other make targets:&lt;br /&gt;
* make quartus - build fpga programmer files: sof, jic and rpd.&lt;br /&gt;
* make clean - clean the quartus project&lt;br /&gt;
* make qsys - regenerate the qsys block&lt;br /&gt;
* make jic - regenerate the jic file&lt;br /&gt;
* make load_sof - load sof file into fpga via jtag&lt;br /&gt;
* make load_jic - load jic file into fpga boot flash (epcq) via jtag&lt;br /&gt;
* make verify_jic - verify jic checksum in fpga boot flash (epcq)&lt;br /&gt;
&lt;br /&gt;
for jtag access, use /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq16:chronobox_firmware$ /daq/quartus/13.1.3.178/quartus/bin/jtagconfig&lt;br /&gt;
1) DE-SoC [2-1.4.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) Remote server daq16: Unable to connect&lt;br /&gt;
&lt;br /&gt;
daq16:chronobox_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errata ==&lt;br /&gt;
&lt;br /&gt;
* after regenerating qsys, manually edit ./soc_system/synthesis/submodules/hps_sdram_pll.sv to comment-out line &amp;quot;assign pll_dr_clk = clk_out[2];&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Firmware details =&lt;br /&gt;
&lt;br /&gt;
* DDR3 clock is 400 MHz (DDR3-800)&lt;br /&gt;
* memcpy speed ~1500 Mbytes/sec&lt;br /&gt;
* FIFO access single word read: 80, 44, 44 clocks at 10 ns/clock is 2.3 MHz at 4 bytes/word is 9 Mbytes/sec&lt;br /&gt;
* FIFO access memcpy: burst 2, delay 32, b4, delay 36, b5, d1, b5, d1, b5, d1, b1, delay 53, repeat. this reads 16 words in 72 clocks at 10 ns/clock is 1.388 MHz at 4*16=64 bytes/burst is 88.9 Mbytes/sec.&lt;br /&gt;
&lt;br /&gt;
= Chronobox firmware registers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0 | ro | sof_revision_in | all | firmware revision timestamp code&lt;br /&gt;
0 | wo | latch_scalers_out, zero_scalers_out | all | see [[#reg_0x00_write_bits]]&lt;br /&gt;
1 | rw | reg1_led_out | all | DE10-Nano LED output&lt;br /&gt;
2 | ro | switches_in | all | read DE10-Nano switches&lt;br /&gt;
3 | ro | buttons_in | all | read DE10-Nano buttons&lt;br /&gt;
4 | rw | reg4_test | all | 32-bit read-write test register&lt;br /&gt;
5 | rw | flash_programmer_in, reg5_flash_programmer_out | 0x5b6de806 | 0xABCD srunner flash programmer&lt;br /&gt;
6 | ro | ecl_in | all | read state of ECL inputs&lt;br /&gt;
7 | ro | reg7_test_in | all | ???&lt;br /&gt;
8 | rw | scaler_addr_out, reg8_scaler_data_in | all | top 16 bits of address becomes scaler bus address, 32 bit read is the corresponding scaler data&lt;br /&gt;
9 | ro | lemo_in | all | read state of LEMO inputs&lt;br /&gt;
10/0xA | ro | gpio_in | all | read state of GPIO inputs&lt;br /&gt;
11/0xB | rw | regB_lemo_out | all | LEMO output data&lt;br /&gt;
12/0xC | rw | regC_gpio_out | all | GPIO output data&lt;br /&gt;
13/0xD | rw | regD_out_enable_out | all | enable output tristates: [31:24] - LEMO_OUT, [17:0] - GPIO_OUT&lt;br /&gt;
14/0xE | rw | regE, reconfig_out | 0x5b6de806 | FPGA reboot: write inverted firmware revision (reg0) to reboot the FPGA&lt;br /&gt;
15/0xF | ro | regF_input_num_in | 0x5b89e4b4 | number of chronobox inputs (to read scalers, add 1 for the clock counter)&lt;br /&gt;
16/0x10 | ro | reg10_fifo_status | 0x5b8de2b0 | data fifo status, see below&lt;br /&gt;
17/0x11 | ro | reg11_fifo_data | 0x5b8de2b0 | data fifo data, see below&lt;br /&gt;
18/0x12 | rw | cb_invert_a | 0x5bf7557e | invert inputs 31..0&lt;br /&gt;
19/0x13 | rw | cb_invert_b | 0x5bf7557e | invert inputs 63..32&lt;br /&gt;
20/0x14 | rw | cb_enable_le_a | 0x5bf7557e | enable TSC leading edge inputs 31..0&lt;br /&gt;
21/0x15 | rw | cb_enable_le_b | 0x5bf7557e | enable TSC leading edge inputs 63..32&lt;br /&gt;
22/0x16 | rw | cb_enable_te_a | 0x5bf7557e | enable TSC trailing edge inputs 31..0&lt;br /&gt;
23/0x17 | rw | cb_enable_te_b | 0x5bf7557e | enable TSC trailing edge inputs 63..32&lt;br /&gt;
24/0x18 | ro | fc_ext_clk_100_counter | 0x5bf7557e | external clock frequency counter 100MHz reference&lt;br /&gt;
25/0x19 | ro | fc_ext_clk_ext_counter | 0x5bf7557e | external clock frequency counter&lt;br /&gt;
26/0x1A | ro | fc_ts_clk_100_counter | 0x5bf7557e | timestamp clock frequency counter 100MHz reference&lt;br /&gt;
27/0x1B | ro | fc_ts_clk_ts_counter | 0x5bf7557e | timestamp clock frequency counter&lt;br /&gt;
28/0x1C | ro | ts_clk_pll_status | 0x5bf7557e | timestamp clock PLL status&lt;br /&gt;
29/0x1D | rw | cb_lemo_out_mux_ctrl | 0x5bfdc798 | 8*4 bits to control 8 LEMO output multiplexers (4 bits/16 options each mux, see [[#LEMO outputs]])&lt;br /&gt;
30/0x1E | rw | cb_sync_mask[31:0] | 0x607f6709 | source of chronobox sync signal, low bits&lt;br /&gt;
31/0x1F | rw | cb_sync_mask[63:32] | 0x607f6709 | source of chronobox sync signal, high bits&lt;br /&gt;
32 | rw | cb_sync_reg[31:0], cb_sync_status[31:0] | 0x607f6709 | control of timestamp sync&lt;br /&gt;
33 | ro | tdc_fifo_status | DLTDC | TDC fifo status&lt;br /&gt;
34 | ro | tdc_fifo_data_lo | DLTDC | TDC fifo low 32-bits&lt;br /&gt;
35 | ro | tdc_fifo_data_hi | DLTDC | TDC fifo high 32-bits and fifo rdack&lt;br /&gt;
36 | rw | dl_input_mask | DLTDC | DL trigger input mask&lt;br /&gt;
37 | rw | dl_ctrl       | DLTDC | DL trigger control&lt;br /&gt;
38 | rw | tdc_input_mask | DLTDC | TDC input mask&lt;br /&gt;
39 | ro | axi_fifo_status | DLTDC | AXI fifo status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 0x00 write bits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | fw revision | quartus signal | description&lt;br /&gt;
0 | all | | latch scalers&lt;br /&gt;
1 | all | | zero scalers&lt;br /&gt;
2 | ... | fifo_rdreq_out | fifo_rdreq_out (not used in version 0x607f6709 and later)&lt;br /&gt;
3 | ... | ts_clk_pll_extswitch_out | clear ts_clk_pll_extswitch_out&lt;br /&gt;
4 | ... | ts_clk_pll_extswitch_out | set ts_clk_pll_extswitch_out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 16 fifo status ==&lt;br /&gt;
&lt;br /&gt;
Data fifo status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31: fifo_full - data fifo is current full&lt;br /&gt;
30: fifo_empty - data fifo is currently empty&lt;br /&gt;
29: cb_fifo_ch_full - TSC per-channel fifos have overflown at some point&lt;br /&gt;
28: fifo_full_latch - data fifo has overflown at some point&lt;br /&gt;
24+4: 0&lt;br /&gt;
0+24: fifo_usedw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 28 ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock PLL status bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : PLL locked&lt;br /&gt;
30 : PLL active clock (0=internal, 1=external&lt;br /&gt;
29 : external clock bad&lt;br /&gt;
28 : internal clock bad&lt;br /&gt;
27 : ts_clk_pll_extswitch&lt;br /&gt;
0..26 : not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reg 32 timestamp sync ==&lt;br /&gt;
&lt;br /&gt;
Timestamp synchronization register bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31 : write 1 to arm timestamp sync circuit, scalers and TSCs are placed in reset state&lt;br /&gt;
30 : write 1 to disarm timestamp sync circuit, reset is released&lt;br /&gt;
...&lt;br /&gt;
16 : write 1 to send a timestamp sync signal&lt;br /&gt;
15 : sync circuit armed&lt;br /&gt;
14 : sync done&lt;br /&gt;
13 : sync signal received (cleared by writing bits 31 or 30)&lt;br /&gt;
12 : 0&lt;br /&gt;
11 : sync circuit armed, clk_ts section&lt;br /&gt;
10 : sync done, clk_ts section&lt;br /&gt;
9  : sync signal received, clk_ts section&lt;br /&gt;
8  : 0&lt;br /&gt;
7  : unused&lt;br /&gt;
...&lt;br /&gt;
0  : unused&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nominal sequence for synchronizing timestamps:&lt;br /&gt;
* make sure nothing is sending the external sync signal (i.e. run is stopped, etc)&lt;br /&gt;
* arm the sync circuit: cb_write32(32, 0x80000000); cb_write32(32, 0);&lt;br /&gt;
* check that the arming was successful: cb_read32(32), only bits 0x8800 should be set&lt;br /&gt;
* scalers are in reset state, not incrementing&lt;br /&gt;
* TSCs are in reset state, no data in the TSC FIFO&lt;br /&gt;
* some time later, send the external sync signal&lt;br /&gt;
* or send the internal sync signal: cb_write32(32, 0x10000); cb_write32(32, 0);&lt;br /&gt;
* check that the timestamp reset happened: cb_read32(32), bits 0x6600 should be set, bits 0x8800 should be cleared&lt;br /&gt;
* check that the scalers are counting, check that there is TSC data in the TSC FIFO&lt;br /&gt;
&lt;br /&gt;
== reg 33, 39 TDC and AXI FIFO status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | mask       | quartus signal | description&lt;br /&gt;
31  | 0x80000000 | fifo empty&lt;br /&gt;
 8  | 0x00000100 | fifo full&lt;br /&gt;
7:0 | 0x000000FF | fifo usedw (64-bit words)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timestamp clock ==&lt;br /&gt;
&lt;br /&gt;
Timestamp clock is 10 MHz selectable from internal oscillator or external reference on the CLK_IN input.&lt;br /&gt;
&lt;br /&gt;
CLK_IN input can be selected using 2 two-position jumpers:&lt;br /&gt;
* NIM input: CLK&amp;lt;-&amp;gt;NIM/TTL and CLK&amp;lt;-&amp;gt;NIM&lt;br /&gt;
&lt;br /&gt;
To select the clock from command line, use:&lt;br /&gt;
* test_cb.exe intclk # select internal clock&lt;br /&gt;
* test_cb.exe extclk # select external clock&lt;br /&gt;
&lt;br /&gt;
From software:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Chronobox* cb = ...;&lt;br /&gt;
cb-&amp;gt;cb_int_clock(); # select internal clock&lt;br /&gt;
cb-&amp;gt;cb_ext_clock(); # select external clock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To see current status, run &amp;quot;test_cb.exe clocks&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./test_cb.exe clocks&lt;br /&gt;
...&lt;br /&gt;
Chronobox firmware revision: 0x5bf7557e&lt;br /&gt;
...&lt;br /&gt;
clock status: ext_clk: counter 0x00cccf2a, freq 10000450.9 Hz, ts_clk: counter 0x00cccf2a, freq 10000450.9 Hz, PLL status 0xc0000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reported is external clock frequency, currently selected timestamp clock frequency and PLL status (register 0x1C).&lt;br /&gt;
&lt;br /&gt;
Normal values for the PLL status:&lt;br /&gt;
* internal clock: 0x80000000&lt;br /&gt;
* external clock: 0xC0000000&lt;br /&gt;
* external clock selected, but invalid: 0x60000000&lt;br /&gt;
* internal clock selected, external clock invalid: 0xa0000000&lt;br /&gt;
&lt;br /&gt;
Disconnected/absent/broken external clock will report ext_clk frequency zero, bit 0x20000000 in the PLL status register 0x1C.&lt;br /&gt;
&lt;br /&gt;
If external clock is CDM, set chronobox clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;NIM&amp;quot;, use CDM 10 MHz clock output LEMO3B.&lt;br /&gt;
&lt;br /&gt;
If external clock is another chronobox (usually LEMO output 0), set clock jumpers to &amp;quot;CLK NIM/TTL&amp;quot; and &amp;quot;TTL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== LEMO outputs ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors can be used as TTL level outputs:&lt;br /&gt;
&lt;br /&gt;
* set the &amp;quot;bank a&amp;quot; and/or &amp;quot;bank b&amp;quot; jumpers for &amp;quot;output&amp;quot;&lt;br /&gt;
* set the lemo output multiplexor bits in register 0x1D&lt;br /&gt;
* set the &amp;quot;lemo output enable&amp;quot; bit in register 0x0D, use bits 24..31 for LEMO outputs 0..7.&lt;br /&gt;
* observe the corresponding LED is on or off according to the LEMO output TTL logic level&lt;br /&gt;
&lt;br /&gt;
The function of each LEMO output is controlled by the lemo output multiplexor. Up to 16 different&lt;br /&gt;
signals can be routed into each output. This is controlled by register 0x1D.&lt;br /&gt;
&lt;br /&gt;
Register 0x1D multiplexor control is 32 bits organized into 8 groups of 4 bits, per each of the 8 LEMO outputs: 0x76543210,&lt;br /&gt;
i.e. value 0x00000001 routes signal function 1 into output 0, and signal function 0 into outputs 1..7.&lt;br /&gt;
&lt;br /&gt;
For each output, there are 16 possible signal functions (4 bits):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | firmware signal | firmware revision | signal description&lt;br /&gt;
0 | cb_lemo_out_reg[n] | 0x5bfdc798 | output is controlled by register 0xB bits 0..7 for outputs 0..7&lt;br /&gt;
1 | clk_ts | 0x5bfdc798 | output is the 10MHz timestamp clock&lt;br /&gt;
2 | cb_sync_in_clk_ts | 0x607f6709 | daisy-chained timestamp sync signal (from control register or from sync input, see registers 30 and 31. see bit 0x10000 in register 32)&lt;br /&gt;
3..30 | gnd | 0x5bfdc798 | not used&lt;br /&gt;
31 | vcc | 0x5bfdc798 | logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== front panel LEDs ==&lt;br /&gt;
&lt;br /&gt;
The front panel LEDs are numbered 0..7 per [[#Chronobox_connectors]]&lt;br /&gt;
&lt;br /&gt;
Each LED can be individually lit by setting a bit in register 0x1 bits 8..15.&lt;br /&gt;
&lt;br /&gt;
If LEMO outputs are active, corresponding LEDs will show LEMO output status (logic level 1 -&amp;gt; LED is on, logic level 0 -&amp;gt; LED is off).&lt;br /&gt;
&lt;br /&gt;
If LEMO inputs are active ...&lt;br /&gt;
&lt;br /&gt;
== Synchronization of multiple chronoboxes ==&lt;br /&gt;
&lt;br /&gt;
To operate several chronoboxes as one unit, they must have two common signals, a clock and a sync signal.&lt;br /&gt;
&lt;br /&gt;
Each chronobox must be configured as:&lt;br /&gt;
* master: this will issue the sync signal&lt;br /&gt;
* slave: will receive the clock and sync signals from master&lt;br /&gt;
* slave daisy-chain: and pass them to the next slave down the chain&lt;br /&gt;
* (one can use the CDM or the TRG as sync masters)&lt;br /&gt;
&lt;br /&gt;
For the purpose of this example (recommended configuration), set the LEMO direction jumpers:&lt;br /&gt;
* bank A: set to &amp;quot;out&amp;quot;: master and slave daisy-chain clock and sync output&lt;br /&gt;
* bank B: set to &amp;quot;in&amp;quot;: slave sync input&lt;br /&gt;
&lt;br /&gt;
Clock connections:&lt;br /&gt;
* sync master can be configured with external or internal clock (CLK_IN input)&lt;br /&gt;
* sync slave must be configured with external clock (CLK_IN input)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #0 -&amp;gt; slave CLK_IN, LEMO #0 -&amp;gt; next slave CLK_IN, LEMO #0 -&amp;gt; ...&lt;br /&gt;
10 MHz clock from CDM &amp;amp; etc -&amp;gt; sync master CLK_IN, LEMO #0 -&amp;gt; slave CLK_IN, ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync connections:&lt;br /&gt;
* sync signal can be generated externally by the CDM or TRG&lt;br /&gt;
* sync signal can be generated internally by writing 0x10000 into reg 32 of sync master&lt;br /&gt;
* (sync must be armed on the master and all slaves before sending the first sync signal, write 0x80000000 into reg 32)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sync master LEMO #1 -&amp;gt; slave LEMO #4, LEMO #1 -&amp;gt; next slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
external sync -&amp;gt; master LEMO #4, LEMO #1 -&amp;gt; slave LEMO #4 -&amp;gt; ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sync configuration: (see register 32 for explanation!)&lt;br /&gt;
* master and slave: disarm sync: write 0x40000000 to reg 32, write 0 to reg 32, bits 0x8800 and 0x6600 should clear&lt;br /&gt;
* master and slave daisy chain: setup clock and sync outputs:&lt;br /&gt;
** register 29 lemo output mux to 0xXXXX&#039;XX21 (2=output sync signal, 1=output clock)&lt;br /&gt;
** register 13 lemo output enable, set bits 0x0F00&#039;0000 (set bank A jumper for &amp;quot;out&amp;quot;)&lt;br /&gt;
* slave and slave daisy chain: enable external sync from LEMO #4:&lt;br /&gt;
** register 30, write 0&lt;br /&gt;
** register 31, write 0x10&lt;br /&gt;
* master: switch to external or internal clock, as needed&lt;br /&gt;
* slave: switch to external clock&lt;br /&gt;
* master and slave: arm sync: write 0x80000000 to reg 32, write 0 to reg 32, bits 0x8800 should turn on.&lt;br /&gt;
* timestamps, scalers and data fifo go into the reset state, all old data is cleared&lt;br /&gt;
* when sync is received, timestamp is reset to zero, reset state is cleared and there should be data into FIFO. reg 32 will read 0x6600.&lt;br /&gt;
* if using external sync (no master), wait for reg 32 bits to become 0x6600 (sync completed)&lt;br /&gt;
* master: issue sync signal, write 0x10000 to reg 32, write 0 to reg 32. master reg 32 should read 0x6600, slave reg 32 should read 0x6600.&lt;br /&gt;
&lt;br /&gt;
== FIFO data format ==&lt;br /&gt;
&lt;br /&gt;
* 0x8ntttttt: TSC data, 24 bits &amp;quot;tttttt&amp;quot; of timestamp, 7 bits &amp;quot;nn&amp;quot; of channel number, top bit set to 1. Low bit of &amp;quot;t&amp;quot; indicates 0=leading edge, 1=trailing edge.&lt;br /&gt;
* 0xffTTmmmm: (before 20220420_ko_0x62608957) timestamp wrap around marker: &amp;quot;TT&amp;quot; is the top 8 bits of the timestamp, &amp;quot;mmmm&amp;quot; is a 16 bit counter&lt;br /&gt;
* 0xff8mmmmm: timestamp wrap around marker: bit 24 is the top bit of the timestamp (0/8), &amp;quot;mmmmm&amp;quot; is a 23 bit counter&lt;br /&gt;
* 0xfe00nnnn: scaler data, following &amp;quot;nnnn&amp;quot; words are the latched scalers&lt;br /&gt;
* 0xfd000000: start of data after chronobox sync (cbtrg only, for now)&lt;br /&gt;
&lt;br /&gt;
Time range is (before 20220420_ko_0x62608957):&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 15 bits of &amp;quot;mmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x00007FFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$22 = 15.270527886249999 ### in hours&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Time range is:&lt;br /&gt;
* 24 bits of &amp;quot;tttttt&amp;quot;&lt;br /&gt;
* 22 bits of &amp;quot;mmmmm&amp;quot;&lt;br /&gt;
* computation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(gdb) p (100.0*1.0*0x003FFFFF*1.0*0x00FFFFFF)/(1e9)/3600.0&lt;br /&gt;
$2 = 1954.6867557262499 ### in hours&lt;br /&gt;
$3 = 81.445281488593736 ### in days&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== timestamp wrap around marker ==&lt;br /&gt;
&lt;br /&gt;
The timestamp data is only 24 bits, to allow timestamping&lt;br /&gt;
with longer time range, wrap around markers are added to the&lt;br /&gt;
data stream.&lt;br /&gt;
&lt;br /&gt;
For input signals that arrive close to the time of timestamp wrap around,&lt;br /&gt;
there is ambiguity in the ordering of the data fifo: does the wrap around&lt;br /&gt;
marker or the signal timestamp show up first? For example for rare&lt;br /&gt;
signals, one can see this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1&lt;br /&gt;
wrap 2&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3&lt;br /&gt;
wrap 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
does the hit belong with wrap marker 2 (written to the fifo just after wrap marker 2)&lt;br /&gt;
or with marker 3 (written to the fifo just before wrap marker 3)?&lt;br /&gt;
&lt;br /&gt;
To remove this ambiguity, additional markers are written to the data stream&lt;br /&gt;
half way between the wrap arounds, making it obvious that the signal&lt;br /&gt;
arrived right after wrap marker 3 (but was written to the FIFO before the marker):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wrap 1 0x00&lt;br /&gt;
wrap 1 0x80&lt;br /&gt;
wrap 2 0x00&lt;br /&gt;
wrap 2 0x80&lt;br /&gt;
timestamp 0x00000003&lt;br /&gt;
wrap 3 0x00&lt;br /&gt;
wrap 3 0x80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= test_cb.exe =&lt;br /&gt;
&lt;br /&gt;
test_cb.exe is the general test program for the chronobox.&lt;br /&gt;
&lt;br /&gt;
* test_cb.exe 0 # read chronobox register 0&lt;br /&gt;
* test_cb.exe 4 0x1234 # write to chronobox register 4&lt;br /&gt;
* test_cb.exe fpga 0 # read FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe fpga 0 0x12345678 # write 0x12345678 to FPGA LW bridge address 0&lt;br /&gt;
* test_cb.exe reboot # reboot the FPGA (the ARM CPU keeps running)&lt;br /&gt;
* test_cb.exe scalers # read all scalers in a loop&lt;br /&gt;
* test_cb.exe fifo # read the data fifo in a loop&lt;br /&gt;
* test_cb.exe tsfifo # read the timestamp fifo in a loop (do not latch scalers)&lt;br /&gt;
* test_cb.exe intclk # select internal timestamp clock&lt;br /&gt;
* test_cb.exe extclk # select external timestamp clock (10MHz)&lt;br /&gt;
* test_cb.exe clocks # report current status of timestamp clock&lt;br /&gt;
&lt;br /&gt;
= Errata =&lt;br /&gt;
&lt;br /&gt;
* 0x607f6709 - after FIFO reset (timestamp sync, etc), the first word in the FIFO is always 0x00000000, not a real timestamps.&lt;br /&gt;
* 20220420_ko_0x62608957 - after FIFO reset (timestamp sync), the first word in the FIFO is 0xFF000000, a timestamp overflow marker, as expected. after FPGA reboot (before timestamp sync), the first word in the FIFO is also 0xFF000000 for reasons unknown.&lt;br /&gt;
* linux - after power up, chronobox registers are not accessible, check that the FPGA bridges are enabled, if any bridge reports &amp;quot;disabled&amp;quot;, reboot linux. do NOT cycle power.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cb04:~# cat /sys/class/fpga_bridge/br*/state&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
enabled&lt;br /&gt;
root@cb04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* FIXED 23apr2021 - use updated &amp;quot;bootcmd&amp;quot;. figure out why FPGA bridges are disabled on first power up&lt;br /&gt;
* figure out how to load FPGA sof from Linux, probably need new kernel&lt;br /&gt;
* FIXED apr2022, use fw_printenv build from source - fix fw_printenv, probably requires using newer uboot&lt;br /&gt;
* add mmap driver for FPGA LW bridge, probably need new kernel&lt;br /&gt;
* figure out how to build linux kernel from git (now using kernel from GHRD demo kit)&lt;br /&gt;
* enable watchdog timer to auto-reboot on hang&lt;br /&gt;
* figure out why ssh takes 30 second to start. read this: https://daniel-lange.com/archives/152-Openssh-taking-minutes-to-become-available,-booting-takes-half-an-hour-...-because-your-server-waits-for-a-few-bytes-of-randomness.html https://lwn.net/Articles/800509/&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - fix problem on startup first word in the FIFO is 0x00000000.&lt;br /&gt;
* FIXED 20220420_ko_0x62608957 - increase number of bits in the timestamp wraparound counter: 0xFF8mmmmm -&amp;gt; 23 bits is possible, keep high bit 0x00800000 as is.&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Main_Page&amp;diff=980</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Main_Page&amp;diff=980"/>
		<updated>2024-01-31T21:50:02Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the new wiki for the ALPHA-g detector and daq.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* agdaq at CERN: https://alphacpc05.cern.ch/agdaq/&lt;br /&gt;
* elog at CERN: https://alphacpc05.cern.ch/elog/Detectors/&lt;br /&gt;
* agmini midas status page: https://daq16.triumf.ca &lt;br /&gt;
* elog: https://daq.triumf.ca/elog-alphag/alphag/&lt;br /&gt;
* old elog at TRIUMF: https://daq.triumf.ca/elog-alphag-old/alphag/&lt;br /&gt;
&lt;br /&gt;
== temporary index ==&lt;br /&gt;
&lt;br /&gt;
* [[daq]] -- DAQ manual&lt;br /&gt;
* [[Equipment]] -- Equipment manuals&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
General information about the Alpha-g Radial Time Projection Chamber (rTPC)&lt;br /&gt;
&lt;br /&gt;
* [[Detector Overview]] : Design note&lt;br /&gt;
* [[Detector Simulations]] : Simulation and track recontruction&lt;br /&gt;
* [[Mechanical Design]] : Mechanical design of the rTPC&lt;br /&gt;
* [[Detector Data Acquistion]] : Computer and Back-end considerations&lt;br /&gt;
* [[Detector Calibration]] : Laser calibration scheme&lt;br /&gt;
* [[Detector Electronics]] : Front-end and digitizers&lt;br /&gt;
* [[Detector Services]] : Gas, Water cooling, Power distribution&lt;br /&gt;
* [[Barrel Scintillator]] : Cosmic veto detector&lt;br /&gt;
&lt;br /&gt;
* [[File:Top rTPC and BS Channel Numbering - RH.pdf|thumb|rTPC and BS Channel Numbering -- TOP view]]&lt;br /&gt;
&lt;br /&gt;
* [[File:BV mapping.pdf|thumb|BV DAQ channels assignment]]&lt;br /&gt;
&lt;br /&gt;
* [[Magnetometry]]&lt;br /&gt;
&lt;br /&gt;
== Mediawiki default blurb ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=978</id>
		<title>PWB</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=978"/>
		<updated>2023-06-16T18:35:02Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/pwb_rev1_firmware&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag/feam/rev1&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/feam/rev1&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
&lt;br /&gt;
= Schematics =&lt;br /&gt;
&lt;br /&gt;
* [[Image:pwb_rev0.pdf]]&lt;br /&gt;
* [[Image:Pwb-rev1-after.pdf]]&lt;br /&gt;
* [[Image:AlphaG Rev1.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Manuals =&lt;br /&gt;
&lt;br /&gt;
* [[Image:AFTER_MANUAL_V1.pdf]] AFTER SCA manual v1&lt;br /&gt;
* [[Image:AFTER_DataSheet1_1.pdf]] AFTER SCA manual v1.1&lt;br /&gt;
* [[Image:AFTER_SCA_table2.pdf]] AFTER SCA channel map&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== On board ==&lt;br /&gt;
&lt;br /&gt;
* FPGA Cyclone 5 GX, 5CGXFC7C7F23C8N&lt;br /&gt;
&lt;br /&gt;
== Power distribution and monitoring ==&lt;br /&gt;
&lt;br /&gt;
External power supply is:&lt;br /&gt;
* +5V&lt;br /&gt;
* +2V&lt;br /&gt;
&lt;br /&gt;
Central board:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.1R) - Fuse_5V&lt;br /&gt;
* Ext_2V - F2/F3 - RS2 (0.1R) - Idig2-&lt;br /&gt;
* LDO3 - Fuse_5V - DIG_3.3V - selfenable - ADM7154&lt;br /&gt;
* LDO5 - Fuse_5V - DIG_2.5V - selfenable - ADM7154&lt;br /&gt;
* LDO_CLN - Fuse5V - CLN_3.3V - selfenable - &lt;br /&gt;
* VREG - DIG_3.3V - -2.5V SCA BIAS - selfenable - LTC1983ES6-3#TRMPBF&lt;br /&gt;
* LDO7 - DIG_2.5V - DDR3_VRef - enable DDR3_1P5V, DDR3_PG, DDR3_VttEN&lt;br /&gt;
* LDO2 - Idig2V- - DIG_1.1V - enable DIG_3.3V - LT3071&lt;br /&gt;
* LDO6 - Idig2V- - DDR3_1P5V - enable DIG_3.3V - LT3083&lt;br /&gt;
&lt;br /&gt;
SCA Wing:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.3R) - Isca- - SCA_Fuse5V&lt;br /&gt;
* LDO1 - SCA_Fuse5V - SCA3.3V - enable ADC_PWR_EN - ADM7154&lt;br /&gt;
* LDO2 - SCA3.3V - ADC1.8V - selfenable - ADM7154&lt;br /&gt;
* LDO3 - SCA3.3V - TRN2.5V - selfenable - LT1761&lt;br /&gt;
* REF - SCA3.3V - 1.45V Vicm - selfenable - LM4121&lt;br /&gt;
&lt;br /&gt;
esper variables:&lt;br /&gt;
&lt;br /&gt;
* board/i_sca12, i_sca34, v_sca12, v_sca34: voltage and current into LDO1, after fuse F1 (wing board)&lt;br /&gt;
* board/i_p2, v_p2: voltage and current on 2V bus after fuses F2/F3&lt;br /&gt;
* board/i_p5, v_p5: voltage and current on 5V bus after fuse F1 (central board)&lt;br /&gt;
&lt;br /&gt;
== Trigger and Clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock (62.5MHz) and trigger are distributed to the PWB columns via the [https://edev-group.triumf.ca/hw/alphag/trigger-card-sata-adapter/rev1 trigger SATA adapter].&lt;br /&gt;
&lt;br /&gt;
The two miniSAS cables from cdm03 port 5 and 6 are connected to a miniSAS-SATA splitter 1-to-4 (CS Electronics &amp;quot;iSAS SATA adapter&amp;quot; ADP-887P-1X). Since there are only 8 columns and the clock and trigger signals are daisy-chained across the 8 rows, this scheme is sufficient to provide the necessary inputs to all 64 PWBs.&lt;br /&gt;
&lt;br /&gt;
[https://www.techcable.com/sas-mini-sas-cables/sata-cables/ SATA 6Gb/s Cable with Latching Clip. Straight Pinout 1-1 247726-L  40in]&lt;br /&gt;
&lt;br /&gt;
== Optical Link ==&lt;br /&gt;
&lt;br /&gt;
Main data uplink.&lt;br /&gt;
&lt;br /&gt;
SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ [[File:AVAGO SFP specs.pdf|SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ]]&lt;br /&gt;
&lt;br /&gt;
Fiber optic Tripp Lite N820 - 10 m [[File:FiberOptic TrippLite specs.pdf|Fiber optic Tripp Lite N820 - 10 m]]&lt;br /&gt;
&lt;br /&gt;
== SATA Link ==&lt;br /&gt;
&lt;br /&gt;
Secondary data uplink, capable also to deliver clock and trigger.&lt;br /&gt;
&lt;br /&gt;
The SATA link connects PWB from adjacent columuns on the same row.&lt;br /&gt;
&lt;br /&gt;
The SATA cable is a &amp;quot;crossed cable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Modifications from schematic ==&lt;br /&gt;
&lt;br /&gt;
Unless the schematic has been updated, these modifications need to be made, ideally before assembly:&lt;br /&gt;
&lt;br /&gt;
* no capacitors CF5, CF6, CF7, CF8 on external SPI connector (MagBoard connector)&lt;br /&gt;
* SCA baseline resistors R37, R38 next to each AFTER chip need to be 1.2k, so voltage divider R38/R39 should be 1.2k/2.1k&lt;br /&gt;
&lt;br /&gt;
= Firmware =&lt;br /&gt;
&lt;br /&gt;
== Firmware update ==&lt;br /&gt;
&lt;br /&gt;
PWB firmware update is done using &amp;quot;esper-tool&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update factory_rpd&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update file_rpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of PWB firmware pwb_rev1_20200706_ko:&lt;br /&gt;
&lt;br /&gt;
Permission to write into the flash memory is controlled by esper variables:&lt;br /&gt;
&lt;br /&gt;
* allow_write set to &amp;quot;false&amp;quot;: &amp;quot;esper-tool upload&amp;quot; does a &amp;quot;verify&amp;quot;: successful upload means epcq flash content is same as rpd file, error means content is not the same.&lt;br /&gt;
* allow_write set to &amp;quot;true&amp;quot;: &amp;quot;esper-tool upload&amp;quot; updates the epcq flash from the rpd file: for each data block, read the epcq flash, compare to rpd data, if different, erase the flash block, write the flash, read the flash, if there is a mismatch (bad write), return an error.&lt;br /&gt;
* allow_factory_write set to &amp;quot;true&amp;quot; to enable writing to the &amp;quot;factory_rpd&amp;quot;. DO NOT SET IT TO &amp;quot;true&amp;quot; UNLESS YOU MEAN TO UPDATE THE PWB BOOTLOADER. IF YOU FLASH BUM FIRMWARE or IF THERE IS A POWER OUTAGE WHILE UPDATING, THE PWB WILL BE BRICKED and has to be recovered by connecting a USB blaster.&lt;br /&gt;
&lt;br /&gt;
To update firmware of multiple boards to correct version, recommended is the script &amp;quot;update_pwb.perl&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/online/src&lt;br /&gt;
./update_pwb.perl pwb12 pwb06 pwb78&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Factory page and user page firmware boot ==&lt;br /&gt;
&lt;br /&gt;
Each PWB board has 2 firmware images: boot loader (factory page)&lt;br /&gt;
and data acquisition (user page). On power up, the FPGA loads and runs&lt;br /&gt;
the boot loader firmware from the factory page, later the control&lt;br /&gt;
software reboots the FPGA into the data acquisition firmware from&lt;br /&gt;
the user page.&lt;br /&gt;
&lt;br /&gt;
Because loading defective firmware can brick https://en.wikipedia.org/wiki/Brick_(electronics)&lt;br /&gt;
the PWB, new firmware images are loaded into the user page, if anything is wrong,&lt;br /&gt;
the PWB can still boot from the factory page and one can use the firmware update&lt;br /&gt;
function to load a good firmware image into the user page.&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is not intended for data acquisition, it is only meant to provide three functions:&lt;br /&gt;
* boot enough hardware and software to communicate via the ethernet and the sata link&lt;br /&gt;
* firmware update (both factory page and user page)&lt;br /&gt;
* reboot into the user page&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is usually never updated unless absolutely&lt;br /&gt;
needed to fix a problem with these three functions (i.e. compatibility with sata link communications).&lt;br /&gt;
&lt;br /&gt;
If factory image is corrupted or the contains defective firmware and the PWB does not boot (no dhcp, no ping, no esper),&lt;br /&gt;
the only way to unbrick it is by loading good firmware using a jtag flash programmer (usb-blaster). Connecting it requires&lt;br /&gt;
physical access to the jtag connector on the PWB board. It is impossible when the detector is fully assembled in the experiment.&lt;br /&gt;
&lt;br /&gt;
The PWB has a 32 Mbyte EPCQ flash memory chip, it is divided into 2 pages 16 Mbytes of factory page and 16 Mbytes of user page.&lt;br /&gt;
&lt;br /&gt;
A complete firmware image generally contains 3 pieces:&lt;br /&gt;
* FPGA firmware and NIOS &amp;quot;feam_bootloader&amp;quot; software RAM image (sof file)&lt;br /&gt;
* NIOS &amp;quot;feam&amp;quot; software RAM image (feam.elf.flash.hex) - all the C code for esper communications and PWB data acquisition&lt;br /&gt;
* NIOS filesystem image (feam.webpkg.hex) - esper web pages&lt;br /&gt;
&lt;br /&gt;
This is the boot sequence:&lt;br /&gt;
* on power-up the FPGA automatically loads the sof file from address 0 of the EPCQ flash (this is the factory image sof file)&lt;br /&gt;
* the FPGA is &amp;quot;started&amp;quot;&lt;br /&gt;
* the NIOS CPU starts executing the &amp;quot;feam_bootloader&amp;quot; C code embedded in the sof file (NIOS project hdl/software/feam_bootloader)&lt;br /&gt;
* feam_bootloader initializes the hardware (clocks, DDR memory, etc)&lt;br /&gt;
* feam_bootloader write-protects the EPCQ flash memory&lt;br /&gt;
* feam_bootloader copies the &amp;quot;feam&amp;quot; software from EPCQ flash to the DDR memory (after checking for correct checkum)&lt;br /&gt;
* feam_bootloader restarts the NIOS CPU&lt;br /&gt;
* the NIOS CPU starts running from DDR memory, executes the &amp;quot;feam&amp;quot; software (NIOS project hdl/software/feam)&lt;br /&gt;
* call main() in hdl/software/feam/src/task_init.c&lt;br /&gt;
* call task_init() in the same file&lt;br /&gt;
* infinite loop waiting for IP address via DHCP&lt;br /&gt;
* after have IP address, call task_esper() from hdl/software/feam/src/task_esper.c&lt;br /&gt;
* task_esper() creates all the esper modules, esper variables, etc,&lt;br /&gt;
* mod_http.c starts the mongoose web server&lt;br /&gt;
* PWB is open for business&lt;br /&gt;
&lt;br /&gt;
This is the protection against booting corrupted firmware:&lt;br /&gt;
* FPGA hardware loads the sof file from epcq flash and checks for correct checksum before &amp;quot;starting&amp;quot; it&lt;br /&gt;
* NIOS CPU is part of the sof file, protected by sof file checksum&lt;br /&gt;
* NIOS feam_bootloader C code is part of the sof file, protected by the sof checksum&lt;br /&gt;
* feam_bootloader checks for correct signatures and checksums of the DDR memory image&lt;br /&gt;
* &amp;quot;feam&amp;quot; C code is protected by the checksum of the DDR memory image&lt;br /&gt;
&lt;br /&gt;
== NIOS terminal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ /opt/intelFPGA/17.0/quartus/bin/nios2-terminal&lt;br /&gt;
nios2-terminal: connected to hardware target using JTAG UART on cable&lt;br /&gt;
nios2-terminal: &amp;quot;USB-Blaster [2-1.2]&amp;quot;, device 1, instance 0&lt;br /&gt;
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)&lt;br /&gt;
PWB Revision 1 Boot Loader&lt;br /&gt;
Ver 2.0  Build 357 - Wed Jun  6 15:05:35 PDT 2018&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash boot loader firmware via jtag ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ cd ~/online/firmware/pwb_rev1&lt;br /&gt;
$ ls -l&lt;br /&gt;
$ /opt/intelFPGA/17.1/quartus/bin/quartus_pgmw&lt;br /&gt;
... auto detect&lt;br /&gt;
... load the jic file&lt;br /&gt;
... in menu tools-&amp;gt;programmer, enable &amp;quot;unprotect device&amp;quot;&lt;br /&gt;
... start program/configure operation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash user page firmware via esper-tool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ cd online/src&lt;br /&gt;
$ more update_pwb.perl ### check that $fw is set to the desired firmware file&lt;br /&gt;
$ ./update_pwb.perl pwb06 ### or give more PWB names or give &amp;quot;all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
=== quartus version to use ===&lt;br /&gt;
&lt;br /&gt;
* quartus 16.1 should be used for jtag (jtagconfig and jtagd)&lt;br /&gt;
* quartus 17.0 should be used to build the PWB firmware (17.1 is not compatible)&lt;br /&gt;
&lt;br /&gt;
=== start license server ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh agmini@daq16&lt;br /&gt;
/opt/intelFPGA/17.0/quartus/linux64/lmgrd -c ~agmini/online/license-daq16.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare the build environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/17.0/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get latest version of the code and build it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd online/firmware/git/pwb_rev1_firmware&lt;br /&gt;
$ git pull&lt;br /&gt;
$ git checkout alphag&lt;br /&gt;
$ git pull&lt;br /&gt;
$ ./scripts/compile_project.sh&lt;br /&gt;
... about 30-40 minutes ...&lt;br /&gt;
$ ls -l bin/*.sof bin/*.jic bin/*.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 12727389 Jan 24  2018 bin/feam_rev1_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 33554661 Jan 24  2018 bin/feam_rev1.jic&lt;br /&gt;
-rw-r--r-- 1 agmini alpha  6974754 Jan 24  2018 bin/rev1.sof&lt;br /&gt;
$ ### feam.jic is loaded via jtag&lt;br /&gt;
$ ### feam_auto.rpd is loaded via esper&lt;br /&gt;
$ ### feam.sof is used to attach the quartus signal tap logic analyzer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firmware build order and sequence ===&lt;br /&gt;
&lt;br /&gt;
* erase previous build&lt;br /&gt;
* regenerate qsys&lt;br /&gt;
* regenerate NIOS BSP &amp;quot;feam_bootloader_bsp&amp;quot; and &amp;quot;feam_bsp&amp;quot;&lt;br /&gt;
* build NIOS projects &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot;&lt;br /&gt;
* build quartus sof file (with the &amp;quot;feam_bootloader&amp;quot; nios project inside)&lt;br /&gt;
* build jic and rpd files (with the quartus sof file and the &amp;quot;feam&amp;quot; nios project inside)&lt;br /&gt;
* load sof file into the FPGA using jtag (be careful about compatible &amp;quot;feam&amp;quot; nios project already in the epcq flash)&lt;br /&gt;
* load jic file into the epcq factory page using jtag (cycle power for them to take effect)&lt;br /&gt;
* load rpd file into the epcq factory or user page using esper&lt;br /&gt;
&lt;br /&gt;
=== scripts for building the firmware ===&lt;br /&gt;
&lt;br /&gt;
* scripts/compile_project.sh - build everything from scratch:&lt;br /&gt;
* scripts/compile_qsys.sh - regenerate the main qsys component&lt;br /&gt;
* scripts/compile_nios.sh - regenerate the BSPs, then same as compile_elf.sh&lt;br /&gt;
* scripts/compile_elf.sh - build the BSPs, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; NIOS projects&lt;br /&gt;
* scripts/update_elf.sh - regenerate the rpd and jic files to include the new &amp;quot;feam&amp;quot; NIOS build (keeps the old &amp;quot;feam_bootloader&amp;quot; in the sof file)&lt;br /&gt;
* scripts/update_bootloader.sh - also regenerate the sof file to include the new &amp;quot;feam_bootloader&amp;quot; build&lt;br /&gt;
* scripts/clean_quartus.sh - prepare quartus fpga sof file to build from scratch&lt;br /&gt;
* scripts/compile_quartus.sh - build the quartus fpga sof file incrementally (run clean_quartus.sh to build from scratch).&lt;br /&gt;
* scripts/load_jtag_sof.pl bin/rev1.sof - load sof file into the FPGA. this will boot the new fpga firmware, the new feam_bootloader (if update_bootloader.sh was run), but with the old &amp;quot;feam&amp;quot; already in epcq flash. (beware of incompatible sof, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; builds!)&lt;br /&gt;
* scripts/load_jtag_jic.pl bin/feam_rev1.jic - load jic file into the EPCQ flash, same as using the graphical flash programmer tool. (this will leave the FPGA running the quartus jtag flash loader firmware, not the PWB firmware. Cycle power for new jic file to take effect).&lt;br /&gt;
&lt;br /&gt;
== ESPER Variables ==&lt;br /&gt;
&lt;br /&gt;
* Board&lt;br /&gt;
** invert_ext_trig - invert trigger signal from CDM before it drives any logic (to undo incorrect signal polarity)&lt;br /&gt;
** reset_nios - goggle up, them down to reset NIOS subsystem&lt;br /&gt;
&lt;br /&gt;
* Signalproc&lt;br /&gt;
** test_mode - ADC data is replaced with a test pattern, see test mode bits in sca_x_ch_ctrl.&lt;br /&gt;
** sca_a_ch_ctrl, sca_b_ch_ctrl, sca_c_ch_ctrl, sca_d_ch_ctrl - channel control bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11..0 - threshold - channel suppression threshold&lt;br /&gt;
14..12 - ctrl_test_mode - test mode:&lt;br /&gt;
         0=fixed patter 0xa5a,&lt;br /&gt;
         1=time bin counter,&lt;br /&gt;
         2=time bin counter with channel number,&lt;br /&gt;
         3=sequential adc sample counter,&lt;br /&gt;
         4={ch_crossed_out,trig_pos,trig_neg,adc[8:0]},&lt;br /&gt;
         5={trig,adc[10:0]},&lt;br /&gt;
         6={ch_crossed_min,adc[10:0]}&lt;br /&gt;
15 - ctrl_supp_mode - channel suppression mode: 0=adc&amp;lt;=(baseline-threshold), 1=adc&amp;lt;=threshold&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Link&lt;br /&gt;
** link_ctrl - sata link control. The bits are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - sata_link_udp_stream_in_enable - permit data flow from sata link to OFFLOAD_SATA&lt;br /&gt;
1 - udp_stream_out_enable - permit sca data flow to sata link&lt;br /&gt;
2 - sata_to_eth_enable - permit ethernet data flow from sata link to TSE_MAC&lt;br /&gt;
3 - eth_to_sata_enable - permit ethernet data flow from TSE MAC to sata link&lt;br /&gt;
4 - enable_stop_our_tx - enable flow control: allow stop_tx&lt;br /&gt;
#5 - stop_our_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
6 - enable_stop_remote_tx - enable flow control: allow send &amp;quot;stop_tx&amp;quot;&lt;br /&gt;
#7 - stop_remote_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
8 - tx_test_pattern_udp - udp data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
9 - tx_test_pattern_eth - nios-to-sata data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
10 - udp_delay_enable - delay between udp packets, see udp_delay_value below&lt;br /&gt;
11 - reboot_tx - send K_REBOOT command to the sata link mate, where it has same effect as board/reset_nios.&lt;br /&gt;
12 - sata_to_nios_disable&lt;br /&gt;
13 - nios_to_sata_disable&lt;br /&gt;
14 - &lt;br /&gt;
15 - &lt;br /&gt;
16 -&lt;br /&gt;
24..31 - udp_delay_value - delay between udp packets (top 8 bits of a 20-bit counter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware data path ==&lt;br /&gt;
&lt;br /&gt;
Main data path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feam_top&lt;br /&gt;
|&lt;br /&gt;
sca_sigproc&lt;br /&gt;
|&lt;br /&gt;
sca_event_control&lt;br /&gt;
4 * sca_control (sca_channel.sv)&lt;br /&gt;
4 * channel_fifo (1024 samples)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_control (sca_channel.sv)&lt;br /&gt;
|&lt;br /&gt;
state machine to control SCA read and write enables&lt;br /&gt;
|&lt;br /&gt;
sca_write_control (what does it do?!?)&lt;br /&gt;
sca_read_control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_read_control&lt;br /&gt;
|&lt;br /&gt;
state machine to store ADC samples into per-channel FIFOs (channel_fifo)&lt;br /&gt;
selector to replace ADC samples with a test pattern&lt;br /&gt;
79*sca_trig_one -&amp;gt; ch_crossed_out - channel hit detector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_event_control&lt;br /&gt;
|&lt;br /&gt;
event_fifo (hdl/mf/event_descriptor_fifo)&lt;br /&gt;
state machine to take ADC data from 4 per-channel FIFOs (channel_fifo) and store it into DDR memory (write addr increment is 510*8 (number of samples)*8 = 4080).&lt;br /&gt;
state machine to read transposed ADC data from DDR memory (read addr increment is 8+8=16 - 2 samples * 2 bytes * 4 sca = 16) and create 4 per-sca data streams&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data stream:&lt;br /&gt;
4 per-sca data streams from sca_event_control -&amp;gt; sca_sigproc(event_dat)&lt;br /&gt;
|&lt;br /&gt;
packet_chunker (hdl/lib/packet_chunker.sv) (4*event_dat -&amp;gt; event_segment_dat) - multiplex 4 data streams into 1 stream of UDP-sized packets&lt;br /&gt;
|&lt;br /&gt;
packet_length_prepender (hdl/lib/packet_length_prepender.sv)  (event_segment_dat -&amp;gt; udp_event_val_out)&lt;br /&gt;
|&lt;br /&gt;
udp_event_val -&amp;gt; info qsys (udp_stream_sca) and into sata link (mux channel 2).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware build instructions from Bryerton (obsolete) ==&lt;br /&gt;
&lt;br /&gt;
This is the old README.md file from the firmware git repository.&lt;br /&gt;
&lt;br /&gt;
These instructions are not used to build the firmware (use scrips/compile_project.sh).&lt;br /&gt;
&lt;br /&gt;
They are still useful for figuring out which buttons to push in the altera gui programs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ALPHAg FrontEnd Acquisition Module (FEAM) - REV0&lt;br /&gt;
&lt;br /&gt;
Welcome to the ALPHAg FEAM Project &lt;br /&gt;
&lt;br /&gt;
# Table of Contents&lt;br /&gt;
&lt;br /&gt;
* [Overview](#overview)&lt;br /&gt;
* [Inital Setup](#initial-setup)&lt;br /&gt;
    * [Quartus Setup](#quartus-setup)&lt;br /&gt;
        * [Create the .cdf](#create-the-cdf)&lt;br /&gt;
    * [NIOS Setup](#nios-Setup)&lt;br /&gt;
        * [Create the project files](#create-the-project-files) &lt;br /&gt;
* [Build Instructions](#build-instructions)&lt;br /&gt;
    * [Building from Quartus GUI](#building-from-quartus-gui)&lt;br /&gt;
        * [Generate the QSys File](#generate-the-qsys-file)&lt;br /&gt;
        * [Compile the NIOSII Project](#compile-the-niosii-project)&lt;br /&gt;
        * [Compile the Quartus Project](#compile-the-quartus-project)&lt;br /&gt;
    * [Building from Scripts](#building-from-scripts)&lt;br /&gt;
    * [Installing from JTAG](#installing-from-jtag)&lt;br /&gt;
    * [Installing from ESPER](#installing-from-esper)&lt;br /&gt;
&lt;br /&gt;
# Overview&lt;br /&gt;
&lt;br /&gt;
The FEAM is a digitizer located on the ALPHAg detector. Each FEAM consists of 4 AFTER SCAs for a total of 288 channels.&lt;br /&gt;
&lt;br /&gt;
# Initial Setup&lt;br /&gt;
&lt;br /&gt;
## Quartus Setup&lt;br /&gt;
&lt;br /&gt;
### Create the .cdf&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Click on **Tools -&amp;gt; Programmer**. The **Programmer** window will appear&lt;br /&gt;
3. In the **Programmer** window, click **Auto Detect**. A **Select Device** dialog box will appear&lt;br /&gt;
    1. (Optional) If **Auto Detect** is greyed out, click on **Hardware Setup**. The **Hardware Setup** dialog box will appear&lt;br /&gt;
    2. Under **Hardware Settings**, double-click on the USB JTAG hardware you wish to use&lt;br /&gt;
    3. Click **Close**. The **Hardware Setup** dialog box will close&lt;br /&gt;
5. Click on **File -&amp;gt; Save As**. The **Save As** dialog box will appear&lt;br /&gt;
6. In the **Save As** dialog box, browse to the **/\&amp;lt;project_dir\&amp;gt;/bin/** directory&lt;br /&gt;
7. Make sure the **Add file to current project** checkbox is checked&lt;br /&gt;
7. In the **File name** input box, type &amp;quot;alphag_feam.cdf&amp;quot; and click **Save**&lt;br /&gt;
8. Close the **Programmer** window&lt;br /&gt;
9. Done!&lt;br /&gt;
&lt;br /&gt;
## NIOS Setup&lt;br /&gt;
&lt;br /&gt;
### Create the project files&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
3. The **Workspace Launcher** window will appear, click *OK* to accept the default workspace.&lt;br /&gt;
4. Click **File -&amp;gt; Import...**. The **Import** dialog box will appear&lt;br /&gt;
5. Click on **General -&amp;gt; Existing Projects into Workspace**&lt;br /&gt;
6. Click **Next \&amp;gt;**&lt;br /&gt;
7. Next to **Select root directory** click **Browse...**. A **Browse for Folder** dialog box will appear&lt;br /&gt;
8. Browse to **/\&amp;lt;project_dir\&amp;gt;/hdl/software** and click **OK**&lt;br /&gt;
8. Four Projects should appear in the **Projects** panel: &lt;br /&gt;
    * alphag_feam&lt;br /&gt;
    * alphag\_feam\_bsp &lt;br /&gt;
    * alphag\_feam\_bootloader&lt;br /&gt;
    * alphag\_feam\_bootloader\_bsp&lt;br /&gt;
9. Click **Select All**&lt;br /&gt;
10. Click **Finish**&lt;br /&gt;
11. Done!&lt;br /&gt;
 &lt;br /&gt;
# Build Instructions&lt;br /&gt;
&lt;br /&gt;
## Building from Quartus GUI&lt;br /&gt;
&lt;br /&gt;
**Warning: Please use Quartus Prime Standard Edition 16.1**&lt;br /&gt;
### Generate the QSys File&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Open QSys by clicking **Tools -&amp;gt; QSys**&lt;br /&gt;
2. Click on **File -&amp;gt; Open** (CTRL+O). An **Open File** dialog box should appear.&lt;br /&gt;
3. Select the **alphag_feam.qsys** file from the **/\&amp;lt;project_dir\&amp;gt;/hdl** directory and click **Open**&lt;br /&gt;
4. Modify as necessary. NOTE: Any change to the QSys, even cosmetic such as expanding or collapsing components will cause the QSys to desire a re-generate. &lt;br /&gt;
5. Click **File -&amp;gt; Save** (CTRL+S)&lt;br /&gt;
6. Click **Generate HDL**. A **Generation** dialog box will appear &lt;br /&gt;
7. Select the settings you desire to be changed, if any&lt;br /&gt;
8. Click **Generate**&lt;br /&gt;
9. Wait for the generation to complete.&lt;br /&gt;
10. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the NIOSII Project&lt;br /&gt;
1. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
2. (Optional) If the QSys file has been re-generated performing the following&lt;br /&gt;
    1. Right-click on **alphag\_feam\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
    2. Right-click on **alphag\_feam\_bootloader\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
3. Modify files as needed. WARNING: Do not modify any BSP files by hand! All changes will be lost on next generate.&lt;br /&gt;
4. Click **Project -&amp;gt; Build All** (CTRL+B). If your workspace as multiple projects, it is recommend to close all but the ones related to the FEAM.&lt;br /&gt;
5. Right-click on **alphag\_feam\_bootloader** and select **Make Targets -&amp;gt; Build...**. The **Make Targets** dialog box will appear&lt;br /&gt;
6. In the **Make Targets** dialog box, select **mem\_init\_generate** and click **Build**&lt;br /&gt;
7. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the Quartus Project&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Under **Processing** click **Start Compilation** (CTRL+L)&lt;br /&gt;
2. Wait about 16-30 minutes.&lt;br /&gt;
3. Done!&lt;br /&gt;
  &lt;br /&gt;
**Note:** If Quartus crashed while compiling, delete the **\&amp;lt;project_dir\&amp;gt;/hdl/db** and **\&amp;lt;project_dir\&amp;gt;/hdl/incremental_db** directories and try again&lt;br /&gt;
  &lt;br /&gt;
## Installing from JTAG&lt;br /&gt;
1. Generate the .jic file using the provided /bin/alphag\_feam\_jic.cof&lt;br /&gt;
    1. In the main Quartus window, click **File -&amp;gt; Convert Programming Files**, A **Convert Programming Files** window will appear&lt;br /&gt;
    2. In the **Convert Programming Files** window, click **Open Conversion Setup Data**. An **Open** dialog box will appear&lt;br /&gt;
    3. In the **Open** dialog box, select the **alphag_feam.cof** file located in **/bin/**&lt;br /&gt;
    4. Click **Open**. The **Open dialog box will close&lt;br /&gt;
        * Note the **File name** field, it should display /\&amp;lt;project\_dir\&amp;gt;/bin/alphag\_feam.jic&lt;br /&gt;
    5. In the **Convert Programming Files** window, click **Generate**&lt;br /&gt;
    6. When the .jic is done being generated, a small dialog box will appear, click **OK**&lt;br /&gt;
    7. In the **Convert Programming Files** window, click **Close**&lt;br /&gt;
2. Load the .JIC file using the Programmer&lt;br /&gt;
    1. In the main Quartus window in the **Project Navigator** drop-down input select **Files**.&lt;br /&gt;
    2. Scroll down the window and find the **alphag_feam.cdf**, and double-click it. The **Programmer** window will open&lt;br /&gt;
    3. Click on the icon labelled **5CGXFC4C6**&lt;br /&gt;
    4. Click on the **Change File** button. The **Select New Programming File** dialog box will appear&lt;br /&gt;
    5. Browse to **/\&amp;lt;project_dir\&amp;gt;/bin/** and select **alphag\_feam.jic**&lt;br /&gt;
    6. Click Open. The **Select New Programming File** dialog box will close&lt;br /&gt;
    7. In the main panel, check the **Program/Configure** box on the line that starts **./bin/alphag\_feam.jic**&lt;br /&gt;
    8. Click the **Start** button&lt;br /&gt;
    9. Wait for the **Progress** bar to go to 100% and stop&lt;br /&gt;
    10. Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Internal test pulser =&lt;br /&gt;
&lt;br /&gt;
Documentation from Bryerton:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---------- Forwarded message ---------&lt;br /&gt;
From: Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
Date: Tue, 24 Apr 2018 at 16:18&lt;br /&gt;
Subject: RE: PWB/FEAM internal test pulse&lt;br /&gt;
To: Lars Martin &amp;lt;lmartin@triumf.ca&amp;gt;&lt;br /&gt;
Cc: Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Lars (and Andrea),&lt;br /&gt;
&lt;br /&gt;
In the new(er) firmware the test pulse code has been modified slightly to&lt;br /&gt;
fit in better with the upgraded trigger system. I can add an option to&lt;br /&gt;
allow it to be triggered by the external trigger (currently it has an&lt;br /&gt;
interval option, or you can hit the manual trigger to fire it, if it’s&lt;br /&gt;
enabled)&lt;br /&gt;
&lt;br /&gt;
The *options for the test pulser* are under the *signalproc module*:&lt;br /&gt;
&lt;br /&gt;
*test_pulse_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the test pulse for each&lt;br /&gt;
SCA. If this is False, the other options below will do nothings for that SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the interval trigger for&lt;br /&gt;
each SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval*&lt;br /&gt;
&lt;br /&gt;
An unsigned 32-bit value that marks how many 16ns clock cycles occur&lt;br /&gt;
between interval triggers. Only one value, as there is only one interval&lt;br /&gt;
timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_wdt*&lt;br /&gt;
&lt;br /&gt;
An array of four 16-bit unsigned integers that control the width of the&lt;br /&gt;
pulse for each SCA when the trigger occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, there is a second set of options to control the delay of the *test&lt;br /&gt;
pulse interval trigger*. These options are located under the *trigger&lt;br /&gt;
module*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_ena*&lt;br /&gt;
&lt;br /&gt;
Boolean value enabling/disabling the interval test pulse trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_delay*&lt;br /&gt;
&lt;br /&gt;
Unsigned 32-bit integer controlling the trigger delay, which is the time&lt;br /&gt;
between when the trigger is requested, and when the trigger actually fires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can setup the interval trigger and use that to create event packets&lt;br /&gt;
with the test pulse on set intervals. If the interval trigger is&lt;br /&gt;
insufficient, I can create another option, which is to fire the test pulse&lt;br /&gt;
for enabled SCAs when the external trigger goes. If so, I’ll add this&lt;br /&gt;
option in the *signalproc *module for you:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_on_ext*&lt;br /&gt;
&lt;br /&gt;
An array of four Booleans, that control if the test pulse for that SCA&lt;br /&gt;
fires on external trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember, in order to use the SCA test pulse at all, you must also set the&lt;br /&gt;
SCA to test mode. You can do this by going into the *sca0-3 modules* and&lt;br /&gt;
setting *test* to *functionality *(the value is *3* if you want to set it&lt;br /&gt;
via esper-tool)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Btw currently the SCAs are hard-coded to have all 72 channels receive the&lt;br /&gt;
test pulse on firing, and the option to de-select/select which channels to&lt;br /&gt;
fire is not offered. Would you like this ability? And if so do you want it&lt;br /&gt;
to set all four SCAs the same, or have an option for all 288 channels?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The waveform viewer on the webpage was removed for technical reasons, and&lt;br /&gt;
so all viewing is done via the MIDAS DAQ. There are some preliminary tools&lt;br /&gt;
I’ve created to verify the event packets and their waveforms, but I&lt;br /&gt;
wouldn’t call them easy to setup or use at the moment. (Or very  useful for&lt;br /&gt;
fine comparisons). If KO doesn’t have a way of saving the events to disk, I&lt;br /&gt;
could deliver something that captured and saved waveforms quite quickly.&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Bryerton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From:* Lars Martin&lt;br /&gt;
*Sent:* April 23, 2018 5:10 PM&lt;br /&gt;
*To:* Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
*Cc:* Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
*Subject:* PWB/FEAM internal test pulse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Bryerton,&lt;br /&gt;
&lt;br /&gt;
Andrea and I would like to check the response function of the PWBs. For&lt;br /&gt;
that Daryl suggested to first look at the internal test pulse.&lt;br /&gt;
&lt;br /&gt;
Can you point us to what settings are required to make that go? And to use&lt;br /&gt;
the external trigger if we want to acquire the data?&lt;br /&gt;
&lt;br /&gt;
Ideally we would acquire Midas data from that, but it&#039;s unclear if KO&#039;s&lt;br /&gt;
frontend allows for that right now. Can we access the data with Esper&lt;br /&gt;
instead?&lt;br /&gt;
&lt;br /&gt;
Finally, we haven&#039;t had the waveform display on the web page for a while,&lt;br /&gt;
but Daryl said you guys use it. Are we using a different page somehow?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope all is well with the baby, cheers,&lt;br /&gt;
&lt;br /&gt;
Lars&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* IMPOSSIBLE (ext clock only connected to clock cleaner) add frequency counter for the external clock (62.5 MHz)&lt;br /&gt;
* DONE add random delay before memtest&lt;br /&gt;
* DONE add 4 more bits to udp_delay&lt;br /&gt;
* DONE fix crash on boot if run is active and triggers arrive (check that trigger is off on boot) (do not set trigger/enable_all, ext_trig_ena, inp_trig_ena, signal_proc/force_run to 1 after boot)&lt;br /&gt;
* DONE (kludge jtag uart write()) increase size of jtag uart output buffer, make it unlimited if possible.&lt;br /&gt;
* DONE (kludge jtag uart write()) on dhcp timeout, reboot the fpga - reboot of nios does not clear the jtag uart, which becomes full and nios stops.&lt;br /&gt;
* DONE add NIOS watchdog timeout for fectrl&lt;br /&gt;
* DONE do not use external clock until instructed by fectrl (clock cleaner default is pin select mode, default pin mode is input with pull down, so clock 0 is selected, this is the ext clock. but we can drive clock select pins from the fpga).&lt;br /&gt;
* DONE change clock cleaner power up: use the 2 lines status_clkin0 and status_clkin1 to tell clock cleaner to use the internal clock (clkin2) - from the FPGA drive first line low, second line high. Also change all NIOS code that programs the clock cleaner to keep these two lines in the &amp;quot;input&amp;quot; mode. Current code switches them to &amp;quot;output&amp;quot; mode.&lt;br /&gt;
* DONE clock cleaner power up state is wrong for both choices of clock: 62.5 MHz ext clock and 125 MHz internal clock, see explanation in feam_top.sv. It looks like I need to drive status_clkin0 and status_clkin1 to &amp;quot;holdover&amp;quot; mode, both logic level 1. Currently status_clkin0 is used as SPI read line, this has to be moved to a different line first.&lt;br /&gt;
* add watchdog timeout that works in factory mode (&amp;quot;remote update&amp;quot; watchdog only works in user mode)&lt;br /&gt;
* DONE enable HTTP pipelining - copy changes on mongoose from ADC project.&lt;br /&gt;
* reset everything if it looks like NIOS TCP/IP code has crashed, but enough code is still running to prevent tripping of the fpga-remote-update watchdog timer. such crash tends to happens when the sata link mate is rebooted and incomplete data arrives from the disrupted ethernet data path.&lt;br /&gt;
* DONE when loading AFTER ASIC do not go into infinite loop if read-back is broken (always mismatch).&lt;br /&gt;
* DONE read and report error status information bits for 2983fc.pdf voltages, currents and temperatures monitoring chip. note that SCA12, SCA34, 2V and 5V voltages are flagged 0x0B &amp;quot;ADC out of range, sensor over range&amp;quot; correctly, see 2983fc.pdf table 63 fix explanation of &amp;quot;normal&amp;quot; and &amp;quot;usable&amp;quot; voltage ranges. (5V voltage divider is 2-to-1)&lt;br /&gt;
* add provisions for coded trigger&lt;br /&gt;
* DONE verify readout of MV2 Hall magnetometer (all registers and bits from device are visible in esper)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=977</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=977"/>
		<updated>2023-06-14T19:03:13Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Inventory database */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/expalpha/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha/agana - git repository for agana&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/171 - TMB inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
== Single ADC: (fw rel-20201112-ko) ==&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
== Single PWB, fw 20201005_ko, see https://alphacpc05.cern.ch/elog/Detectors/5563 ==&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data:&lt;br /&gt;
* up to 500 Hz, stable&lt;br /&gt;
&lt;br /&gt;
All pads firing (FW pulser)&lt;br /&gt;
* 4 SCA: up to 272 Hz, 81.6 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 2 SCA: up to 295 Hz, 44.25 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 1 SCA: up to 295 Hz, 22.5 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
&lt;br /&gt;
Conclusion:&lt;br /&gt;
* max PWB date rate 80 Mbytes/sec,&lt;br /&gt;
* max non-suppressed PWB trigger rate: 295 Hz&lt;br /&gt;
* max suppressed PWB trigger rate: 500 Hz (1.6 ms sca readout time)&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 sas links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 sas links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 minisas links 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 minisas links 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* BscFromAdc16a - (at CERN, set to &amp;quot;y&amp;quot;) route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 0..7&lt;br /&gt;
* BscFromAdc16b - route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 8..15&lt;br /&gt;
* BscBotOnly - route BSC trigger data from bottom ASD cards, bsc64_bus = bot&lt;br /&gt;
* BscTopOnly - route BSC trigger data from top ASD cards, bsc64_bus = top&lt;br /&gt;
* BscBotTopOr - (set to &amp;quot;y&amp;quot;) use bsc64_bus = (top OR bottom)&lt;br /&gt;
* BscBotTopAnd - use bsc64_bus = (top AND bottom)&lt;br /&gt;
* BscMultiplicityMin - (set to 2) BSC multiplicity trigger - minimum multiplicity&lt;br /&gt;
* BscMultiplicityWindowClk8 - (set to 80) BSC multiplicity window, 8 ns clocks&lt;br /&gt;
* BscEmptyWindowClk8 - (set to 80) BSC empty window, 8 ns clocks, see [[TRG#bsc64_multiplicity_trigger]]&lt;br /&gt;
* BscGrandOrDelayClk16 - (not implemented) trigger delay used by fectrl when TrigSrc/TrigBscGrandOr is selected&lt;br /&gt;
* BscMultTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigBscMult is selected&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_grand_or), 0x9: (BSC multiplicity)*(TWC aw16_grand_or), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
* CoincTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigCoinc is selected&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=975</id>
		<title>PWB</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=975"/>
		<updated>2023-03-23T19:20:31Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/pwb_rev1_firmware&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag/feam/rev1&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/feam/rev1&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
&lt;br /&gt;
= Schematics =&lt;br /&gt;
&lt;br /&gt;
* [[Image:pwb_rev0.pdf]]&lt;br /&gt;
* [[Image:Pwb-rev1-after.pdf]]&lt;br /&gt;
* [[Image:AlphaG Rev1.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Manuals =&lt;br /&gt;
&lt;br /&gt;
* [[Image:AFTER_MANUAL_V1.pdf]] AFTER SCA manual v1&lt;br /&gt;
* [[Image:AFTER_DataSheet1_1.pdf]] AFTER SCA manual v1.1&lt;br /&gt;
* [[Image:AFTER_SCA_table2.pdf]] AFTER SCA channel map&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Power distribution and monitoring ==&lt;br /&gt;
&lt;br /&gt;
External power supply is:&lt;br /&gt;
* +5V&lt;br /&gt;
* +2V&lt;br /&gt;
&lt;br /&gt;
Central board:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.1R) - Fuse_5V&lt;br /&gt;
* Ext_2V - F2/F3 - RS2 (0.1R) - Idig2-&lt;br /&gt;
* LDO3 - Fuse_5V - DIG_3.3V - selfenable - ADM7154&lt;br /&gt;
* LDO5 - Fuse_5V - DIG_2.5V - selfenable - ADM7154&lt;br /&gt;
* LDO_CLN - Fuse5V - CLN_3.3V - selfenable - &lt;br /&gt;
* VREG - DIG_3.3V - -2.5V SCA BIAS - selfenable - LTC1983ES6-3#TRMPBF&lt;br /&gt;
* LDO7 - DIG_2.5V - DDR3_VRef - enable DDR3_1P5V, DDR3_PG, DDR3_VttEN&lt;br /&gt;
* LDO2 - Idig2V- - DIG_1.1V - enable DIG_3.3V - LT3071&lt;br /&gt;
* LDO6 - Idig2V- - DDR3_1P5V - enable DIG_3.3V - LT3083&lt;br /&gt;
&lt;br /&gt;
SCA Wing:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.3R) - Isca- - SCA_Fuse5V&lt;br /&gt;
* LDO1 - SCA_Fuse5V - SCA3.3V - enable ADC_PWR_EN - ADM7154&lt;br /&gt;
* LDO2 - SCA3.3V - ADC1.8V - selfenable - ADM7154&lt;br /&gt;
* LDO3 - SCA3.3V - TRN2.5V - selfenable - LT1761&lt;br /&gt;
* REF - SCA3.3V - 1.45V Vicm - selfenable - LM4121&lt;br /&gt;
&lt;br /&gt;
esper variables:&lt;br /&gt;
&lt;br /&gt;
* board/i_sca12, i_sca34, v_sca12, v_sca34: voltage and current into LDO1, after fuse F1 (wing board)&lt;br /&gt;
* board/i_p2, v_p2: voltage and current on 2V bus after fuses F2/F3&lt;br /&gt;
* board/i_p5, v_p5: voltage and current on 5V bus after fuse F1 (central board)&lt;br /&gt;
&lt;br /&gt;
== Trigger and Clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock (62.5MHz) and trigger are distributed to the PWB columns via the [https://edev-group.triumf.ca/hw/alphag/trigger-card-sata-adapter/rev1 trigger SATA adapter].&lt;br /&gt;
&lt;br /&gt;
The two miniSAS cables from cdm03 port 5 and 6 are connected to a miniSAS-SATA splitter 1-to-4 (CS Electronics &amp;quot;iSAS SATA adapter&amp;quot; ADP-887P-1X). Since there are only 8 columns and the clock and trigger signals are daisy-chained across the 8 rows, this scheme is sufficient to provide the necessary inputs to all 64 PWBs.&lt;br /&gt;
&lt;br /&gt;
[https://www.techcable.com/sas-mini-sas-cables/sata-cables/ SATA 6Gb/s Cable with Latching Clip. Straight Pinout 1-1 247726-L  40in]&lt;br /&gt;
&lt;br /&gt;
== Optical Link ==&lt;br /&gt;
&lt;br /&gt;
Main data uplink.&lt;br /&gt;
&lt;br /&gt;
SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ [[File:AVAGO SFP specs.pdf|SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ]]&lt;br /&gt;
&lt;br /&gt;
Fiber optic Tripp Lite N820 - 10 m [[File:FiberOptic TrippLite specs.pdf|Fiber optic Tripp Lite N820 - 10 m]]&lt;br /&gt;
&lt;br /&gt;
== SATA Link ==&lt;br /&gt;
&lt;br /&gt;
Secondary data uplink, capable also to deliver clock and trigger.&lt;br /&gt;
&lt;br /&gt;
The SATA link connects PWB from adjacent columuns on the same row.&lt;br /&gt;
&lt;br /&gt;
The SATA cable is a &amp;quot;crossed cable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Firmware =&lt;br /&gt;
&lt;br /&gt;
== Firmware update ==&lt;br /&gt;
&lt;br /&gt;
PWB firmware update is done using &amp;quot;esper-tool&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update factory_rpd&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update file_rpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of PWB firmware pwb_rev1_20200706_ko:&lt;br /&gt;
&lt;br /&gt;
Permission to write into the flash memory is controlled by esper variables:&lt;br /&gt;
&lt;br /&gt;
* allow_write set to &amp;quot;false&amp;quot;: &amp;quot;esper-tool upload&amp;quot; does a &amp;quot;verify&amp;quot;: successful upload means epcq flash content is same as rpd file, error means content is not the same.&lt;br /&gt;
* allow_write set to &amp;quot;true&amp;quot;: &amp;quot;esper-tool upload&amp;quot; updates the epcq flash from the rpd file: for each data block, read the epcq flash, compare to rpd data, if different, erase the flash block, write the flash, read the flash, if there is a mismatch (bad write), return an error.&lt;br /&gt;
* allow_factory_write set to &amp;quot;true&amp;quot; to enable writing to the &amp;quot;factory_rpd&amp;quot;. DO NOT SET IT TO &amp;quot;true&amp;quot; UNLESS YOU MEAN TO UPDATE THE PWB BOOTLOADER. IF YOU FLASH BUM FIRMWARE or IF THERE IS A POWER OUTAGE WHILE UPDATING, THE PWB WILL BE BRICKED and has to be recovered by connecting a USB blaster.&lt;br /&gt;
&lt;br /&gt;
To update firmware of multiple boards to correct version, recommended is the script &amp;quot;update_pwb.perl&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/online/src&lt;br /&gt;
./update_pwb.perl pwb12 pwb06 pwb78&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Factory page and user page firmware boot ==&lt;br /&gt;
&lt;br /&gt;
Each PWB board has 2 firmware images: boot loader (factory page)&lt;br /&gt;
and data acquisition (user page). On power up, the FPGA loads and runs&lt;br /&gt;
the boot loader firmware from the factory page, later the control&lt;br /&gt;
software reboots the FPGA into the data acquisition firmware from&lt;br /&gt;
the user page.&lt;br /&gt;
&lt;br /&gt;
Because loading defective firmware can brick https://en.wikipedia.org/wiki/Brick_(electronics)&lt;br /&gt;
the PWB, new firmware images are loaded into the user page, if anything is wrong,&lt;br /&gt;
the PWB can still boot from the factory page and one can use the firmware update&lt;br /&gt;
function to load a good firmware image into the user page.&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is not intended for data acquisition, it is only meant to provide three functions:&lt;br /&gt;
* boot enough hardware and software to communicate via the ethernet and the sata link&lt;br /&gt;
* firmware update (both factory page and user page)&lt;br /&gt;
* reboot into the user page&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is usually never updated unless absolutely&lt;br /&gt;
needed to fix a problem with these three functions (i.e. compatibility with sata link communications).&lt;br /&gt;
&lt;br /&gt;
If factory image is corrupted or the contains defective firmware and the PWB does not boot (no dhcp, no ping, no esper),&lt;br /&gt;
the only way to unbrick it is by loading good firmware using a jtag flash programmer (usb-blaster). Connecting it requires&lt;br /&gt;
physical access to the jtag connector on the PWB board. It is impossible when the detector is fully assembled in the experiment.&lt;br /&gt;
&lt;br /&gt;
The PWB has a 32 Mbyte EPCQ flash memory chip, it is divided into 2 pages 16 Mbytes of factory page and 16 Mbytes of user page.&lt;br /&gt;
&lt;br /&gt;
A complete firmware image generally contains 3 pieces:&lt;br /&gt;
* FPGA firmware and NIOS &amp;quot;feam_bootloader&amp;quot; software RAM image (sof file)&lt;br /&gt;
* NIOS &amp;quot;feam&amp;quot; software RAM image (feam.elf.flash.hex) - all the C code for esper communications and PWB data acquisition&lt;br /&gt;
* NIOS filesystem image (feam.webpkg.hex) - esper web pages&lt;br /&gt;
&lt;br /&gt;
This is the boot sequence:&lt;br /&gt;
* on power-up the FPGA automatically loads the sof file from address 0 of the EPCQ flash (this is the factory image sof file)&lt;br /&gt;
* the FPGA is &amp;quot;started&amp;quot;&lt;br /&gt;
* the NIOS CPU starts executing the &amp;quot;feam_bootloader&amp;quot; C code embedded in the sof file (NIOS project hdl/software/feam_bootloader)&lt;br /&gt;
* feam_bootloader initializes the hardware (clocks, DDR memory, etc)&lt;br /&gt;
* feam_bootloader write-protects the EPCQ flash memory&lt;br /&gt;
* feam_bootloader copies the &amp;quot;feam&amp;quot; software from EPCQ flash to the DDR memory (after checking for correct checkum)&lt;br /&gt;
* feam_bootloader restarts the NIOS CPU&lt;br /&gt;
* the NIOS CPU starts running from DDR memory, executes the &amp;quot;feam&amp;quot; software (NIOS project hdl/software/feam)&lt;br /&gt;
* call main() in hdl/software/feam/src/task_init.c&lt;br /&gt;
* call task_init() in the same file&lt;br /&gt;
* infinite loop waiting for IP address via DHCP&lt;br /&gt;
* after have IP address, call task_esper() from hdl/software/feam/src/task_esper.c&lt;br /&gt;
* task_esper() creates all the esper modules, esper variables, etc,&lt;br /&gt;
* mod_http.c starts the mongoose web server&lt;br /&gt;
* PWB is open for business&lt;br /&gt;
&lt;br /&gt;
This is the protection against booting corrupted firmware:&lt;br /&gt;
* FPGA hardware loads the sof file from epcq flash and checks for correct checksum before &amp;quot;starting&amp;quot; it&lt;br /&gt;
* NIOS CPU is part of the sof file, protected by sof file checksum&lt;br /&gt;
* NIOS feam_bootloader C code is part of the sof file, protected by the sof checksum&lt;br /&gt;
* feam_bootloader checks for correct signatures and checksums of the DDR memory image&lt;br /&gt;
* &amp;quot;feam&amp;quot; C code is protected by the checksum of the DDR memory image&lt;br /&gt;
&lt;br /&gt;
== NIOS terminal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ /opt/intelFPGA/17.0/quartus/bin/nios2-terminal&lt;br /&gt;
nios2-terminal: connected to hardware target using JTAG UART on cable&lt;br /&gt;
nios2-terminal: &amp;quot;USB-Blaster [2-1.2]&amp;quot;, device 1, instance 0&lt;br /&gt;
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)&lt;br /&gt;
PWB Revision 1 Boot Loader&lt;br /&gt;
Ver 2.0  Build 357 - Wed Jun  6 15:05:35 PDT 2018&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash boot loader firmware via jtag ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ cd ~/online/firmware/pwb_rev1&lt;br /&gt;
$ ls -l&lt;br /&gt;
$ /opt/intelFPGA/17.1/quartus/bin/quartus_pgmw&lt;br /&gt;
... auto detect&lt;br /&gt;
... load the jic file&lt;br /&gt;
... in menu tools-&amp;gt;programmer, enable &amp;quot;unprotect device&amp;quot;&lt;br /&gt;
... start program/configure operation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash user page firmware via esper-tool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ cd online/src&lt;br /&gt;
$ more update_pwb.perl ### check that $fw is set to the desired firmware file&lt;br /&gt;
$ ./update_pwb.perl pwb06 ### or give more PWB names or give &amp;quot;all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
=== quartus version to use ===&lt;br /&gt;
&lt;br /&gt;
* quartus 16.1 should be used for jtag (jtagconfig and jtagd)&lt;br /&gt;
* quartus 17.0 should be used to build the PWB firmware (17.1 is not compatible)&lt;br /&gt;
&lt;br /&gt;
=== start license server ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh agmini@daq16&lt;br /&gt;
/opt/intelFPGA/17.0/quartus/linux64/lmgrd -c ~agmini/online/license-daq16.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare the build environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/17.0/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get latest version of the code and build it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd online/firmware/git/pwb_rev1_firmware&lt;br /&gt;
$ git pull&lt;br /&gt;
$ git checkout alphag&lt;br /&gt;
$ git pull&lt;br /&gt;
$ ./scripts/compile_project.sh&lt;br /&gt;
... about 30-40 minutes ...&lt;br /&gt;
$ ls -l bin/*.sof bin/*.jic bin/*.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 12727389 Jan 24  2018 bin/feam_rev1_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 33554661 Jan 24  2018 bin/feam_rev1.jic&lt;br /&gt;
-rw-r--r-- 1 agmini alpha  6974754 Jan 24  2018 bin/rev1.sof&lt;br /&gt;
$ ### feam.jic is loaded via jtag&lt;br /&gt;
$ ### feam_auto.rpd is loaded via esper&lt;br /&gt;
$ ### feam.sof is used to attach the quartus signal tap logic analyzer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firmware build order and sequence ===&lt;br /&gt;
&lt;br /&gt;
* erase previous build&lt;br /&gt;
* regenerate qsys&lt;br /&gt;
* regenerate NIOS BSP &amp;quot;feam_bootloader_bsp&amp;quot; and &amp;quot;feam_bsp&amp;quot;&lt;br /&gt;
* build NIOS projects &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot;&lt;br /&gt;
* build quartus sof file (with the &amp;quot;feam_bootloader&amp;quot; nios project inside)&lt;br /&gt;
* build jic and rpd files (with the quartus sof file and the &amp;quot;feam&amp;quot; nios project inside)&lt;br /&gt;
* load sof file into the FPGA using jtag (be careful about compatible &amp;quot;feam&amp;quot; nios project already in the epcq flash)&lt;br /&gt;
* load jic file into the epcq factory page using jtag (cycle power for them to take effect)&lt;br /&gt;
* load rpd file into the epcq factory or user page using esper&lt;br /&gt;
&lt;br /&gt;
=== scripts for building the firmware ===&lt;br /&gt;
&lt;br /&gt;
* scripts/compile_project.sh - build everything from scratch:&lt;br /&gt;
* scripts/compile_qsys.sh - regenerate the main qsys component&lt;br /&gt;
* scripts/compile_nios.sh - regenerate the BSPs, then same as compile_elf.sh&lt;br /&gt;
* scripts/compile_elf.sh - build the BSPs, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; NIOS projects&lt;br /&gt;
* scripts/update_elf.sh - regenerate the rpd and jic files to include the new &amp;quot;feam&amp;quot; NIOS build (keeps the old &amp;quot;feam_bootloader&amp;quot; in the sof file)&lt;br /&gt;
* scripts/update_bootloader.sh - also regenerate the sof file to include the new &amp;quot;feam_bootloader&amp;quot; build&lt;br /&gt;
* scripts/clean_quartus.sh - prepare quartus fpga sof file to build from scratch&lt;br /&gt;
* scripts/compile_quartus.sh - build the quartus fpga sof file incrementally (run clean_quartus.sh to build from scratch).&lt;br /&gt;
* scripts/load_jtag_sof.pl bin/rev1.sof - load sof file into the FPGA. this will boot the new fpga firmware, the new feam_bootloader (if update_bootloader.sh was run), but with the old &amp;quot;feam&amp;quot; already in epcq flash. (beware of incompatible sof, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; builds!)&lt;br /&gt;
* scripts/load_jtag_jic.pl bin/feam_rev1.jic - load jic file into the EPCQ flash, same as using the graphical flash programmer tool. (this will leave the FPGA running the quartus jtag flash loader firmware, not the PWB firmware. Cycle power for new jic file to take effect).&lt;br /&gt;
&lt;br /&gt;
== ESPER Variables ==&lt;br /&gt;
&lt;br /&gt;
* Board&lt;br /&gt;
** invert_ext_trig - invert trigger signal from CDM before it drives any logic (to undo incorrect signal polarity)&lt;br /&gt;
** reset_nios - goggle up, them down to reset NIOS subsystem&lt;br /&gt;
&lt;br /&gt;
* Signalproc&lt;br /&gt;
** test_mode - ADC data is replaced with a test pattern, see test mode bits in sca_x_ch_ctrl.&lt;br /&gt;
** sca_a_ch_ctrl, sca_b_ch_ctrl, sca_c_ch_ctrl, sca_d_ch_ctrl - channel control bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11..0 - threshold - channel suppression threshold&lt;br /&gt;
14..12 - ctrl_test_mode - test mode:&lt;br /&gt;
         0=fixed patter 0xa5a,&lt;br /&gt;
         1=time bin counter,&lt;br /&gt;
         2=time bin counter with channel number,&lt;br /&gt;
         3=sequential adc sample counter,&lt;br /&gt;
         4={ch_crossed_out,trig_pos,trig_neg,adc[8:0]},&lt;br /&gt;
         5={trig,adc[10:0]},&lt;br /&gt;
         6={ch_crossed_min,adc[10:0]}&lt;br /&gt;
15 - ctrl_supp_mode - channel suppression mode: 0=adc&amp;lt;=(baseline-threshold), 1=adc&amp;lt;=threshold&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Link&lt;br /&gt;
** link_ctrl - sata link control. The bits are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - sata_link_udp_stream_in_enable - permit data flow from sata link to OFFLOAD_SATA&lt;br /&gt;
1 - udp_stream_out_enable - permit sca data flow to sata link&lt;br /&gt;
2 - sata_to_eth_enable - permit ethernet data flow from sata link to TSE_MAC&lt;br /&gt;
3 - eth_to_sata_enable - permit ethernet data flow from TSE MAC to sata link&lt;br /&gt;
4 - enable_stop_our_tx - enable flow control: allow stop_tx&lt;br /&gt;
#5 - stop_our_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
6 - enable_stop_remote_tx - enable flow control: allow send &amp;quot;stop_tx&amp;quot;&lt;br /&gt;
#7 - stop_remote_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
8 - tx_test_pattern_udp - udp data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
9 - tx_test_pattern_eth - nios-to-sata data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
10 - udp_delay_enable - delay between udp packets, see udp_delay_value below&lt;br /&gt;
11 - reboot_tx - send K_REBOOT command to the sata link mate, where it has same effect as board/reset_nios.&lt;br /&gt;
12 - sata_to_nios_disable&lt;br /&gt;
13 - nios_to_sata_disable&lt;br /&gt;
14 - &lt;br /&gt;
15 - &lt;br /&gt;
16 -&lt;br /&gt;
24..31 - udp_delay_value - delay between udp packets (top 8 bits of a 20-bit counter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware data path ==&lt;br /&gt;
&lt;br /&gt;
Main data path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feam_top&lt;br /&gt;
|&lt;br /&gt;
sca_sigproc&lt;br /&gt;
|&lt;br /&gt;
sca_event_control&lt;br /&gt;
4 * sca_control (sca_channel.sv)&lt;br /&gt;
4 * channel_fifo (1024 samples)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_control (sca_channel.sv)&lt;br /&gt;
|&lt;br /&gt;
state machine to control SCA read and write enables&lt;br /&gt;
|&lt;br /&gt;
sca_write_control (what does it do?!?)&lt;br /&gt;
sca_read_control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_read_control&lt;br /&gt;
|&lt;br /&gt;
state machine to store ADC samples into per-channel FIFOs (channel_fifo)&lt;br /&gt;
selector to replace ADC samples with a test pattern&lt;br /&gt;
79*sca_trig_one -&amp;gt; ch_crossed_out - channel hit detector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_event_control&lt;br /&gt;
|&lt;br /&gt;
event_fifo (hdl/mf/event_descriptor_fifo)&lt;br /&gt;
state machine to take ADC data from 4 per-channel FIFOs (channel_fifo) and store it into DDR memory (write addr increment is 510*8 (number of samples)*8 = 4080).&lt;br /&gt;
state machine to read transposed ADC data from DDR memory (read addr increment is 8+8=16 - 2 samples * 2 bytes * 4 sca = 16) and create 4 per-sca data streams&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data stream:&lt;br /&gt;
4 per-sca data streams from sca_event_control -&amp;gt; sca_sigproc(event_dat)&lt;br /&gt;
|&lt;br /&gt;
packet_chunker (hdl/lib/packet_chunker.sv) (4*event_dat -&amp;gt; event_segment_dat) - multiplex 4 data streams into 1 stream of UDP-sized packets&lt;br /&gt;
|&lt;br /&gt;
packet_length_prepender (hdl/lib/packet_length_prepender.sv)  (event_segment_dat -&amp;gt; udp_event_val_out)&lt;br /&gt;
|&lt;br /&gt;
udp_event_val -&amp;gt; info qsys (udp_stream_sca) and into sata link (mux channel 2).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware build instructions from Bryerton (obsolete) ==&lt;br /&gt;
&lt;br /&gt;
This is the old README.md file from the firmware git repository.&lt;br /&gt;
&lt;br /&gt;
These instructions are not used to build the firmware (use scrips/compile_project.sh).&lt;br /&gt;
&lt;br /&gt;
They are still useful for figuring out which buttons to push in the altera gui programs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ALPHAg FrontEnd Acquisition Module (FEAM) - REV0&lt;br /&gt;
&lt;br /&gt;
Welcome to the ALPHAg FEAM Project &lt;br /&gt;
&lt;br /&gt;
# Table of Contents&lt;br /&gt;
&lt;br /&gt;
* [Overview](#overview)&lt;br /&gt;
* [Inital Setup](#initial-setup)&lt;br /&gt;
    * [Quartus Setup](#quartus-setup)&lt;br /&gt;
        * [Create the .cdf](#create-the-cdf)&lt;br /&gt;
    * [NIOS Setup](#nios-Setup)&lt;br /&gt;
        * [Create the project files](#create-the-project-files) &lt;br /&gt;
* [Build Instructions](#build-instructions)&lt;br /&gt;
    * [Building from Quartus GUI](#building-from-quartus-gui)&lt;br /&gt;
        * [Generate the QSys File](#generate-the-qsys-file)&lt;br /&gt;
        * [Compile the NIOSII Project](#compile-the-niosii-project)&lt;br /&gt;
        * [Compile the Quartus Project](#compile-the-quartus-project)&lt;br /&gt;
    * [Building from Scripts](#building-from-scripts)&lt;br /&gt;
    * [Installing from JTAG](#installing-from-jtag)&lt;br /&gt;
    * [Installing from ESPER](#installing-from-esper)&lt;br /&gt;
&lt;br /&gt;
# Overview&lt;br /&gt;
&lt;br /&gt;
The FEAM is a digitizer located on the ALPHAg detector. Each FEAM consists of 4 AFTER SCAs for a total of 288 channels.&lt;br /&gt;
&lt;br /&gt;
# Initial Setup&lt;br /&gt;
&lt;br /&gt;
## Quartus Setup&lt;br /&gt;
&lt;br /&gt;
### Create the .cdf&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Click on **Tools -&amp;gt; Programmer**. The **Programmer** window will appear&lt;br /&gt;
3. In the **Programmer** window, click **Auto Detect**. A **Select Device** dialog box will appear&lt;br /&gt;
    1. (Optional) If **Auto Detect** is greyed out, click on **Hardware Setup**. The **Hardware Setup** dialog box will appear&lt;br /&gt;
    2. Under **Hardware Settings**, double-click on the USB JTAG hardware you wish to use&lt;br /&gt;
    3. Click **Close**. The **Hardware Setup** dialog box will close&lt;br /&gt;
5. Click on **File -&amp;gt; Save As**. The **Save As** dialog box will appear&lt;br /&gt;
6. In the **Save As** dialog box, browse to the **/\&amp;lt;project_dir\&amp;gt;/bin/** directory&lt;br /&gt;
7. Make sure the **Add file to current project** checkbox is checked&lt;br /&gt;
7. In the **File name** input box, type &amp;quot;alphag_feam.cdf&amp;quot; and click **Save**&lt;br /&gt;
8. Close the **Programmer** window&lt;br /&gt;
9. Done!&lt;br /&gt;
&lt;br /&gt;
## NIOS Setup&lt;br /&gt;
&lt;br /&gt;
### Create the project files&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
3. The **Workspace Launcher** window will appear, click *OK* to accept the default workspace.&lt;br /&gt;
4. Click **File -&amp;gt; Import...**. The **Import** dialog box will appear&lt;br /&gt;
5. Click on **General -&amp;gt; Existing Projects into Workspace**&lt;br /&gt;
6. Click **Next \&amp;gt;**&lt;br /&gt;
7. Next to **Select root directory** click **Browse...**. A **Browse for Folder** dialog box will appear&lt;br /&gt;
8. Browse to **/\&amp;lt;project_dir\&amp;gt;/hdl/software** and click **OK**&lt;br /&gt;
8. Four Projects should appear in the **Projects** panel: &lt;br /&gt;
    * alphag_feam&lt;br /&gt;
    * alphag\_feam\_bsp &lt;br /&gt;
    * alphag\_feam\_bootloader&lt;br /&gt;
    * alphag\_feam\_bootloader\_bsp&lt;br /&gt;
9. Click **Select All**&lt;br /&gt;
10. Click **Finish**&lt;br /&gt;
11. Done!&lt;br /&gt;
 &lt;br /&gt;
# Build Instructions&lt;br /&gt;
&lt;br /&gt;
## Building from Quartus GUI&lt;br /&gt;
&lt;br /&gt;
**Warning: Please use Quartus Prime Standard Edition 16.1**&lt;br /&gt;
### Generate the QSys File&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Open QSys by clicking **Tools -&amp;gt; QSys**&lt;br /&gt;
2. Click on **File -&amp;gt; Open** (CTRL+O). An **Open File** dialog box should appear.&lt;br /&gt;
3. Select the **alphag_feam.qsys** file from the **/\&amp;lt;project_dir\&amp;gt;/hdl** directory and click **Open**&lt;br /&gt;
4. Modify as necessary. NOTE: Any change to the QSys, even cosmetic such as expanding or collapsing components will cause the QSys to desire a re-generate. &lt;br /&gt;
5. Click **File -&amp;gt; Save** (CTRL+S)&lt;br /&gt;
6. Click **Generate HDL**. A **Generation** dialog box will appear &lt;br /&gt;
7. Select the settings you desire to be changed, if any&lt;br /&gt;
8. Click **Generate**&lt;br /&gt;
9. Wait for the generation to complete.&lt;br /&gt;
10. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the NIOSII Project&lt;br /&gt;
1. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
2. (Optional) If the QSys file has been re-generated performing the following&lt;br /&gt;
    1. Right-click on **alphag\_feam\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
    2. Right-click on **alphag\_feam\_bootloader\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
3. Modify files as needed. WARNING: Do not modify any BSP files by hand! All changes will be lost on next generate.&lt;br /&gt;
4. Click **Project -&amp;gt; Build All** (CTRL+B). If your workspace as multiple projects, it is recommend to close all but the ones related to the FEAM.&lt;br /&gt;
5. Right-click on **alphag\_feam\_bootloader** and select **Make Targets -&amp;gt; Build...**. The **Make Targets** dialog box will appear&lt;br /&gt;
6. In the **Make Targets** dialog box, select **mem\_init\_generate** and click **Build**&lt;br /&gt;
7. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the Quartus Project&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Under **Processing** click **Start Compilation** (CTRL+L)&lt;br /&gt;
2. Wait about 16-30 minutes.&lt;br /&gt;
3. Done!&lt;br /&gt;
  &lt;br /&gt;
**Note:** If Quartus crashed while compiling, delete the **\&amp;lt;project_dir\&amp;gt;/hdl/db** and **\&amp;lt;project_dir\&amp;gt;/hdl/incremental_db** directories and try again&lt;br /&gt;
  &lt;br /&gt;
## Installing from JTAG&lt;br /&gt;
1. Generate the .jic file using the provided /bin/alphag\_feam\_jic.cof&lt;br /&gt;
    1. In the main Quartus window, click **File -&amp;gt; Convert Programming Files**, A **Convert Programming Files** window will appear&lt;br /&gt;
    2. In the **Convert Programming Files** window, click **Open Conversion Setup Data**. An **Open** dialog box will appear&lt;br /&gt;
    3. In the **Open** dialog box, select the **alphag_feam.cof** file located in **/bin/**&lt;br /&gt;
    4. Click **Open**. The **Open dialog box will close&lt;br /&gt;
        * Note the **File name** field, it should display /\&amp;lt;project\_dir\&amp;gt;/bin/alphag\_feam.jic&lt;br /&gt;
    5. In the **Convert Programming Files** window, click **Generate**&lt;br /&gt;
    6. When the .jic is done being generated, a small dialog box will appear, click **OK**&lt;br /&gt;
    7. In the **Convert Programming Files** window, click **Close**&lt;br /&gt;
2. Load the .JIC file using the Programmer&lt;br /&gt;
    1. In the main Quartus window in the **Project Navigator** drop-down input select **Files**.&lt;br /&gt;
    2. Scroll down the window and find the **alphag_feam.cdf**, and double-click it. The **Programmer** window will open&lt;br /&gt;
    3. Click on the icon labelled **5CGXFC4C6**&lt;br /&gt;
    4. Click on the **Change File** button. The **Select New Programming File** dialog box will appear&lt;br /&gt;
    5. Browse to **/\&amp;lt;project_dir\&amp;gt;/bin/** and select **alphag\_feam.jic**&lt;br /&gt;
    6. Click Open. The **Select New Programming File** dialog box will close&lt;br /&gt;
    7. In the main panel, check the **Program/Configure** box on the line that starts **./bin/alphag\_feam.jic**&lt;br /&gt;
    8. Click the **Start** button&lt;br /&gt;
    9. Wait for the **Progress** bar to go to 100% and stop&lt;br /&gt;
    10. Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Internal test pulser =&lt;br /&gt;
&lt;br /&gt;
Documentation from Bryerton:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---------- Forwarded message ---------&lt;br /&gt;
From: Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
Date: Tue, 24 Apr 2018 at 16:18&lt;br /&gt;
Subject: RE: PWB/FEAM internal test pulse&lt;br /&gt;
To: Lars Martin &amp;lt;lmartin@triumf.ca&amp;gt;&lt;br /&gt;
Cc: Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Lars (and Andrea),&lt;br /&gt;
&lt;br /&gt;
In the new(er) firmware the test pulse code has been modified slightly to&lt;br /&gt;
fit in better with the upgraded trigger system. I can add an option to&lt;br /&gt;
allow it to be triggered by the external trigger (currently it has an&lt;br /&gt;
interval option, or you can hit the manual trigger to fire it, if it’s&lt;br /&gt;
enabled)&lt;br /&gt;
&lt;br /&gt;
The *options for the test pulser* are under the *signalproc module*:&lt;br /&gt;
&lt;br /&gt;
*test_pulse_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the test pulse for each&lt;br /&gt;
SCA. If this is False, the other options below will do nothings for that SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the interval trigger for&lt;br /&gt;
each SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval*&lt;br /&gt;
&lt;br /&gt;
An unsigned 32-bit value that marks how many 16ns clock cycles occur&lt;br /&gt;
between interval triggers. Only one value, as there is only one interval&lt;br /&gt;
timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_wdt*&lt;br /&gt;
&lt;br /&gt;
An array of four 16-bit unsigned integers that control the width of the&lt;br /&gt;
pulse for each SCA when the trigger occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, there is a second set of options to control the delay of the *test&lt;br /&gt;
pulse interval trigger*. These options are located under the *trigger&lt;br /&gt;
module*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_ena*&lt;br /&gt;
&lt;br /&gt;
Boolean value enabling/disabling the interval test pulse trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_delay*&lt;br /&gt;
&lt;br /&gt;
Unsigned 32-bit integer controlling the trigger delay, which is the time&lt;br /&gt;
between when the trigger is requested, and when the trigger actually fires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can setup the interval trigger and use that to create event packets&lt;br /&gt;
with the test pulse on set intervals. If the interval trigger is&lt;br /&gt;
insufficient, I can create another option, which is to fire the test pulse&lt;br /&gt;
for enabled SCAs when the external trigger goes. If so, I’ll add this&lt;br /&gt;
option in the *signalproc *module for you:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_on_ext*&lt;br /&gt;
&lt;br /&gt;
An array of four Booleans, that control if the test pulse for that SCA&lt;br /&gt;
fires on external trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember, in order to use the SCA test pulse at all, you must also set the&lt;br /&gt;
SCA to test mode. You can do this by going into the *sca0-3 modules* and&lt;br /&gt;
setting *test* to *functionality *(the value is *3* if you want to set it&lt;br /&gt;
via esper-tool)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Btw currently the SCAs are hard-coded to have all 72 channels receive the&lt;br /&gt;
test pulse on firing, and the option to de-select/select which channels to&lt;br /&gt;
fire is not offered. Would you like this ability? And if so do you want it&lt;br /&gt;
to set all four SCAs the same, or have an option for all 288 channels?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The waveform viewer on the webpage was removed for technical reasons, and&lt;br /&gt;
so all viewing is done via the MIDAS DAQ. There are some preliminary tools&lt;br /&gt;
I’ve created to verify the event packets and their waveforms, but I&lt;br /&gt;
wouldn’t call them easy to setup or use at the moment. (Or very  useful for&lt;br /&gt;
fine comparisons). If KO doesn’t have a way of saving the events to disk, I&lt;br /&gt;
could deliver something that captured and saved waveforms quite quickly.&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Bryerton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From:* Lars Martin&lt;br /&gt;
*Sent:* April 23, 2018 5:10 PM&lt;br /&gt;
*To:* Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
*Cc:* Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
*Subject:* PWB/FEAM internal test pulse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Bryerton,&lt;br /&gt;
&lt;br /&gt;
Andrea and I would like to check the response function of the PWBs. For&lt;br /&gt;
that Daryl suggested to first look at the internal test pulse.&lt;br /&gt;
&lt;br /&gt;
Can you point us to what settings are required to make that go? And to use&lt;br /&gt;
the external trigger if we want to acquire the data?&lt;br /&gt;
&lt;br /&gt;
Ideally we would acquire Midas data from that, but it&#039;s unclear if KO&#039;s&lt;br /&gt;
frontend allows for that right now. Can we access the data with Esper&lt;br /&gt;
instead?&lt;br /&gt;
&lt;br /&gt;
Finally, we haven&#039;t had the waveform display on the web page for a while,&lt;br /&gt;
but Daryl said you guys use it. Are we using a different page somehow?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope all is well with the baby, cheers,&lt;br /&gt;
&lt;br /&gt;
Lars&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* IMPOSSIBLE (ext clock only connected to clock cleaner) add frequency counter for the external clock (62.5 MHz)&lt;br /&gt;
* DONE add random delay before memtest&lt;br /&gt;
* DONE add 4 more bits to udp_delay&lt;br /&gt;
* DONE fix crash on boot if run is active and triggers arrive (check that trigger is off on boot) (do not set trigger/enable_all, ext_trig_ena, inp_trig_ena, signal_proc/force_run to 1 after boot)&lt;br /&gt;
* DONE (kludge jtag uart write()) increase size of jtag uart output buffer, make it unlimited if possible.&lt;br /&gt;
* DONE (kludge jtag uart write()) on dhcp timeout, reboot the fpga - reboot of nios does not clear the jtag uart, which becomes full and nios stops.&lt;br /&gt;
* DONE add NIOS watchdog timeout for fectrl&lt;br /&gt;
* DONE do not use external clock until instructed by fectrl (clock cleaner default is pin select mode, default pin mode is input with pull down, so clock 0 is selected, this is the ext clock. but we can drive clock select pins from the fpga).&lt;br /&gt;
* DONE change clock cleaner power up: use the 2 lines status_clkin0 and status_clkin1 to tell clock cleaner to use the internal clock (clkin2) - from the FPGA drive first line low, second line high. Also change all NIOS code that programs the clock cleaner to keep these two lines in the &amp;quot;input&amp;quot; mode. Current code switches them to &amp;quot;output&amp;quot; mode.&lt;br /&gt;
* DONE clock cleaner power up state is wrong for both choices of clock: 62.5 MHz ext clock and 125 MHz internal clock, see explanation in feam_top.sv. It looks like I need to drive status_clkin0 and status_clkin1 to &amp;quot;holdover&amp;quot; mode, both logic level 1. Currently status_clkin0 is used as SPI read line, this has to be moved to a different line first.&lt;br /&gt;
* add watchdog timeout that works in factory mode (&amp;quot;remote update&amp;quot; watchdog only works in user mode)&lt;br /&gt;
* DONE enable HTTP pipelining - copy changes on mongoose from ADC project.&lt;br /&gt;
* reset everything if it looks like NIOS TCP/IP code has crashed, but enough code is still running to prevent tripping of the fpga-remote-update watchdog timer. such crash tends to happens when the sata link mate is rebooted and incomplete data arrives from the disrupted ethernet data path.&lt;br /&gt;
* DONE when loading AFTER ASIC do not go into infinite loop if read-back is broken (always mismatch).&lt;br /&gt;
* DONE read and report error status information bits for 2983fc.pdf voltages, currents and temperatures monitoring chip. note that SCA12, SCA34, 2V and 5V voltages are flagged 0x0B &amp;quot;ADC out of range, sensor over range&amp;quot; correctly, see 2983fc.pdf table 63 fix explanation of &amp;quot;normal&amp;quot; and &amp;quot;usable&amp;quot; voltage ranges. (5V voltage divider is 2-to-1)&lt;br /&gt;
* add provisions for coded trigger&lt;br /&gt;
* DONE verify readout of MV2 Hall magnetometer (all registers and bits from device are visible in esper)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=974</id>
		<title>PWB</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=974"/>
		<updated>2023-03-23T18:18:26Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/pwb_rev1_firmware&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag/feam/rev1&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/feam/rev1&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
&lt;br /&gt;
= Schematics =&lt;br /&gt;
&lt;br /&gt;
* [[Image:pwb_rev0.pdf]]&lt;br /&gt;
* [[Image:Pwb-rev1-after.pdf]]&lt;br /&gt;
* [[Image:AlphaG Rev1.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Manuals =&lt;br /&gt;
&lt;br /&gt;
* [[Image:AFTER_MANUAL_V1.pdf]] AFTER SCA manual v1&lt;br /&gt;
* [[Image:AFTER_DataSheet1_1.pdf]] AFTER SCA manual v1.1&lt;br /&gt;
* [[Image:AFTER_SCA_table2.pdf]] AFTER SCA channel map&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Power distribution and monitoring ==&lt;br /&gt;
&lt;br /&gt;
External power supply is:&lt;br /&gt;
* +5V&lt;br /&gt;
* +2V&lt;br /&gt;
&lt;br /&gt;
Central board:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.1R) - Fuse_5V&lt;br /&gt;
* Ext_2V - F2/F3 - RS2 (0.1R) - Idig2-&lt;br /&gt;
* LDO3 - Fuse_5V - DIG_3.3V - selfenable - ADM7154&lt;br /&gt;
* LDO5 - Fuse_5V - DIG_2.5V - selfenable - ADM7154&lt;br /&gt;
* LDO_CLN - Fuse5V - CLN_3.3V - selfenable - &lt;br /&gt;
* VREG - DIG_3.3V - -2.5V SCA BIAS - selfenable - LTC1983ES6-3#TRMPBF&lt;br /&gt;
* LDO7 - DIG_2.5V - DDR3_VRef - enable DDR3_1P5V, DDR3_PG, DDR3_VttEN&lt;br /&gt;
* LDO2 - Idig2V- - DIG_1.1V - enable DIG_3.3V - LT3071&lt;br /&gt;
* LDO6 - Idig2V- - DDR3_1P5V - enable DIG_3.3V - LT3083&lt;br /&gt;
&lt;br /&gt;
SCA Wing:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.3R) - Isca- - SCA_Fuse5V&lt;br /&gt;
* LDO1 - SCA_Fuse5V - SCA3.3V - enable ADC_PWR_EN - ADM7154&lt;br /&gt;
* LDO2 - SCA3.3V - ADC1.8V - selfenable - ADM7154&lt;br /&gt;
* LDO3 - SCA3.3V - TRN2.5V - selfenable - LT1761&lt;br /&gt;
* REF - SCA3.3V - 1.45V Vicm - selfenable - LM4121&lt;br /&gt;
&lt;br /&gt;
esper variables:&lt;br /&gt;
&lt;br /&gt;
* board/i_sca12, i_sca34, v_sca12, v_sca34: voltage and current into LDO1, after fuse F1 (wing board)&lt;br /&gt;
* board/i_p2, v_p2: voltage and current on 2V bus after fuses F2/F3&lt;br /&gt;
* board/i_p5, v_p5: voltage and current on 5V bus after fuse F1 (central board)&lt;br /&gt;
&lt;br /&gt;
== Trigger and Clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock (62.5MHz) and trigger are distributed to the PWB columns via the [https://edev-group.triumf.ca/hw/alphag/trigger-card-sata-adapter/rev1 trigger SATA adapter].&lt;br /&gt;
&lt;br /&gt;
The two miniSAS cables from cdm03 port 5 and 6 are connected to a miniSAS-SATA splitter 1-to-4 (CS Electronics &amp;quot;iSAS SATA adapter&amp;quot; ADP-887P-1X). Since there are only 8 columns and the clock and trigger signals are daisy-chained across the 8 rows, this scheme is sufficient to provide the necessary inputs to all 64 PWBs.&lt;br /&gt;
&lt;br /&gt;
[https://www.techcable.com/sas-mini-sas-cables/sata-cables/ SATA 6Gb/s Cable with Latching Clip. Straight Pinout 1-1 247726-L  40in]&lt;br /&gt;
&lt;br /&gt;
== Optical Link ==&lt;br /&gt;
&lt;br /&gt;
Main data uplink.&lt;br /&gt;
&lt;br /&gt;
SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ [[File:AVAGO SFP specs.pdf|SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ]]&lt;br /&gt;
&lt;br /&gt;
Fiber optic Tripp Lite N820 - 10 m [[File:FiberOptic TrippLite specs.pdf|Fiber optic Tripp Lite N820 - 10 m]]&lt;br /&gt;
&lt;br /&gt;
== SATA Link ==&lt;br /&gt;
&lt;br /&gt;
Secondary data uplink, capable also to deliver clock and trigger.&lt;br /&gt;
&lt;br /&gt;
The SATA link connects PWB from adjacent columuns on the same row.&lt;br /&gt;
&lt;br /&gt;
The SATA cable is a &amp;quot;crossed cable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Firmware =&lt;br /&gt;
&lt;br /&gt;
== Firmware update ==&lt;br /&gt;
&lt;br /&gt;
PWB firmware update is done using &amp;quot;esper-tool&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update factory_rpd&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update file_rpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of PWB firmware pwb_rev1_20200706_ko:&lt;br /&gt;
&lt;br /&gt;
Permission to write into the flash memory is controlled by esper variables:&lt;br /&gt;
&lt;br /&gt;
* allow_write set to &amp;quot;false&amp;quot;: &amp;quot;esper-tool upload&amp;quot; does a &amp;quot;verify&amp;quot;: successful upload means epcq flash content is same as rpd file, error means content is not the same.&lt;br /&gt;
* allow_write set to &amp;quot;true&amp;quot;: &amp;quot;esper-tool upload&amp;quot; updates the epcq flash from the rpd file: for each data block, read the epcq flash, compare to rpd data, if different, erase the flash block, write the flash, read the flash, if there is a mismatch (bad write), return an error.&lt;br /&gt;
* allow_factory_write set to &amp;quot;true&amp;quot; to enable writing to the &amp;quot;factory_rpd&amp;quot;. DO NOT SET IT TO &amp;quot;true&amp;quot; UNLESS YOU MEAN TO UPDATE THE PWB BOOTLOADER. IF YOU FLASH BUM FIRMWARE or IF THERE IS A POWER OUTAGE WHILE UPDATING, THE PWB WILL BE BRICKED and has to be recovered by connecting a USB blaster.&lt;br /&gt;
&lt;br /&gt;
To update firmware of multiple boards to correct version, recommended is the script &amp;quot;update_pwb.perl&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/online/src&lt;br /&gt;
./update_pwb.perl pwb12 pwb06 pwb78&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Factory page and user page firmware boot ==&lt;br /&gt;
&lt;br /&gt;
Each PWB board has 2 firmware images: boot loader (factory page)&lt;br /&gt;
and data acquisition (user page). On power up, the FPGA loads and runs&lt;br /&gt;
the boot loader firmware from the factory page, later the control&lt;br /&gt;
software reboots the FPGA into the data acquisition firmware from&lt;br /&gt;
the user page.&lt;br /&gt;
&lt;br /&gt;
Because loading defective firmware can brick https://en.wikipedia.org/wiki/Brick_(electronics)&lt;br /&gt;
the PWB, new firmware images are loaded into the user page, if anything is wrong,&lt;br /&gt;
the PWB can still boot from the factory page and one can use the firmware update&lt;br /&gt;
function to load a good firmware image into the user page.&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is not intended for data acquisition, it is only meant to provide three functions:&lt;br /&gt;
* boot enough hardware and software to communicate via the ethernet and the sata link&lt;br /&gt;
* firmware update (both factory page and user page)&lt;br /&gt;
* reboot into the user page&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is usually never updated unless absolutely&lt;br /&gt;
needed to fix a problem with these three functions (i.e. compatibility with sata link communications).&lt;br /&gt;
&lt;br /&gt;
If factory image is corrupted or the contains defective firmware and the PWB does not boot (no dhcp, no ping, no esper),&lt;br /&gt;
the only way to unbrick it is by loading good firmware using a jtag flash programmer (usb-blaster). Connecting it requires&lt;br /&gt;
physical access to the jtag connector on the PWB board. It is impossible when the detector is fully assembled in the experiment.&lt;br /&gt;
&lt;br /&gt;
The PWB has a 32 Mbyte EPCQ flash memory chip, it is divided into 2 pages 16 Mbytes of factory page and 16 Mbytes of user page.&lt;br /&gt;
&lt;br /&gt;
A complete firmware image generally contains 3 pieces:&lt;br /&gt;
* FPGA firmware and NIOS &amp;quot;feam_bootloader&amp;quot; software RAM image (sof file)&lt;br /&gt;
* NIOS &amp;quot;feam&amp;quot; software RAM image (feam.elf.flash.hex) - all the C code for esper communications and PWB data acquisition&lt;br /&gt;
* NIOS filesystem image (feam.webpkg.hex) - esper web pages&lt;br /&gt;
&lt;br /&gt;
This is the boot sequence:&lt;br /&gt;
* on power-up the FPGA automatically loads the sof file from address 0 of the EPCQ flash (this is the factory image sof file)&lt;br /&gt;
* the FPGA is &amp;quot;started&amp;quot;&lt;br /&gt;
* the NIOS CPU starts executing the &amp;quot;feam_bootloader&amp;quot; C code embedded in the sof file (NIOS project hdl/software/feam_bootloader)&lt;br /&gt;
* feam_bootloader initializes the hardware (clocks, DDR memory, etc)&lt;br /&gt;
* feam_bootloader write-protects the EPCQ flash memory&lt;br /&gt;
* feam_bootloader copies the &amp;quot;feam&amp;quot; software from EPCQ flash to the DDR memory (after checking for correct checkum)&lt;br /&gt;
* feam_bootloader restarts the NIOS CPU&lt;br /&gt;
* the NIOS CPU starts running from DDR memory, executes the &amp;quot;feam&amp;quot; software (NIOS project hdl/software/feam)&lt;br /&gt;
* call main() in hdl/software/feam/src/task_init.c&lt;br /&gt;
* call task_init() in the same file&lt;br /&gt;
* infinite loop waiting for IP address via DHCP&lt;br /&gt;
* after have IP address, call task_esper() from hdl/software/feam/src/task_esper.c&lt;br /&gt;
* task_esper() creates all the esper modules, esper variables, etc,&lt;br /&gt;
* mod_http.c starts the mongoose web server&lt;br /&gt;
* PWB is open for business&lt;br /&gt;
&lt;br /&gt;
This is the protection against booting corrupted firmware:&lt;br /&gt;
* FPGA hardware loads the sof file from epcq flash and checks for correct checksum before &amp;quot;starting&amp;quot; it&lt;br /&gt;
* NIOS CPU is part of the sof file, protected by sof file checksum&lt;br /&gt;
* NIOS feam_bootloader C code is part of the sof file, protected by the sof checksum&lt;br /&gt;
* feam_bootloader checks for correct signatures and checksums of the DDR memory image&lt;br /&gt;
* &amp;quot;feam&amp;quot; C code is protected by the checksum of the DDR memory image&lt;br /&gt;
&lt;br /&gt;
== NIOS terminal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ /opt/intelFPGA/17.0/quartus/bin/nios2-terminal&lt;br /&gt;
nios2-terminal: connected to hardware target using JTAG UART on cable&lt;br /&gt;
nios2-terminal: &amp;quot;USB-Blaster [2-1.2]&amp;quot;, device 1, instance 0&lt;br /&gt;
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)&lt;br /&gt;
PWB Revision 1 Boot Loader&lt;br /&gt;
Ver 2.0  Build 357 - Wed Jun  6 15:05:35 PDT 2018&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash boot loader firmware via jtag ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ cd ~/online/firmware/pwb_rev1&lt;br /&gt;
$ ls -l&lt;br /&gt;
$ /opt/intelFPGA/17.1/quartus/bin/quartus_pgmw&lt;br /&gt;
... auto detect&lt;br /&gt;
... load the jic file&lt;br /&gt;
... in menu tools-&amp;gt;programmer, enable &amp;quot;unprotect device&amp;quot;&lt;br /&gt;
... start program/configure operation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash user page firmware via esper-tool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ cd online/src&lt;br /&gt;
$ more update_pwb.perl ### check that $fw is set to the desired firmware file&lt;br /&gt;
$ ./update_pwb.perl pwb06 ### or give more PWB names or give &amp;quot;all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
=== quartus version to use ===&lt;br /&gt;
&lt;br /&gt;
* quartus 16.1 should be used for jtag (jtagconfig and jtagd)&lt;br /&gt;
* quartus 17.0 should be used to build the PWB firmware (17.1 is not compatible)&lt;br /&gt;
&lt;br /&gt;
=== start license server ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh agmini@daq16&lt;br /&gt;
/opt/intelFPGA/17.0/quartus/linux64/lmgrd -c ~agmini/online/license-daq16.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare the build environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/17.0/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get latest version of the code and build it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd online/firmware/git/pwb_rev1_firmware&lt;br /&gt;
$ git pull&lt;br /&gt;
$ git checkout alphag&lt;br /&gt;
$ git pull&lt;br /&gt;
$ ./scripts/compile_project.sh&lt;br /&gt;
... about 30-40 minutes ...&lt;br /&gt;
$ ls -l bin/*.sof bin/*.jic bin/*.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 12727389 Jan 24  2018 bin/feam_rev1_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 33554661 Jan 24  2018 bin/feam_rev1.jic&lt;br /&gt;
-rw-r--r-- 1 agmini alpha  6974754 Jan 24  2018 bin/rev1.sof&lt;br /&gt;
$ ### feam.jic is loaded via jtag&lt;br /&gt;
$ ### feam_auto.rpd is loaded via esper&lt;br /&gt;
$ ### feam.sof is used to attach the quartus signal tap logic analyzer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firmware build order and sequence ===&lt;br /&gt;
&lt;br /&gt;
* erase previous build&lt;br /&gt;
* regenerate qsys&lt;br /&gt;
* regenerate NIOS BSP &amp;quot;feam_bootloader_bsp&amp;quot; and &amp;quot;feam_bsp&amp;quot;&lt;br /&gt;
* build NIOS projects &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot;&lt;br /&gt;
* build quartus sof file (with the &amp;quot;feam_bootloader&amp;quot; nios project inside)&lt;br /&gt;
* build jic and rpd files (with the quartus sof file and the &amp;quot;feam&amp;quot; nios project inside)&lt;br /&gt;
* load sof file into the FPGA using jtag (be careful about compatible &amp;quot;feam&amp;quot; nios project already in the epcq flash)&lt;br /&gt;
* load jic file into the epcq factory page using jtag (cycle power for them to take effect)&lt;br /&gt;
* load rpd file into the epcq factory or user page using esper&lt;br /&gt;
&lt;br /&gt;
=== scripts for building the firmware ===&lt;br /&gt;
&lt;br /&gt;
* scripts/compile_project.sh - build everything from scratch:&lt;br /&gt;
* scripts/compile_qsys.sh - regenerate the main qsys component&lt;br /&gt;
* scripts/compile_nios.sh - regenerate the BSPs, then same as compile_elf.sh&lt;br /&gt;
* scripts/compile_elf.sh - build the BSPs, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; NIOS projects&lt;br /&gt;
* scripts/update_elf.sh - regenerate the rpd and jic files to include the new &amp;quot;feam&amp;quot; NIOS build (keeps the old &amp;quot;feam_bootloader&amp;quot; in the sof file)&lt;br /&gt;
* scripts/update_bootloader.sh - also regenerate the sof file to include the new &amp;quot;feam_bootloader&amp;quot; build&lt;br /&gt;
* scripts/clean_quartus.sh - prepare quartus fpga sof file to build from scratch&lt;br /&gt;
* scripts/compile_quartus.sh - build the quartus fpga sof file incrementally (run clean_quartus.sh to build from scratch).&lt;br /&gt;
* scripts/load_jtag_sof.pl bin/rev1.sof - load sof file into the FPGA. this will boot the new fpga firmware, the new feam_bootloader (if update_bootloader.sh was run), but with the old &amp;quot;feam&amp;quot; already in epcq flash. (beware of incompatible sof, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; builds!)&lt;br /&gt;
* scripts/load_jtag_jic.pl bin/feam_rev1.jic - load jic file into the EPCQ flash, same as using the graphical flash programmer tool. (this will leave the FPGA running the quartus jtag flash loader firmware, not the PWB firmware. Cycle power for new jic file to take effect).&lt;br /&gt;
&lt;br /&gt;
== ESPER Variables ==&lt;br /&gt;
&lt;br /&gt;
* Board&lt;br /&gt;
** invert_ext_trig - invert trigger signal from CDM before it drives any logic (to undo incorrect signal polarity)&lt;br /&gt;
** reset_nios - goggle up, them down to reset NIOS subsystem&lt;br /&gt;
&lt;br /&gt;
* Signalproc&lt;br /&gt;
** test_mode - ADC data is replaced with a test pattern, see test mode bits in sca_x_ch_ctrl.&lt;br /&gt;
** sca_a_ch_ctrl, sca_b_ch_ctrl, sca_c_ch_ctrl, sca_d_ch_ctrl - channel control bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11..0 - threshold - channel suppression threshold&lt;br /&gt;
14..12 - ctrl_test_mode - test mode:&lt;br /&gt;
         0=fixed patter 0xa5a,&lt;br /&gt;
         1=time bin counter,&lt;br /&gt;
         2=time bin counter with channel number,&lt;br /&gt;
         3=sequential adc sample counter,&lt;br /&gt;
         4={ch_crossed_out,trig_pos,trig_neg,adc[8:0]},&lt;br /&gt;
         5={trig,adc[10:0]},&lt;br /&gt;
         6={ch_crossed_min,adc[10:0]}&lt;br /&gt;
15 - ctrl_supp_mode - channel suppression mode: 0=adc&amp;lt;=(baseline-threshold), 1=adc&amp;lt;=threshold&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Link&lt;br /&gt;
** link_ctrl - sata link control. The bits are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - sata_link_udp_stream_in_enable - permit data flow from sata link to OFFLOAD_SATA&lt;br /&gt;
1 - udp_stream_out_enable - permit sca data flow to sata link&lt;br /&gt;
2 - sata_to_eth_enable - permit ethernet data flow from sata link to TSE_MAC&lt;br /&gt;
3 - eth_to_sata_enable - permit ethernet data flow from TSE MAC to sata link&lt;br /&gt;
4 - enable_stop_our_tx - enable flow control: allow stop_tx&lt;br /&gt;
#5 - stop_our_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
6 - enable_stop_remote_tx - enable flow control: allow send &amp;quot;stop_tx&amp;quot;&lt;br /&gt;
#7 - stop_remote_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
8 - tx_test_pattern_udp - udp data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
9 - tx_test_pattern_eth - nios-to-sata data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
10 - udp_delay_enable - delay between udp packets, see udp_delay_value below&lt;br /&gt;
11 - reboot_tx - send K_REBOOT command to the sata link mate, where it has same effect as board/reset_nios.&lt;br /&gt;
12 - sata_to_nios_disable&lt;br /&gt;
13 - nios_to_sata_disable&lt;br /&gt;
14 - &lt;br /&gt;
15 - &lt;br /&gt;
16 -&lt;br /&gt;
24..31 - udp_delay_value - delay between udp packets (top 8 bits of a 20-bit counter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware data path ==&lt;br /&gt;
&lt;br /&gt;
Main data path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feam_top&lt;br /&gt;
|&lt;br /&gt;
sca_sigproc&lt;br /&gt;
|&lt;br /&gt;
sca_event_control&lt;br /&gt;
4 * sca_control (sca_channel.sv)&lt;br /&gt;
4 * channel_fifo (1024 samples)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_control (sca_channel.sv)&lt;br /&gt;
|&lt;br /&gt;
state machine to control SCA read and write enables&lt;br /&gt;
|&lt;br /&gt;
sca_write_control (what does it do?!?)&lt;br /&gt;
sca_read_control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_read_control&lt;br /&gt;
|&lt;br /&gt;
state machine to store ADC samples into per-channel FIFOs (channel_fifo)&lt;br /&gt;
selector to replace ADC samples with a test pattern&lt;br /&gt;
79*sca_trig_one -&amp;gt; ch_crossed_out - channel hit detector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_event_control&lt;br /&gt;
|&lt;br /&gt;
event_fifo (hdl/mf/event_descriptor_fifo)&lt;br /&gt;
state machine to take ADC data from 4 per-channel FIFOs (channel_fifo) and store it into DDR memory (write addr increment is 510*8 (number of samples)*8 = 4080).&lt;br /&gt;
state machine to read transposed ADC data from DDR memory (read addr increment is 8+8=16 - 2 samples * 2 bytes * 4 sca = 16) and create 4 per-sca data streams&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data stream:&lt;br /&gt;
4 per-sca data streams from sca_event_control -&amp;gt; sca_sigproc(event_dat)&lt;br /&gt;
|&lt;br /&gt;
packet_chunker (hdl/lib/packet_chunker.sv) (4*event_dat -&amp;gt; event_segment_dat) - multiplex 4 data streams into 1 stream of UDP-sized packets&lt;br /&gt;
|&lt;br /&gt;
packet_length_prepender (hdl/lib/packet_length_prepender.sv)  (event_segment_dat -&amp;gt; udp_event_val_out)&lt;br /&gt;
|&lt;br /&gt;
udp_event_val -&amp;gt; info qsys (udp_stream_sca) and into sata link (mux channel 2).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware build instructions from Bryerton (obsolete) ==&lt;br /&gt;
&lt;br /&gt;
This is the old README.md file from the firmware git repository.&lt;br /&gt;
&lt;br /&gt;
These instructions are not used to build the firmware (use scrips/compile_project.sh).&lt;br /&gt;
&lt;br /&gt;
They are still useful for figuring out which buttons to push in the altera gui programs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ALPHAg FrontEnd Acquisition Module (FEAM) - REV0&lt;br /&gt;
&lt;br /&gt;
Welcome to the ALPHAg FEAM Project &lt;br /&gt;
&lt;br /&gt;
# Table of Contents&lt;br /&gt;
&lt;br /&gt;
* [Overview](#overview)&lt;br /&gt;
* [Inital Setup](#initial-setup)&lt;br /&gt;
    * [Quartus Setup](#quartus-setup)&lt;br /&gt;
        * [Create the .cdf](#create-the-cdf)&lt;br /&gt;
    * [NIOS Setup](#nios-Setup)&lt;br /&gt;
        * [Create the project files](#create-the-project-files) &lt;br /&gt;
* [Build Instructions](#build-instructions)&lt;br /&gt;
    * [Building from Quartus GUI](#building-from-quartus-gui)&lt;br /&gt;
        * [Generate the QSys File](#generate-the-qsys-file)&lt;br /&gt;
        * [Compile the NIOSII Project](#compile-the-niosii-project)&lt;br /&gt;
        * [Compile the Quartus Project](#compile-the-quartus-project)&lt;br /&gt;
    * [Building from Scripts](#building-from-scripts)&lt;br /&gt;
    * [Installing from JTAG](#installing-from-jtag)&lt;br /&gt;
    * [Installing from ESPER](#installing-from-esper)&lt;br /&gt;
&lt;br /&gt;
# Overview&lt;br /&gt;
&lt;br /&gt;
The FEAM is a digitizer located on the ALPHAg detector. Each FEAM consists of 4 AFTER SCAs for a total of 288 channels.&lt;br /&gt;
&lt;br /&gt;
# Initial Setup&lt;br /&gt;
&lt;br /&gt;
## Quartus Setup&lt;br /&gt;
&lt;br /&gt;
### Create the .cdf&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Click on **Tools -&amp;gt; Programmer**. The **Programmer** window will appear&lt;br /&gt;
3. In the **Programmer** window, click **Auto Detect**. A **Select Device** dialog box will appear&lt;br /&gt;
    1. (Optional) If **Auto Detect** is greyed out, click on **Hardware Setup**. The **Hardware Setup** dialog box will appear&lt;br /&gt;
    2. Under **Hardware Settings**, double-click on the USB JTAG hardware you wish to use&lt;br /&gt;
    3. Click **Close**. The **Hardware Setup** dialog box will close&lt;br /&gt;
5. Click on **File -&amp;gt; Save As**. The **Save As** dialog box will appear&lt;br /&gt;
6. In the **Save As** dialog box, browse to the **/\&amp;lt;project_dir\&amp;gt;/bin/** directory&lt;br /&gt;
7. Make sure the **Add file to current project** checkbox is checked&lt;br /&gt;
7. In the **File name** input box, type &amp;quot;alphag_feam.cdf&amp;quot; and click **Save**&lt;br /&gt;
8. Close the **Programmer** window&lt;br /&gt;
9. Done!&lt;br /&gt;
&lt;br /&gt;
## NIOS Setup&lt;br /&gt;
&lt;br /&gt;
### Create the project files&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
3. The **Workspace Launcher** window will appear, click *OK* to accept the default workspace.&lt;br /&gt;
4. Click **File -&amp;gt; Import...**. The **Import** dialog box will appear&lt;br /&gt;
5. Click on **General -&amp;gt; Existing Projects into Workspace**&lt;br /&gt;
6. Click **Next \&amp;gt;**&lt;br /&gt;
7. Next to **Select root directory** click **Browse...**. A **Browse for Folder** dialog box will appear&lt;br /&gt;
8. Browse to **/\&amp;lt;project_dir\&amp;gt;/hdl/software** and click **OK**&lt;br /&gt;
8. Four Projects should appear in the **Projects** panel: &lt;br /&gt;
    * alphag_feam&lt;br /&gt;
    * alphag\_feam\_bsp &lt;br /&gt;
    * alphag\_feam\_bootloader&lt;br /&gt;
    * alphag\_feam\_bootloader\_bsp&lt;br /&gt;
9. Click **Select All**&lt;br /&gt;
10. Click **Finish**&lt;br /&gt;
11. Done!&lt;br /&gt;
 &lt;br /&gt;
# Build Instructions&lt;br /&gt;
&lt;br /&gt;
## Building from Quartus GUI&lt;br /&gt;
&lt;br /&gt;
**Warning: Please use Quartus Prime Standard Edition 16.1**&lt;br /&gt;
### Generate the QSys File&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Open QSys by clicking **Tools -&amp;gt; QSys**&lt;br /&gt;
2. Click on **File -&amp;gt; Open** (CTRL+O). An **Open File** dialog box should appear.&lt;br /&gt;
3. Select the **alphag_feam.qsys** file from the **/\&amp;lt;project_dir\&amp;gt;/hdl** directory and click **Open**&lt;br /&gt;
4. Modify as necessary. NOTE: Any change to the QSys, even cosmetic such as expanding or collapsing components will cause the QSys to desire a re-generate. &lt;br /&gt;
5. Click **File -&amp;gt; Save** (CTRL+S)&lt;br /&gt;
6. Click **Generate HDL**. A **Generation** dialog box will appear &lt;br /&gt;
7. Select the settings you desire to be changed, if any&lt;br /&gt;
8. Click **Generate**&lt;br /&gt;
9. Wait for the generation to complete.&lt;br /&gt;
10. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the NIOSII Project&lt;br /&gt;
1. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
2. (Optional) If the QSys file has been re-generated performing the following&lt;br /&gt;
    1. Right-click on **alphag\_feam\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
    2. Right-click on **alphag\_feam\_bootloader\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
3. Modify files as needed. WARNING: Do not modify any BSP files by hand! All changes will be lost on next generate.&lt;br /&gt;
4. Click **Project -&amp;gt; Build All** (CTRL+B). If your workspace as multiple projects, it is recommend to close all but the ones related to the FEAM.&lt;br /&gt;
5. Right-click on **alphag\_feam\_bootloader** and select **Make Targets -&amp;gt; Build...**. The **Make Targets** dialog box will appear&lt;br /&gt;
6. In the **Make Targets** dialog box, select **mem\_init\_generate** and click **Build**&lt;br /&gt;
7. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the Quartus Project&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Under **Processing** click **Start Compilation** (CTRL+L)&lt;br /&gt;
2. Wait about 16-30 minutes.&lt;br /&gt;
3. Done!&lt;br /&gt;
  &lt;br /&gt;
**Note:** If Quartus crashed while compiling, delete the **\&amp;lt;project_dir\&amp;gt;/hdl/db** and **\&amp;lt;project_dir\&amp;gt;/hdl/incremental_db** directories and try again&lt;br /&gt;
  &lt;br /&gt;
## Installing from JTAG&lt;br /&gt;
1. Generate the .jic file using the provided /bin/alphag\_feam\_jic.cof&lt;br /&gt;
    1. In the main Quartus window, click **File -&amp;gt; Convert Programming Files**, A **Convert Programming Files** window will appear&lt;br /&gt;
    2. In the **Convert Programming Files** window, click **Open Conversion Setup Data**. An **Open** dialog box will appear&lt;br /&gt;
    3. In the **Open** dialog box, select the **alphag_feam.cof** file located in **/bin/**&lt;br /&gt;
    4. Click **Open**. The **Open dialog box will close&lt;br /&gt;
        * Note the **File name** field, it should display /\&amp;lt;project\_dir\&amp;gt;/bin/alphag\_feam.jic&lt;br /&gt;
    5. In the **Convert Programming Files** window, click **Generate**&lt;br /&gt;
    6. When the .jic is done being generated, a small dialog box will appear, click **OK**&lt;br /&gt;
    7. In the **Convert Programming Files** window, click **Close**&lt;br /&gt;
2. Load the .JIC file using the Programmer&lt;br /&gt;
    1. In the main Quartus window in the **Project Navigator** drop-down input select **Files**.&lt;br /&gt;
    2. Scroll down the window and find the **alphag_feam.cdf**, and double-click it. The **Programmer** window will open&lt;br /&gt;
    3. Click on the icon labelled **5CGXFC4C6**&lt;br /&gt;
    4. Click on the **Change File** button. The **Select New Programming File** dialog box will appear&lt;br /&gt;
    5. Browse to **/\&amp;lt;project_dir\&amp;gt;/bin/** and select **alphag\_feam.jic**&lt;br /&gt;
    6. Click Open. The **Select New Programming File** dialog box will close&lt;br /&gt;
    7. In the main panel, check the **Program/Configure** box on the line that starts **./bin/alphag\_feam.jic**&lt;br /&gt;
    8. Click the **Start** button&lt;br /&gt;
    9. Wait for the **Progress** bar to go to 100% and stop&lt;br /&gt;
    10. Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Internal test pulser =&lt;br /&gt;
&lt;br /&gt;
Documentation from Bryerton:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---------- Forwarded message ---------&lt;br /&gt;
From: Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
Date: Tue, 24 Apr 2018 at 16:18&lt;br /&gt;
Subject: RE: PWB/FEAM internal test pulse&lt;br /&gt;
To: Lars Martin &amp;lt;lmartin@triumf.ca&amp;gt;&lt;br /&gt;
Cc: Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Lars (and Andrea),&lt;br /&gt;
&lt;br /&gt;
In the new(er) firmware the test pulse code has been modified slightly to&lt;br /&gt;
fit in better with the upgraded trigger system. I can add an option to&lt;br /&gt;
allow it to be triggered by the external trigger (currently it has an&lt;br /&gt;
interval option, or you can hit the manual trigger to fire it, if it’s&lt;br /&gt;
enabled)&lt;br /&gt;
&lt;br /&gt;
The *options for the test pulser* are under the *signalproc module*:&lt;br /&gt;
&lt;br /&gt;
*test_pulse_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the test pulse for each&lt;br /&gt;
SCA. If this is False, the other options below will do nothings for that SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the interval trigger for&lt;br /&gt;
each SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval*&lt;br /&gt;
&lt;br /&gt;
An unsigned 32-bit value that marks how many 16ns clock cycles occur&lt;br /&gt;
between interval triggers. Only one value, as there is only one interval&lt;br /&gt;
timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_wdt*&lt;br /&gt;
&lt;br /&gt;
An array of four 16-bit unsigned integers that control the width of the&lt;br /&gt;
pulse for each SCA when the trigger occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, there is a second set of options to control the delay of the *test&lt;br /&gt;
pulse interval trigger*. These options are located under the *trigger&lt;br /&gt;
module*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_ena*&lt;br /&gt;
&lt;br /&gt;
Boolean value enabling/disabling the interval test pulse trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_delay*&lt;br /&gt;
&lt;br /&gt;
Unsigned 32-bit integer controlling the trigger delay, which is the time&lt;br /&gt;
between when the trigger is requested, and when the trigger actually fires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can setup the interval trigger and use that to create event packets&lt;br /&gt;
with the test pulse on set intervals. If the interval trigger is&lt;br /&gt;
insufficient, I can create another option, which is to fire the test pulse&lt;br /&gt;
for enabled SCAs when the external trigger goes. If so, I’ll add this&lt;br /&gt;
option in the *signalproc *module for you:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_on_ext*&lt;br /&gt;
&lt;br /&gt;
An array of four Booleans, that control if the test pulse for that SCA&lt;br /&gt;
fires on external trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember, in order to use the SCA test pulse at all, you must also set the&lt;br /&gt;
SCA to test mode. You can do this by going into the *sca0-3 modules* and&lt;br /&gt;
setting *test* to *functionality *(the value is *3* if you want to set it&lt;br /&gt;
via esper-tool)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Btw currently the SCAs are hard-coded to have all 72 channels receive the&lt;br /&gt;
test pulse on firing, and the option to de-select/select which channels to&lt;br /&gt;
fire is not offered. Would you like this ability? And if so do you want it&lt;br /&gt;
to set all four SCAs the same, or have an option for all 288 channels?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The waveform viewer on the webpage was removed for technical reasons, and&lt;br /&gt;
so all viewing is done via the MIDAS DAQ. There are some preliminary tools&lt;br /&gt;
I’ve created to verify the event packets and their waveforms, but I&lt;br /&gt;
wouldn’t call them easy to setup or use at the moment. (Or very  useful for&lt;br /&gt;
fine comparisons). If KO doesn’t have a way of saving the events to disk, I&lt;br /&gt;
could deliver something that captured and saved waveforms quite quickly.&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Bryerton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From:* Lars Martin&lt;br /&gt;
*Sent:* April 23, 2018 5:10 PM&lt;br /&gt;
*To:* Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
*Cc:* Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
*Subject:* PWB/FEAM internal test pulse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Bryerton,&lt;br /&gt;
&lt;br /&gt;
Andrea and I would like to check the response function of the PWBs. For&lt;br /&gt;
that Daryl suggested to first look at the internal test pulse.&lt;br /&gt;
&lt;br /&gt;
Can you point us to what settings are required to make that go? And to use&lt;br /&gt;
the external trigger if we want to acquire the data?&lt;br /&gt;
&lt;br /&gt;
Ideally we would acquire Midas data from that, but it&#039;s unclear if KO&#039;s&lt;br /&gt;
frontend allows for that right now. Can we access the data with Esper&lt;br /&gt;
instead?&lt;br /&gt;
&lt;br /&gt;
Finally, we haven&#039;t had the waveform display on the web page for a while,&lt;br /&gt;
but Daryl said you guys use it. Are we using a different page somehow?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope all is well with the baby, cheers,&lt;br /&gt;
&lt;br /&gt;
Lars&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* IMPOSSIBLE (ext clock only connected to clock cleaner) add frequency counter for the external clock (62.5 MHz)&lt;br /&gt;
* DONE add random delay before memtest&lt;br /&gt;
* DONE add 4 more bits to udp_delay&lt;br /&gt;
* DONE fix crash on boot if run is active and triggers arrive (check that trigger is off on boot) (do not set trigger/enable_all, ext_trig_ena, inp_trig_ena, signal_proc/force_run to 1 after boot)&lt;br /&gt;
* DONE (kludge jtag uart write()) increase size of jtag uart output buffer, make it unlimited if possible.&lt;br /&gt;
* DONE (kludge jtag uart write()) on dhcp timeout, reboot the fpga - reboot of nios does not clear the jtag uart, which becomes full and nios stops.&lt;br /&gt;
* DONE add NIOS watchdog timeout for fectrl&lt;br /&gt;
* DONE do not use external clock until instructed by fectrl (clock cleaner default is pin select mode, default pin mode is input with pull down, so clock 0 is selected, this is the ext clock. but we can drive clock select pins from the fpga).&lt;br /&gt;
* DONE change clock cleaner power up: use the 2 lines status_clkin0 and status_clkin1 to tell clock cleaner to use the internal clock (clkin2) - from the FPGA drive first line low, second line high. Also change all NIOS code that programs the clock cleaner to keep these two lines in the &amp;quot;input&amp;quot; mode. Current code switches them to &amp;quot;output&amp;quot; mode.&lt;br /&gt;
* DONE clock cleaner power up state is wrong for both choices of clock: 62.5 MHz ext clock and 125 MHz internal clock, see explanation in feam_top.sv. It looks like I need to drive status_clkin0 and status_clkin1 to &amp;quot;holdover&amp;quot; mode, both logic level 1. Currently status_clkin0 is used as SPI read line, this has to be moved to a different line first.&lt;br /&gt;
* add watchdog timeout that works in factory mode (&amp;quot;remote update&amp;quot; watchdog only works in user mode)&lt;br /&gt;
* enable HTTP pipelining - copy changes on mongoose from ADC project.&lt;br /&gt;
* reset everything if it looks like NIOS TCP/IP code has crashed, but enough code is still running to prevent tripping of the fpga-remote-update watchdog timer. such crash tends to happens when the sata link mate is rebooted and incomplete data arrives from the disrupted ethernet data path.&lt;br /&gt;
* DONE when loading AFTER ASIC do not go into infinite loop if read-back is broken (always mismatch).&lt;br /&gt;
* DONE read and report error status information bits for 2983fc.pdf voltages, currents and temperatures monitoring chip. note that SCA12, SCA34, 2V and 5V voltages are flagged 0x0B &amp;quot;ADC out of range, sensor over range&amp;quot; correctly, see 2983fc.pdf table 63 fix explanation of &amp;quot;normal&amp;quot; and &amp;quot;usable&amp;quot; voltage ranges. (5V voltage divider is 2-to-1)&lt;br /&gt;
* add provisions for coded trigger&lt;br /&gt;
* DONE verify readout of MV2 Hall magnetometer (all registers and bits from device are visible in esper)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=973</id>
		<title>PWB</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=973"/>
		<updated>2023-03-22T20:56:10Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/pwb_rev1_firmware&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag/feam/rev1&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/feam/rev1&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
&lt;br /&gt;
= Schematics =&lt;br /&gt;
&lt;br /&gt;
* [[Image:pwb_rev0.pdf]]&lt;br /&gt;
* [[Image:Pwb-rev1-after.pdf]]&lt;br /&gt;
* [[Image:AlphaG Rev1.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Manuals =&lt;br /&gt;
&lt;br /&gt;
* [[Image:AFTER_MANUAL_V1.pdf]] AFTER SCA manual v1&lt;br /&gt;
* [[Image:AFTER_DataSheet1_1.pdf]] AFTER SCA manual v1.1&lt;br /&gt;
* [[Image:AFTER_SCA_table2.pdf]] AFTER SCA channel map&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Power distribution and monitoring ==&lt;br /&gt;
&lt;br /&gt;
External power supply is:&lt;br /&gt;
* +5V&lt;br /&gt;
* +2V&lt;br /&gt;
&lt;br /&gt;
Central board:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.1R) - Fuse_5V&lt;br /&gt;
* Ext_2V - F2/F3 - RS2 (0.1R) - Idig2-&lt;br /&gt;
* LDO3 - Fuse_5V - DIG_3.3V - selfenable - ADM7154&lt;br /&gt;
* LDO5 - Fuse_5V - DIG_2.5V - selfenable - ADM7154&lt;br /&gt;
* LDO_CLN - Fuse5V - CLN_3.3V - selfenable - &lt;br /&gt;
* VREG - DIG_3.3V - -2.5V SCA BIAS - selfenable - LTC1983ES6-3#TRMPBF&lt;br /&gt;
* LDO7 - DIG_2.5V - DDR3_VRef - enable DDR3_1P5V, DDR3_PG, DDR3_VttEN&lt;br /&gt;
* LDO2 - Idig2V- - DIG_1.1V - enable DIG_3.3V - LT3071&lt;br /&gt;
* LDO6 - Idig2V- - DDR3_1P5V - enable DIG_3.3V - LT3083&lt;br /&gt;
&lt;br /&gt;
SCA Wing:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.3R) - Isca- - SCA_Fuse5V&lt;br /&gt;
* LDO1 - SCA_Fuse5V - SCA3.3V - enable ADC_PWR_EN - ADM7154&lt;br /&gt;
* LDO2 - SCA3.3V - ADC1.8V - selfenable - ADM7154&lt;br /&gt;
* LDO3 - SCA3.3V - TRN2.5V - selfenable - LT1761&lt;br /&gt;
* REF - SCA3.3V - 1.45V Vicm - selfenable - LM4121&lt;br /&gt;
&lt;br /&gt;
esper variables:&lt;br /&gt;
&lt;br /&gt;
* board/i_sca12, i_sca34, v_sca12, v_sca34: voltage and current into LDO1, after fuse F1 (wing board)&lt;br /&gt;
* board/i_p2, v_p2: voltage and current on 2V bus after fuses F2/F3&lt;br /&gt;
* board/i_p5, v_p5: voltage and current on 5V bus after fuse F1 (central board)&lt;br /&gt;
&lt;br /&gt;
== Trigger and Clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock (62.5MHz) and trigger are distributed to the PWB columns via the [https://edev-group.triumf.ca/hw/alphag/trigger-card-sata-adapter/rev1 trigger SATA adapter].&lt;br /&gt;
&lt;br /&gt;
The two miniSAS cables from cdm03 port 5 and 6 are connected to a miniSAS-SATA splitter 1-to-4 (CS Electronics &amp;quot;iSAS SATA adapter&amp;quot; ADP-887P-1X). Since there are only 8 columns and the clock and trigger signals are daisy-chained across the 8 rows, this scheme is sufficient to provide the necessary inputs to all 64 PWBs.&lt;br /&gt;
&lt;br /&gt;
[https://www.techcable.com/sas-mini-sas-cables/sata-cables/ SATA 6Gb/s Cable with Latching Clip. Straight Pinout 1-1 247726-L  40in]&lt;br /&gt;
&lt;br /&gt;
== Optical Link ==&lt;br /&gt;
&lt;br /&gt;
Main data uplink.&lt;br /&gt;
&lt;br /&gt;
SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ [[File:AVAGO SFP specs.pdf|SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ]]&lt;br /&gt;
&lt;br /&gt;
Fiber optic Tripp Lite N820 - 10 m [[File:FiberOptic TrippLite specs.pdf|Fiber optic Tripp Lite N820 - 10 m]]&lt;br /&gt;
&lt;br /&gt;
== SATA Link ==&lt;br /&gt;
&lt;br /&gt;
Secondary data uplink, capable also to deliver clock and trigger.&lt;br /&gt;
&lt;br /&gt;
The SATA link connects PWB from adjacent columuns on the same row.&lt;br /&gt;
&lt;br /&gt;
The SATA cable is a &amp;quot;crossed cable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Firmware =&lt;br /&gt;
&lt;br /&gt;
== Firmware update ==&lt;br /&gt;
&lt;br /&gt;
PWB firmware update is done using &amp;quot;esper-tool&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update factory_rpd&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update file_rpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of PWB firmware pwb_rev1_20200706_ko:&lt;br /&gt;
&lt;br /&gt;
Permission to write into the flash memory is controlled by esper variables:&lt;br /&gt;
&lt;br /&gt;
* allow_write set to &amp;quot;false&amp;quot;: &amp;quot;esper-tool upload&amp;quot; does a &amp;quot;verify&amp;quot;: successful upload means epcq flash content is same as rpd file, error means content is not the same.&lt;br /&gt;
* allow_write set to &amp;quot;true&amp;quot;: &amp;quot;esper-tool upload&amp;quot; updates the epcq flash from the rpd file: for each data block, read the epcq flash, compare to rpd data, if different, erase the flash block, write the flash, read the flash, if there is a mismatch (bad write), return an error.&lt;br /&gt;
* allow_factory_write set to &amp;quot;true&amp;quot; to enable writing to the &amp;quot;factory_rpd&amp;quot;. DO NOT SET IT TO &amp;quot;true&amp;quot; UNLESS YOU MEAN TO UPDATE THE PWB BOOTLOADER. IF YOU FLASH BUM FIRMWARE or IF THERE IS A POWER OUTAGE WHILE UPDATING, THE PWB WILL BE BRICKED and has to be recovered by connecting a USB blaster.&lt;br /&gt;
&lt;br /&gt;
To update firmware of multiple boards to correct version, recommended is the script &amp;quot;update_pwb.perl&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/online/src&lt;br /&gt;
./update_pwb.perl pwb12 pwb06 pwb78&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Factory page and user page firmware boot ==&lt;br /&gt;
&lt;br /&gt;
Each PWB board has 2 firmware images: boot loader (factory page)&lt;br /&gt;
and data acquisition (user page). On power up, the FPGA loads and runs&lt;br /&gt;
the boot loader firmware from the factory page, later the control&lt;br /&gt;
software reboots the FPGA into the data acquisition firmware from&lt;br /&gt;
the user page.&lt;br /&gt;
&lt;br /&gt;
Because loading defective firmware can brick https://en.wikipedia.org/wiki/Brick_(electronics)&lt;br /&gt;
the PWB, new firmware images are loaded into the user page, if anything is wrong,&lt;br /&gt;
the PWB can still boot from the factory page and one can use the firmware update&lt;br /&gt;
function to load a good firmware image into the user page.&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is not intended for data acquisition, it is only meant to provide three functions:&lt;br /&gt;
* boot enough hardware and software to communicate via the ethernet and the sata link&lt;br /&gt;
* firmware update (both factory page and user page)&lt;br /&gt;
* reboot into the user page&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is usually never updated unless absolutely&lt;br /&gt;
needed to fix a problem with these three functions (i.e. compatibility with sata link communications).&lt;br /&gt;
&lt;br /&gt;
If factory image is corrupted or the contains defective firmware and the PWB does not boot (no dhcp, no ping, no esper),&lt;br /&gt;
the only way to unbrick it is by loading good firmware using a jtag flash programmer (usb-blaster). Connecting it requires&lt;br /&gt;
physical access to the jtag connector on the PWB board. It is impossible when the detector is fully assembled in the experiment.&lt;br /&gt;
&lt;br /&gt;
The PWB has a 32 Mbyte EPCQ flash memory chip, it is divided into 2 pages 16 Mbytes of factory page and 16 Mbytes of user page.&lt;br /&gt;
&lt;br /&gt;
A complete firmware image generally contains 3 pieces:&lt;br /&gt;
* FPGA firmware and NIOS &amp;quot;feam_bootloader&amp;quot; software RAM image (sof file)&lt;br /&gt;
* NIOS &amp;quot;feam&amp;quot; software RAM image (feam.elf.flash.hex) - all the C code for esper communications and PWB data acquisition&lt;br /&gt;
* NIOS filesystem image (feam.webpkg.hex) - esper web pages&lt;br /&gt;
&lt;br /&gt;
This is the boot sequence:&lt;br /&gt;
* on power-up the FPGA automatically loads the sof file from address 0 of the EPCQ flash (this is the factory image sof file)&lt;br /&gt;
* the FPGA is &amp;quot;started&amp;quot;&lt;br /&gt;
* the NIOS CPU starts executing the &amp;quot;feam_bootloader&amp;quot; C code embedded in the sof file (NIOS project hdl/software/feam_bootloader)&lt;br /&gt;
* feam_bootloader initializes the hardware (clocks, DDR memory, etc)&lt;br /&gt;
* feam_bootloader write-protects the EPCQ flash memory&lt;br /&gt;
* feam_bootloader copies the &amp;quot;feam&amp;quot; software from EPCQ flash to the DDR memory (after checking for correct checkum)&lt;br /&gt;
* feam_bootloader restarts the NIOS CPU&lt;br /&gt;
* the NIOS CPU starts running from DDR memory, executes the &amp;quot;feam&amp;quot; software (NIOS project hdl/software/feam)&lt;br /&gt;
* call main() in hdl/software/feam/src/task_init.c&lt;br /&gt;
* call task_init() in the same file&lt;br /&gt;
* infinite loop waiting for IP address via DHCP&lt;br /&gt;
* after have IP address, call task_esper() from hdl/software/feam/src/task_esper.c&lt;br /&gt;
* task_esper() creates all the esper modules, esper variables, etc,&lt;br /&gt;
* mod_http.c starts the mongoose web server&lt;br /&gt;
* PWB is open for business&lt;br /&gt;
&lt;br /&gt;
This is the protection against booting corrupted firmware:&lt;br /&gt;
* FPGA hardware loads the sof file from epcq flash and checks for correct checksum before &amp;quot;starting&amp;quot; it&lt;br /&gt;
* NIOS CPU is part of the sof file, protected by sof file checksum&lt;br /&gt;
* NIOS feam_bootloader C code is part of the sof file, protected by the sof checksum&lt;br /&gt;
* feam_bootloader checks for correct signatures and checksums of the DDR memory image&lt;br /&gt;
* &amp;quot;feam&amp;quot; C code is protected by the checksum of the DDR memory image&lt;br /&gt;
&lt;br /&gt;
== NIOS terminal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ /opt/intelFPGA/17.0/quartus/bin/nios2-terminal&lt;br /&gt;
nios2-terminal: connected to hardware target using JTAG UART on cable&lt;br /&gt;
nios2-terminal: &amp;quot;USB-Blaster [2-1.2]&amp;quot;, device 1, instance 0&lt;br /&gt;
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)&lt;br /&gt;
PWB Revision 1 Boot Loader&lt;br /&gt;
Ver 2.0  Build 357 - Wed Jun  6 15:05:35 PDT 2018&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash boot loader firmware via jtag ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ cd ~/online/firmware/pwb_rev1&lt;br /&gt;
$ ls -l&lt;br /&gt;
$ /opt/intelFPGA/17.1/quartus/bin/quartus_pgmw&lt;br /&gt;
... auto detect&lt;br /&gt;
... load the jic file&lt;br /&gt;
... in menu tools-&amp;gt;programmer, enable &amp;quot;unprotect device&amp;quot;&lt;br /&gt;
... start program/configure operation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash user page firmware via esper-tool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ cd online/src&lt;br /&gt;
$ more update_pwb.perl ### check that $fw is set to the desired firmware file&lt;br /&gt;
$ ./update_pwb.perl pwb06 ### or give more PWB names or give &amp;quot;all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
=== quartus version to use ===&lt;br /&gt;
&lt;br /&gt;
* quartus 16.1 should be used for jtag (jtagconfig and jtagd)&lt;br /&gt;
* quartus 17.0 should be used to build the PWB firmware (17.1 is not compatible)&lt;br /&gt;
&lt;br /&gt;
=== start license server ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh agmini@daq16&lt;br /&gt;
/opt/intelFPGA/17.0/quartus/linux64/lmgrd -c ~agmini/online/license-daq16.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare the build environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/17.0/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get latest version of the code and build it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd online/firmware/git/pwb_rev1_firmware&lt;br /&gt;
$ git pull&lt;br /&gt;
$ git checkout alphag&lt;br /&gt;
$ git pull&lt;br /&gt;
$ ./scripts/compile_project.sh&lt;br /&gt;
... about 30-40 minutes ...&lt;br /&gt;
$ ls -l bin/*.sof bin/*.jic bin/*.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 12727389 Jan 24  2018 bin/feam_rev1_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 33554661 Jan 24  2018 bin/feam_rev1.jic&lt;br /&gt;
-rw-r--r-- 1 agmini alpha  6974754 Jan 24  2018 bin/rev1.sof&lt;br /&gt;
$ ### feam.jic is loaded via jtag&lt;br /&gt;
$ ### feam_auto.rpd is loaded via esper&lt;br /&gt;
$ ### feam.sof is used to attach the quartus signal tap logic analyzer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firmware build order and sequence ===&lt;br /&gt;
&lt;br /&gt;
* erase previous build&lt;br /&gt;
* regenerate qsys&lt;br /&gt;
* regenerate NIOS BSP &amp;quot;feam_bootloader_bsp&amp;quot; and &amp;quot;feam_bsp&amp;quot;&lt;br /&gt;
* build NIOS projects &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot;&lt;br /&gt;
* build quartus sof file (with the &amp;quot;feam_bootloader&amp;quot; nios project inside)&lt;br /&gt;
* build jic and rpd files (with the quartus sof file and the &amp;quot;feam&amp;quot; nios project inside)&lt;br /&gt;
* load sof file into the FPGA using jtag (be careful about compatible &amp;quot;feam&amp;quot; nios project already in the epcq flash)&lt;br /&gt;
* load jic file into the epcq factory page using jtag (cycle power for them to take effect)&lt;br /&gt;
* load rpd file into the epcq factory or user page using esper&lt;br /&gt;
&lt;br /&gt;
=== scripts for building the firmware ===&lt;br /&gt;
&lt;br /&gt;
* scripts/compile_project.sh - build everything from scratch:&lt;br /&gt;
* scripts/compile_qsys.sh - regenerate the main qsys component&lt;br /&gt;
* scripts/compile_nios.sh - regenerate the BSPs, then same as compile_elf.sh&lt;br /&gt;
* scripts/compile_elf.sh - build the BSPs, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; NIOS projects&lt;br /&gt;
* scripts/update_elf.sh - regenerate the rpd and jic files to include the new &amp;quot;feam&amp;quot; NIOS build (keeps the old &amp;quot;feam_bootloader&amp;quot; in the sof file)&lt;br /&gt;
* scripts/update_bootloader.sh - also regenerate the sof file to include the new &amp;quot;feam_bootloader&amp;quot; build&lt;br /&gt;
* scripts/clean_quartus.sh - prepare quartus fpga sof file to build from scratch&lt;br /&gt;
* scripts/compile_quartus.sh - build the quartus fpga sof file incrementally (run clean_quartus.sh to build from scratch).&lt;br /&gt;
* scripts/load_jtag_sof.pl bin/rev1.sof - load sof file into the FPGA. this will boot the new fpga firmware, the new feam_bootloader (if update_bootloader.sh was run), but with the old &amp;quot;feam&amp;quot; already in epcq flash. (beware of incompatible sof, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; builds!)&lt;br /&gt;
* scripts/load_jtag_jic.pl bin/feam_rev1.jic - load jic file into the EPCQ flash, same as using the graphical flash programmer tool. (this will leave the FPGA running the quartus jtag flash loader firmware, not the PWB firmware. Cycle power for new jic file to take effect).&lt;br /&gt;
&lt;br /&gt;
== ESPER Variables ==&lt;br /&gt;
&lt;br /&gt;
* Board&lt;br /&gt;
** invert_ext_trig - invert trigger signal from CDM before it drives any logic (to undo incorrect signal polarity)&lt;br /&gt;
** reset_nios - goggle up, them down to reset NIOS subsystem&lt;br /&gt;
&lt;br /&gt;
* Signalproc&lt;br /&gt;
** test_mode - ADC data is replaced with a test pattern, see test mode bits in sca_x_ch_ctrl.&lt;br /&gt;
** sca_a_ch_ctrl, sca_b_ch_ctrl, sca_c_ch_ctrl, sca_d_ch_ctrl - channel control bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11..0 - threshold - channel suppression threshold&lt;br /&gt;
14..12 - ctrl_test_mode - test mode:&lt;br /&gt;
         0=fixed patter 0xa5a,&lt;br /&gt;
         1=time bin counter,&lt;br /&gt;
         2=time bin counter with channel number,&lt;br /&gt;
         3=sequential adc sample counter,&lt;br /&gt;
         4={ch_crossed_out,trig_pos,trig_neg,adc[8:0]},&lt;br /&gt;
         5={trig,adc[10:0]},&lt;br /&gt;
         6={ch_crossed_min,adc[10:0]}&lt;br /&gt;
15 - ctrl_supp_mode - channel suppression mode: 0=adc&amp;lt;=(baseline-threshold), 1=adc&amp;lt;=threshold&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Link&lt;br /&gt;
** link_ctrl - sata link control. The bits are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - sata_link_udp_stream_in_enable - permit data flow from sata link to OFFLOAD_SATA&lt;br /&gt;
1 - udp_stream_out_enable - permit sca data flow to sata link&lt;br /&gt;
2 - sata_to_eth_enable - permit ethernet data flow from sata link to TSE_MAC&lt;br /&gt;
3 - eth_to_sata_enable - permit ethernet data flow from TSE MAC to sata link&lt;br /&gt;
4 - enable_stop_our_tx - enable flow control: allow stop_tx&lt;br /&gt;
#5 - stop_our_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
6 - enable_stop_remote_tx - enable flow control: allow send &amp;quot;stop_tx&amp;quot;&lt;br /&gt;
#7 - stop_remote_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
8 - tx_test_pattern_udp - udp data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
9 - tx_test_pattern_eth - nios-to-sata data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
10 - udp_delay_enable - delay between udp packets, see udp_delay_value below&lt;br /&gt;
11 - reboot_tx - send K_REBOOT command to the sata link mate, where it has same effect as board/reset_nios.&lt;br /&gt;
12 - sata_to_nios_disable&lt;br /&gt;
13 - nios_to_sata_disable&lt;br /&gt;
14 - &lt;br /&gt;
15 - &lt;br /&gt;
16 -&lt;br /&gt;
24..31 - udp_delay_value - delay between udp packets (top 8 bits of a 20-bit counter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware data path ==&lt;br /&gt;
&lt;br /&gt;
Main data path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feam_top&lt;br /&gt;
|&lt;br /&gt;
sca_sigproc&lt;br /&gt;
|&lt;br /&gt;
sca_event_control&lt;br /&gt;
4 * sca_control (sca_channel.sv)&lt;br /&gt;
4 * channel_fifo (1024 samples)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_control (sca_channel.sv)&lt;br /&gt;
|&lt;br /&gt;
state machine to control SCA read and write enables&lt;br /&gt;
|&lt;br /&gt;
sca_write_control (what does it do?!?)&lt;br /&gt;
sca_read_control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_read_control&lt;br /&gt;
|&lt;br /&gt;
state machine to store ADC samples into per-channel FIFOs (channel_fifo)&lt;br /&gt;
selector to replace ADC samples with a test pattern&lt;br /&gt;
79*sca_trig_one -&amp;gt; ch_crossed_out - channel hit detector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_event_control&lt;br /&gt;
|&lt;br /&gt;
event_fifo (hdl/mf/event_descriptor_fifo)&lt;br /&gt;
state machine to take ADC data from 4 per-channel FIFOs (channel_fifo) and store it into DDR memory (write addr increment is 510*8 (number of samples)*8 = 4080).&lt;br /&gt;
state machine to read transposed ADC data from DDR memory (read addr increment is 8+8=16 - 2 samples * 2 bytes * 4 sca = 16) and create 4 per-sca data streams&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data stream:&lt;br /&gt;
4 per-sca data streams from sca_event_control -&amp;gt; sca_sigproc(event_dat)&lt;br /&gt;
|&lt;br /&gt;
packet_chunker (hdl/lib/packet_chunker.sv) (4*event_dat -&amp;gt; event_segment_dat) - multiplex 4 data streams into 1 stream of UDP-sized packets&lt;br /&gt;
|&lt;br /&gt;
packet_length_prepender (hdl/lib/packet_length_prepender.sv)  (event_segment_dat -&amp;gt; udp_event_val_out)&lt;br /&gt;
|&lt;br /&gt;
udp_event_val -&amp;gt; info qsys (udp_stream_sca) and into sata link (mux channel 2).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware build instructions from Bryerton (obsolete) ==&lt;br /&gt;
&lt;br /&gt;
This is the old README.md file from the firmware git repository.&lt;br /&gt;
&lt;br /&gt;
These instructions are not used to build the firmware (use scrips/compile_project.sh).&lt;br /&gt;
&lt;br /&gt;
They are still useful for figuring out which buttons to push in the altera gui programs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ALPHAg FrontEnd Acquisition Module (FEAM) - REV0&lt;br /&gt;
&lt;br /&gt;
Welcome to the ALPHAg FEAM Project &lt;br /&gt;
&lt;br /&gt;
# Table of Contents&lt;br /&gt;
&lt;br /&gt;
* [Overview](#overview)&lt;br /&gt;
* [Inital Setup](#initial-setup)&lt;br /&gt;
    * [Quartus Setup](#quartus-setup)&lt;br /&gt;
        * [Create the .cdf](#create-the-cdf)&lt;br /&gt;
    * [NIOS Setup](#nios-Setup)&lt;br /&gt;
        * [Create the project files](#create-the-project-files) &lt;br /&gt;
* [Build Instructions](#build-instructions)&lt;br /&gt;
    * [Building from Quartus GUI](#building-from-quartus-gui)&lt;br /&gt;
        * [Generate the QSys File](#generate-the-qsys-file)&lt;br /&gt;
        * [Compile the NIOSII Project](#compile-the-niosii-project)&lt;br /&gt;
        * [Compile the Quartus Project](#compile-the-quartus-project)&lt;br /&gt;
    * [Building from Scripts](#building-from-scripts)&lt;br /&gt;
    * [Installing from JTAG](#installing-from-jtag)&lt;br /&gt;
    * [Installing from ESPER](#installing-from-esper)&lt;br /&gt;
&lt;br /&gt;
# Overview&lt;br /&gt;
&lt;br /&gt;
The FEAM is a digitizer located on the ALPHAg detector. Each FEAM consists of 4 AFTER SCAs for a total of 288 channels.&lt;br /&gt;
&lt;br /&gt;
# Initial Setup&lt;br /&gt;
&lt;br /&gt;
## Quartus Setup&lt;br /&gt;
&lt;br /&gt;
### Create the .cdf&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Click on **Tools -&amp;gt; Programmer**. The **Programmer** window will appear&lt;br /&gt;
3. In the **Programmer** window, click **Auto Detect**. A **Select Device** dialog box will appear&lt;br /&gt;
    1. (Optional) If **Auto Detect** is greyed out, click on **Hardware Setup**. The **Hardware Setup** dialog box will appear&lt;br /&gt;
    2. Under **Hardware Settings**, double-click on the USB JTAG hardware you wish to use&lt;br /&gt;
    3. Click **Close**. The **Hardware Setup** dialog box will close&lt;br /&gt;
5. Click on **File -&amp;gt; Save As**. The **Save As** dialog box will appear&lt;br /&gt;
6. In the **Save As** dialog box, browse to the **/\&amp;lt;project_dir\&amp;gt;/bin/** directory&lt;br /&gt;
7. Make sure the **Add file to current project** checkbox is checked&lt;br /&gt;
7. In the **File name** input box, type &amp;quot;alphag_feam.cdf&amp;quot; and click **Save**&lt;br /&gt;
8. Close the **Programmer** window&lt;br /&gt;
9. Done!&lt;br /&gt;
&lt;br /&gt;
## NIOS Setup&lt;br /&gt;
&lt;br /&gt;
### Create the project files&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
3. The **Workspace Launcher** window will appear, click *OK* to accept the default workspace.&lt;br /&gt;
4. Click **File -&amp;gt; Import...**. The **Import** dialog box will appear&lt;br /&gt;
5. Click on **General -&amp;gt; Existing Projects into Workspace**&lt;br /&gt;
6. Click **Next \&amp;gt;**&lt;br /&gt;
7. Next to **Select root directory** click **Browse...**. A **Browse for Folder** dialog box will appear&lt;br /&gt;
8. Browse to **/\&amp;lt;project_dir\&amp;gt;/hdl/software** and click **OK**&lt;br /&gt;
8. Four Projects should appear in the **Projects** panel: &lt;br /&gt;
    * alphag_feam&lt;br /&gt;
    * alphag\_feam\_bsp &lt;br /&gt;
    * alphag\_feam\_bootloader&lt;br /&gt;
    * alphag\_feam\_bootloader\_bsp&lt;br /&gt;
9. Click **Select All**&lt;br /&gt;
10. Click **Finish**&lt;br /&gt;
11. Done!&lt;br /&gt;
 &lt;br /&gt;
# Build Instructions&lt;br /&gt;
&lt;br /&gt;
## Building from Quartus GUI&lt;br /&gt;
&lt;br /&gt;
**Warning: Please use Quartus Prime Standard Edition 16.1**&lt;br /&gt;
### Generate the QSys File&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Open QSys by clicking **Tools -&amp;gt; QSys**&lt;br /&gt;
2. Click on **File -&amp;gt; Open** (CTRL+O). An **Open File** dialog box should appear.&lt;br /&gt;
3. Select the **alphag_feam.qsys** file from the **/\&amp;lt;project_dir\&amp;gt;/hdl** directory and click **Open**&lt;br /&gt;
4. Modify as necessary. NOTE: Any change to the QSys, even cosmetic such as expanding or collapsing components will cause the QSys to desire a re-generate. &lt;br /&gt;
5. Click **File -&amp;gt; Save** (CTRL+S)&lt;br /&gt;
6. Click **Generate HDL**. A **Generation** dialog box will appear &lt;br /&gt;
7. Select the settings you desire to be changed, if any&lt;br /&gt;
8. Click **Generate**&lt;br /&gt;
9. Wait for the generation to complete.&lt;br /&gt;
10. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the NIOSII Project&lt;br /&gt;
1. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
2. (Optional) If the QSys file has been re-generated performing the following&lt;br /&gt;
    1. Right-click on **alphag\_feam\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
    2. Right-click on **alphag\_feam\_bootloader\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
3. Modify files as needed. WARNING: Do not modify any BSP files by hand! All changes will be lost on next generate.&lt;br /&gt;
4. Click **Project -&amp;gt; Build All** (CTRL+B). If your workspace as multiple projects, it is recommend to close all but the ones related to the FEAM.&lt;br /&gt;
5. Right-click on **alphag\_feam\_bootloader** and select **Make Targets -&amp;gt; Build...**. The **Make Targets** dialog box will appear&lt;br /&gt;
6. In the **Make Targets** dialog box, select **mem\_init\_generate** and click **Build**&lt;br /&gt;
7. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the Quartus Project&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Under **Processing** click **Start Compilation** (CTRL+L)&lt;br /&gt;
2. Wait about 16-30 minutes.&lt;br /&gt;
3. Done!&lt;br /&gt;
  &lt;br /&gt;
**Note:** If Quartus crashed while compiling, delete the **\&amp;lt;project_dir\&amp;gt;/hdl/db** and **\&amp;lt;project_dir\&amp;gt;/hdl/incremental_db** directories and try again&lt;br /&gt;
  &lt;br /&gt;
## Installing from JTAG&lt;br /&gt;
1. Generate the .jic file using the provided /bin/alphag\_feam\_jic.cof&lt;br /&gt;
    1. In the main Quartus window, click **File -&amp;gt; Convert Programming Files**, A **Convert Programming Files** window will appear&lt;br /&gt;
    2. In the **Convert Programming Files** window, click **Open Conversion Setup Data**. An **Open** dialog box will appear&lt;br /&gt;
    3. In the **Open** dialog box, select the **alphag_feam.cof** file located in **/bin/**&lt;br /&gt;
    4. Click **Open**. The **Open dialog box will close&lt;br /&gt;
        * Note the **File name** field, it should display /\&amp;lt;project\_dir\&amp;gt;/bin/alphag\_feam.jic&lt;br /&gt;
    5. In the **Convert Programming Files** window, click **Generate**&lt;br /&gt;
    6. When the .jic is done being generated, a small dialog box will appear, click **OK**&lt;br /&gt;
    7. In the **Convert Programming Files** window, click **Close**&lt;br /&gt;
2. Load the .JIC file using the Programmer&lt;br /&gt;
    1. In the main Quartus window in the **Project Navigator** drop-down input select **Files**.&lt;br /&gt;
    2. Scroll down the window and find the **alphag_feam.cdf**, and double-click it. The **Programmer** window will open&lt;br /&gt;
    3. Click on the icon labelled **5CGXFC4C6**&lt;br /&gt;
    4. Click on the **Change File** button. The **Select New Programming File** dialog box will appear&lt;br /&gt;
    5. Browse to **/\&amp;lt;project_dir\&amp;gt;/bin/** and select **alphag\_feam.jic**&lt;br /&gt;
    6. Click Open. The **Select New Programming File** dialog box will close&lt;br /&gt;
    7. In the main panel, check the **Program/Configure** box on the line that starts **./bin/alphag\_feam.jic**&lt;br /&gt;
    8. Click the **Start** button&lt;br /&gt;
    9. Wait for the **Progress** bar to go to 100% and stop&lt;br /&gt;
    10. Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Internal test pulser =&lt;br /&gt;
&lt;br /&gt;
Documentation from Bryerton:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---------- Forwarded message ---------&lt;br /&gt;
From: Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
Date: Tue, 24 Apr 2018 at 16:18&lt;br /&gt;
Subject: RE: PWB/FEAM internal test pulse&lt;br /&gt;
To: Lars Martin &amp;lt;lmartin@triumf.ca&amp;gt;&lt;br /&gt;
Cc: Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Lars (and Andrea),&lt;br /&gt;
&lt;br /&gt;
In the new(er) firmware the test pulse code has been modified slightly to&lt;br /&gt;
fit in better with the upgraded trigger system. I can add an option to&lt;br /&gt;
allow it to be triggered by the external trigger (currently it has an&lt;br /&gt;
interval option, or you can hit the manual trigger to fire it, if it’s&lt;br /&gt;
enabled)&lt;br /&gt;
&lt;br /&gt;
The *options for the test pulser* are under the *signalproc module*:&lt;br /&gt;
&lt;br /&gt;
*test_pulse_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the test pulse for each&lt;br /&gt;
SCA. If this is False, the other options below will do nothings for that SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the interval trigger for&lt;br /&gt;
each SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval*&lt;br /&gt;
&lt;br /&gt;
An unsigned 32-bit value that marks how many 16ns clock cycles occur&lt;br /&gt;
between interval triggers. Only one value, as there is only one interval&lt;br /&gt;
timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_wdt*&lt;br /&gt;
&lt;br /&gt;
An array of four 16-bit unsigned integers that control the width of the&lt;br /&gt;
pulse for each SCA when the trigger occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, there is a second set of options to control the delay of the *test&lt;br /&gt;
pulse interval trigger*. These options are located under the *trigger&lt;br /&gt;
module*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_ena*&lt;br /&gt;
&lt;br /&gt;
Boolean value enabling/disabling the interval test pulse trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_delay*&lt;br /&gt;
&lt;br /&gt;
Unsigned 32-bit integer controlling the trigger delay, which is the time&lt;br /&gt;
between when the trigger is requested, and when the trigger actually fires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can setup the interval trigger and use that to create event packets&lt;br /&gt;
with the test pulse on set intervals. If the interval trigger is&lt;br /&gt;
insufficient, I can create another option, which is to fire the test pulse&lt;br /&gt;
for enabled SCAs when the external trigger goes. If so, I’ll add this&lt;br /&gt;
option in the *signalproc *module for you:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_on_ext*&lt;br /&gt;
&lt;br /&gt;
An array of four Booleans, that control if the test pulse for that SCA&lt;br /&gt;
fires on external trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember, in order to use the SCA test pulse at all, you must also set the&lt;br /&gt;
SCA to test mode. You can do this by going into the *sca0-3 modules* and&lt;br /&gt;
setting *test* to *functionality *(the value is *3* if you want to set it&lt;br /&gt;
via esper-tool)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Btw currently the SCAs are hard-coded to have all 72 channels receive the&lt;br /&gt;
test pulse on firing, and the option to de-select/select which channels to&lt;br /&gt;
fire is not offered. Would you like this ability? And if so do you want it&lt;br /&gt;
to set all four SCAs the same, or have an option for all 288 channels?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The waveform viewer on the webpage was removed for technical reasons, and&lt;br /&gt;
so all viewing is done via the MIDAS DAQ. There are some preliminary tools&lt;br /&gt;
I’ve created to verify the event packets and their waveforms, but I&lt;br /&gt;
wouldn’t call them easy to setup or use at the moment. (Or very  useful for&lt;br /&gt;
fine comparisons). If KO doesn’t have a way of saving the events to disk, I&lt;br /&gt;
could deliver something that captured and saved waveforms quite quickly.&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Bryerton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From:* Lars Martin&lt;br /&gt;
*Sent:* April 23, 2018 5:10 PM&lt;br /&gt;
*To:* Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
*Cc:* Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
*Subject:* PWB/FEAM internal test pulse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Bryerton,&lt;br /&gt;
&lt;br /&gt;
Andrea and I would like to check the response function of the PWBs. For&lt;br /&gt;
that Daryl suggested to first look at the internal test pulse.&lt;br /&gt;
&lt;br /&gt;
Can you point us to what settings are required to make that go? And to use&lt;br /&gt;
the external trigger if we want to acquire the data?&lt;br /&gt;
&lt;br /&gt;
Ideally we would acquire Midas data from that, but it&#039;s unclear if KO&#039;s&lt;br /&gt;
frontend allows for that right now. Can we access the data with Esper&lt;br /&gt;
instead?&lt;br /&gt;
&lt;br /&gt;
Finally, we haven&#039;t had the waveform display on the web page for a while,&lt;br /&gt;
but Daryl said you guys use it. Are we using a different page somehow?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope all is well with the baby, cheers,&lt;br /&gt;
&lt;br /&gt;
Lars&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* IMPOSSIBLE (ext clock only connected to clock cleaner) add frequency counter for the external clock (62.5 MHz)&lt;br /&gt;
* DONE add random delay before memtest&lt;br /&gt;
* DONE add 4 more bits to udp_delay&lt;br /&gt;
* DONE fix crash on boot if run is active and triggers arrive (check that trigger is off on boot) (do not set trigger/enable_all, ext_trig_ena, inp_trig_ena, signal_proc/force_run to 1 after boot)&lt;br /&gt;
* DONE (kludge jtag uart write()) increase size of jtag uart output buffer, make it unlimited if possible.&lt;br /&gt;
* DONE (kludge jtag uart write()) on dhcp timeout, reboot the fpga - reboot of nios does not clear the jtag uart, which becomes full and nios stops.&lt;br /&gt;
* DONE add NIOS watchdog timeout for fectrl&lt;br /&gt;
* DONE do not use external clock until instructed by fectrl (clock cleaner default is pin select mode, default pin mode is input with pull down, so clock 0 is selected, this is the ext clock. but we can drive clock select pins from the fpga).&lt;br /&gt;
* DONE change clock cleaner power up: use the 2 lines status_clkin0 and status_clkin1 to tell clock cleaner to use the internal clock (clkin2) - from the FPGA drive first line low, second line high. Also change all NIOS code that programs the clock cleaner to keep these two lines in the &amp;quot;input&amp;quot; mode. Current code switches them to &amp;quot;output&amp;quot; mode.&lt;br /&gt;
* DONE clock cleaner power up state is wrong for both choices of clock: 62.5 MHz ext clock and 125 MHz internal clock, see explanation in feam_top.sv. It looks like I need to drive status_clkin0 and status_clkin1 to &amp;quot;holdover&amp;quot; mode, both logic level 1. Currently status_clkin0 is used as SPI read line, this has to be moved to a different line first.&lt;br /&gt;
* add watchdog timeout that works in factory mode (&amp;quot;remote update&amp;quot; watchdog only works in user mode)&lt;br /&gt;
* enable HTTP pipelining - copy changes on mongoose from ADC project.&lt;br /&gt;
* reset everything if it looks like NIOS TCP/IP code has crashed, but enough code is still running to prevent tripping of the fpga-remote-update watchdog timer. such crash tends to happens when the sata link mate is rebooted and incomplete data arrives from the disrupted ethernet data path.&lt;br /&gt;
* DONE when loading AFTER ASIC do not go into infinite loop if read-back is broken (always mismatch).&lt;br /&gt;
* read and report error status information bits for 2983fc.pdf voltages, currents and temperatures chip&lt;br /&gt;
* add provisions for coded trigger&lt;br /&gt;
* DONE verify readout of MV2 Hall magnetometer (all registers and bits from device are visible in esper)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=972</id>
		<title>PWB</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=972"/>
		<updated>2023-03-22T20:44:34Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/pwb_rev1_firmware&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag/feam/rev1&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/feam/rev1&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
&lt;br /&gt;
= Schematics =&lt;br /&gt;
&lt;br /&gt;
* [[Image:pwb_rev0.pdf]]&lt;br /&gt;
* [[Image:Pwb-rev1-after.pdf]]&lt;br /&gt;
* [[Image:AlphaG Rev1.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Manuals =&lt;br /&gt;
&lt;br /&gt;
* [[Image:AFTER_MANUAL_V1.pdf]] AFTER SCA manual v1&lt;br /&gt;
* [[Image:AFTER_DataSheet1_1.pdf]] AFTER SCA manual v1.1&lt;br /&gt;
* [[Image:AFTER_SCA_table2.pdf]] AFTER SCA channel map&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Power distribution and monitoring ==&lt;br /&gt;
&lt;br /&gt;
External power supply is:&lt;br /&gt;
* +5V&lt;br /&gt;
* +2V&lt;br /&gt;
&lt;br /&gt;
Central board:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.1R) - Fuse_5V&lt;br /&gt;
* Ext_2V - F2/F3 - RS2 (0.1R) - Idig2-&lt;br /&gt;
* LDO3 - Fuse_5V - DIG_3.3V - selfenable - ADM7154&lt;br /&gt;
* LDO5 - Fuse_5V - DIG_2.5V - selfenable - ADM7154&lt;br /&gt;
* LDO_CLN - Fuse5V - CLN_3.3V - selfenable - &lt;br /&gt;
* VREG - DIG_3.3V - -2.5V SCA BIAS - selfenable - LTC1983ES6-3#TRMPBF&lt;br /&gt;
* LDO7 - DIG_2.5V - DDR3_VRef - enable DDR3_1P5V, DDR3_PG, DDR3_VttEN&lt;br /&gt;
* LDO2 - Idig2V- - DIG_1.1V - enable DIG_3.3V - LT3071&lt;br /&gt;
* LDO6 - Idig2V- - DDR3_1P5V - enable DIG_3.3V - LT3083&lt;br /&gt;
&lt;br /&gt;
SCA Wing:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.3R) - Isca- - SCA_Fuse5V&lt;br /&gt;
* LDO1 - SCA_Fuse5V - SCA3.3V - enable ADC_PWR_EN - ADM7154&lt;br /&gt;
* LDO2 - SCA3.3V - ADC1.8V - selfenable - ADM7154&lt;br /&gt;
* LDO3 - SCA3.3V - TRN2.5V - selfenable - LT1761&lt;br /&gt;
* REF - SCA3.3V - 1.45V Vicm - selfenable - LM4121&lt;br /&gt;
&lt;br /&gt;
esper variables:&lt;br /&gt;
&lt;br /&gt;
* board/i_sca12, i_sca34, v_sca12, v_sca34: voltage and current into LDO1, after fuse F1 (wing board)&lt;br /&gt;
* board/i_p2, v_p2: voltage and current on 2V bus after fuses F2/F3&lt;br /&gt;
* board/i_p5, v_p5: voltage and current on 5V bus after fuse F1 (central board)&lt;br /&gt;
&lt;br /&gt;
== Trigger and Clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock (62.5MHz) and trigger are distributed to the PWB columns via the [https://edev-group.triumf.ca/hw/alphag/trigger-card-sata-adapter/rev1 trigger SATA adapter].&lt;br /&gt;
&lt;br /&gt;
The two miniSAS cables from cdm03 port 5 and 6 are connected to a miniSAS-SATA splitter 1-to-4 (CS Electronics &amp;quot;iSAS SATA adapter&amp;quot; ADP-887P-1X). Since there are only 8 columns and the clock and trigger signals are daisy-chained across the 8 rows, this scheme is sufficient to provide the necessary inputs to all 64 PWBs.&lt;br /&gt;
&lt;br /&gt;
[https://www.techcable.com/sas-mini-sas-cables/sata-cables/ SATA 6Gb/s Cable with Latching Clip. Straight Pinout 1-1 247726-L  40in]&lt;br /&gt;
&lt;br /&gt;
== Optical Link ==&lt;br /&gt;
&lt;br /&gt;
Main data uplink.&lt;br /&gt;
&lt;br /&gt;
SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ [[File:AVAGO SFP specs.pdf|SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ]]&lt;br /&gt;
&lt;br /&gt;
Fiber optic Tripp Lite N820 - 10 m [[File:FiberOptic TrippLite specs.pdf|Fiber optic Tripp Lite N820 - 10 m]]&lt;br /&gt;
&lt;br /&gt;
== SATA Link ==&lt;br /&gt;
&lt;br /&gt;
Secondary data uplink, capable also to deliver clock and trigger.&lt;br /&gt;
&lt;br /&gt;
The SATA link connects PWB from adjacent columuns on the same row.&lt;br /&gt;
&lt;br /&gt;
The SATA cable is a &amp;quot;crossed cable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Firmware =&lt;br /&gt;
&lt;br /&gt;
== Firmware update ==&lt;br /&gt;
&lt;br /&gt;
PWB firmware update is done using &amp;quot;esper-tool&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update factory_rpd&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update file_rpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of PWB firmware pwb_rev1_20200706_ko:&lt;br /&gt;
&lt;br /&gt;
Permission to write into the flash memory is controlled by esper variables:&lt;br /&gt;
&lt;br /&gt;
* allow_write set to &amp;quot;false&amp;quot;: &amp;quot;esper-tool upload&amp;quot; does a &amp;quot;verify&amp;quot;: successful upload means epcq flash content is same as rpd file, error means content is not the same.&lt;br /&gt;
* allow_write set to &amp;quot;true&amp;quot;: &amp;quot;esper-tool upload&amp;quot; updates the epcq flash from the rpd file: for each data block, read the epcq flash, compare to rpd data, if different, erase the flash block, write the flash, read the flash, if there is a mismatch (bad write), return an error.&lt;br /&gt;
* allow_factory_write set to &amp;quot;true&amp;quot; to enable writing to the &amp;quot;factory_rpd&amp;quot;. DO NOT SET IT TO &amp;quot;true&amp;quot; UNLESS YOU MEAN TO UPDATE THE PWB BOOTLOADER. IF YOU FLASH BUM FIRMWARE or IF THERE IS A POWER OUTAGE WHILE UPDATING, THE PWB WILL BE BRICKED and has to be recovered by connecting a USB blaster.&lt;br /&gt;
&lt;br /&gt;
To update firmware of multiple boards to correct version, recommended is the script &amp;quot;update_pwb.perl&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/online/src&lt;br /&gt;
./update_pwb.perl pwb12 pwb06 pwb78&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Factory page and user page firmware boot ==&lt;br /&gt;
&lt;br /&gt;
Each PWB board has 2 firmware images: boot loader (factory page)&lt;br /&gt;
and data acquisition (user page). On power up, the FPGA loads and runs&lt;br /&gt;
the boot loader firmware from the factory page, later the control&lt;br /&gt;
software reboots the FPGA into the data acquisition firmware from&lt;br /&gt;
the user page.&lt;br /&gt;
&lt;br /&gt;
Because loading defective firmware can brick https://en.wikipedia.org/wiki/Brick_(electronics)&lt;br /&gt;
the PWB, new firmware images are loaded into the user page, if anything is wrong,&lt;br /&gt;
the PWB can still boot from the factory page and one can use the firmware update&lt;br /&gt;
function to load a good firmware image into the user page.&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is not intended for data acquisition, it is only meant to provide three functions:&lt;br /&gt;
* boot enough hardware and software to communicate via the ethernet and the sata link&lt;br /&gt;
* firmware update (both factory page and user page)&lt;br /&gt;
* reboot into the user page&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is usually never updated unless absolutely&lt;br /&gt;
needed to fix a problem with these three functions (i.e. compatibility with sata link communications).&lt;br /&gt;
&lt;br /&gt;
If factory image is corrupted or the contains defective firmware and the PWB does not boot (no dhcp, no ping, no esper),&lt;br /&gt;
the only way to unbrick it is by loading good firmware using a jtag flash programmer (usb-blaster). Connecting it requires&lt;br /&gt;
physical access to the jtag connector on the PWB board. It is impossible when the detector is fully assembled in the experiment.&lt;br /&gt;
&lt;br /&gt;
The PWB has a 32 Mbyte EPCQ flash memory chip, it is divided into 2 pages 16 Mbytes of factory page and 16 Mbytes of user page.&lt;br /&gt;
&lt;br /&gt;
A complete firmware image generally contains 3 pieces:&lt;br /&gt;
* FPGA firmware and NIOS &amp;quot;feam_bootloader&amp;quot; software RAM image (sof file)&lt;br /&gt;
* NIOS &amp;quot;feam&amp;quot; software RAM image (feam.elf.flash.hex) - all the C code for esper communications and PWB data acquisition&lt;br /&gt;
* NIOS filesystem image (feam.webpkg.hex) - esper web pages&lt;br /&gt;
&lt;br /&gt;
This is the boot sequence:&lt;br /&gt;
* on power-up the FPGA automatically loads the sof file from address 0 of the EPCQ flash (this is the factory image sof file)&lt;br /&gt;
* the FPGA is &amp;quot;started&amp;quot;&lt;br /&gt;
* the NIOS CPU starts executing the &amp;quot;feam_bootloader&amp;quot; C code embedded in the sof file (NIOS project hdl/software/feam_bootloader)&lt;br /&gt;
* feam_bootloader initializes the hardware (clocks, DDR memory, etc)&lt;br /&gt;
* feam_bootloader write-protects the EPCQ flash memory&lt;br /&gt;
* feam_bootloader copies the &amp;quot;feam&amp;quot; software from EPCQ flash to the DDR memory (after checking for correct checkum)&lt;br /&gt;
* feam_bootloader restarts the NIOS CPU&lt;br /&gt;
* the NIOS CPU starts running from DDR memory, executes the &amp;quot;feam&amp;quot; software (NIOS project hdl/software/feam)&lt;br /&gt;
* call main() in hdl/software/feam/src/task_init.c&lt;br /&gt;
* call task_init() in the same file&lt;br /&gt;
* infinite loop waiting for IP address via DHCP&lt;br /&gt;
* after have IP address, call task_esper() from hdl/software/feam/src/task_esper.c&lt;br /&gt;
* task_esper() creates all the esper modules, esper variables, etc,&lt;br /&gt;
* mod_http.c starts the mongoose web server&lt;br /&gt;
* PWB is open for business&lt;br /&gt;
&lt;br /&gt;
This is the protection against booting corrupted firmware:&lt;br /&gt;
* FPGA hardware loads the sof file from epcq flash and checks for correct checksum before &amp;quot;starting&amp;quot; it&lt;br /&gt;
* NIOS CPU is part of the sof file, protected by sof file checksum&lt;br /&gt;
* NIOS feam_bootloader C code is part of the sof file, protected by the sof checksum&lt;br /&gt;
* feam_bootloader checks for correct signatures and checksums of the DDR memory image&lt;br /&gt;
* &amp;quot;feam&amp;quot; C code is protected by the checksum of the DDR memory image&lt;br /&gt;
&lt;br /&gt;
== NIOS terminal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ /opt/intelFPGA/17.0/quartus/bin/nios2-terminal&lt;br /&gt;
nios2-terminal: connected to hardware target using JTAG UART on cable&lt;br /&gt;
nios2-terminal: &amp;quot;USB-Blaster [2-1.2]&amp;quot;, device 1, instance 0&lt;br /&gt;
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)&lt;br /&gt;
PWB Revision 1 Boot Loader&lt;br /&gt;
Ver 2.0  Build 357 - Wed Jun  6 15:05:35 PDT 2018&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash boot loader firmware via jtag ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ cd ~/online/firmware/pwb_rev1&lt;br /&gt;
$ ls -l&lt;br /&gt;
$ /opt/intelFPGA/17.1/quartus/bin/quartus_pgmw&lt;br /&gt;
... auto detect&lt;br /&gt;
... load the jic file&lt;br /&gt;
... in menu tools-&amp;gt;programmer, enable &amp;quot;unprotect device&amp;quot;&lt;br /&gt;
... start program/configure operation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash user page firmware via esper-tool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ cd online/src&lt;br /&gt;
$ more update_pwb.perl ### check that $fw is set to the desired firmware file&lt;br /&gt;
$ ./update_pwb.perl pwb06 ### or give more PWB names or give &amp;quot;all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
=== quartus version to use ===&lt;br /&gt;
&lt;br /&gt;
* quartus 16.1 should be used for jtag (jtagconfig and jtagd)&lt;br /&gt;
* quartus 17.0 should be used to build the PWB firmware (17.1 is not compatible)&lt;br /&gt;
&lt;br /&gt;
=== start license server ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh agmini@daq16&lt;br /&gt;
/opt/intelFPGA/17.0/quartus/linux64/lmgrd -c ~agmini/online/license-daq16.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare the build environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/17.0/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get latest version of the code and build it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd online/firmware/git/pwb_rev1_firmware&lt;br /&gt;
$ git pull&lt;br /&gt;
$ git checkout alphag&lt;br /&gt;
$ git pull&lt;br /&gt;
$ ./scripts/compile_project.sh&lt;br /&gt;
... about 30-40 minutes ...&lt;br /&gt;
$ ls -l bin/*.sof bin/*.jic bin/*.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 12727389 Jan 24  2018 bin/feam_rev1_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 33554661 Jan 24  2018 bin/feam_rev1.jic&lt;br /&gt;
-rw-r--r-- 1 agmini alpha  6974754 Jan 24  2018 bin/rev1.sof&lt;br /&gt;
$ ### feam.jic is loaded via jtag&lt;br /&gt;
$ ### feam_auto.rpd is loaded via esper&lt;br /&gt;
$ ### feam.sof is used to attach the quartus signal tap logic analyzer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firmware build order and sequence ===&lt;br /&gt;
&lt;br /&gt;
* erase previous build&lt;br /&gt;
* regenerate qsys&lt;br /&gt;
* regenerate NIOS BSP &amp;quot;feam_bootloader_bsp&amp;quot; and &amp;quot;feam_bsp&amp;quot;&lt;br /&gt;
* build NIOS projects &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot;&lt;br /&gt;
* build quartus sof file (with the &amp;quot;feam_bootloader&amp;quot; nios project inside)&lt;br /&gt;
* build jic and rpd files (with the quartus sof file and the &amp;quot;feam&amp;quot; nios project inside)&lt;br /&gt;
* load sof file into the FPGA using jtag (be careful about compatible &amp;quot;feam&amp;quot; nios project already in the epcq flash)&lt;br /&gt;
* load jic file into the epcq factory page using jtag (cycle power for them to take effect)&lt;br /&gt;
* load rpd file into the epcq factory or user page using esper&lt;br /&gt;
&lt;br /&gt;
=== scripts for building the firmware ===&lt;br /&gt;
&lt;br /&gt;
* scripts/compile_project.sh - build everything from scratch:&lt;br /&gt;
* scripts/compile_qsys.sh - regenerate the main qsys component&lt;br /&gt;
* scripts/compile_nios.sh - regenerate the BSPs, then same as compile_elf.sh&lt;br /&gt;
* scripts/compile_elf.sh - build the BSPs, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; NIOS projects&lt;br /&gt;
* scripts/update_elf.sh - regenerate the rpd and jic files to include the new &amp;quot;feam&amp;quot; NIOS build (keeps the old &amp;quot;feam_bootloader&amp;quot; in the sof file)&lt;br /&gt;
* scripts/update_bootloader.sh - also regenerate the sof file to include the new &amp;quot;feam_bootloader&amp;quot; build&lt;br /&gt;
* scripts/clean_quartus.sh - prepare quartus fpga sof file to build from scratch&lt;br /&gt;
* scripts/compile_quartus.sh - build the quartus fpga sof file incrementally (run clean_quartus.sh to build from scratch).&lt;br /&gt;
* scripts/load_jtag_sof.pl bin/rev1.sof - load sof file into the FPGA. this will boot the new fpga firmware, the new feam_bootloader (if update_bootloader.sh was run), but with the old &amp;quot;feam&amp;quot; already in epcq flash. (beware of incompatible sof, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; builds!)&lt;br /&gt;
* scripts/load_jtag_jic.pl bin/feam_rev1.jic - load jic file into the EPCQ flash, same as using the graphical flash programmer tool. (this will leave the FPGA running the quartus jtag flash loader firmware, not the PWB firmware. Cycle power for new jic file to take effect).&lt;br /&gt;
&lt;br /&gt;
== ESPER Variables ==&lt;br /&gt;
&lt;br /&gt;
* Board&lt;br /&gt;
** invert_ext_trig - invert trigger signal from CDM before it drives any logic (to undo incorrect signal polarity)&lt;br /&gt;
** reset_nios - goggle up, them down to reset NIOS subsystem&lt;br /&gt;
&lt;br /&gt;
* Signalproc&lt;br /&gt;
** test_mode - ADC data is replaced with a test pattern, see test mode bits in sca_x_ch_ctrl.&lt;br /&gt;
** sca_a_ch_ctrl, sca_b_ch_ctrl, sca_c_ch_ctrl, sca_d_ch_ctrl - channel control bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11..0 - threshold - channel suppression threshold&lt;br /&gt;
14..12 - ctrl_test_mode - test mode:&lt;br /&gt;
         0=fixed patter 0xa5a,&lt;br /&gt;
         1=time bin counter,&lt;br /&gt;
         2=time bin counter with channel number,&lt;br /&gt;
         3=sequential adc sample counter,&lt;br /&gt;
         4={ch_crossed_out,trig_pos,trig_neg,adc[8:0]},&lt;br /&gt;
         5={trig,adc[10:0]},&lt;br /&gt;
         6={ch_crossed_min,adc[10:0]}&lt;br /&gt;
15 - ctrl_supp_mode - channel suppression mode: 0=adc&amp;lt;=(baseline-threshold), 1=adc&amp;lt;=threshold&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Link&lt;br /&gt;
** link_ctrl - sata link control. The bits are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - sata_link_udp_stream_in_enable - permit data flow from sata link to OFFLOAD_SATA&lt;br /&gt;
1 - udp_stream_out_enable - permit sca data flow to sata link&lt;br /&gt;
2 - sata_to_eth_enable - permit ethernet data flow from sata link to TSE_MAC&lt;br /&gt;
3 - eth_to_sata_enable - permit ethernet data flow from TSE MAC to sata link&lt;br /&gt;
4 - enable_stop_our_tx - enable flow control: allow stop_tx&lt;br /&gt;
#5 - stop_our_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
6 - enable_stop_remote_tx - enable flow control: allow send &amp;quot;stop_tx&amp;quot;&lt;br /&gt;
#7 - stop_remote_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
8 - tx_test_pattern_udp - udp data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
9 - tx_test_pattern_eth - nios-to-sata data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
10 - udp_delay_enable - delay between udp packets, see udp_delay_value below&lt;br /&gt;
11 - reboot_tx - send K_REBOOT command to the sata link mate, where it has same effect as board/reset_nios.&lt;br /&gt;
12 - sata_to_nios_disable&lt;br /&gt;
13 - nios_to_sata_disable&lt;br /&gt;
14 - &lt;br /&gt;
15 - &lt;br /&gt;
16 -&lt;br /&gt;
24..31 - udp_delay_value - delay between udp packets (top 8 bits of a 20-bit counter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware data path ==&lt;br /&gt;
&lt;br /&gt;
Main data path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feam_top&lt;br /&gt;
|&lt;br /&gt;
sca_sigproc&lt;br /&gt;
|&lt;br /&gt;
sca_event_control&lt;br /&gt;
4 * sca_control (sca_channel.sv)&lt;br /&gt;
4 * channel_fifo (1024 samples)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_control (sca_channel.sv)&lt;br /&gt;
|&lt;br /&gt;
state machine to control SCA read and write enables&lt;br /&gt;
|&lt;br /&gt;
sca_write_control (what does it do?!?)&lt;br /&gt;
sca_read_control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_read_control&lt;br /&gt;
|&lt;br /&gt;
state machine to store ADC samples into per-channel FIFOs (channel_fifo)&lt;br /&gt;
selector to replace ADC samples with a test pattern&lt;br /&gt;
79*sca_trig_one -&amp;gt; ch_crossed_out - channel hit detector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_event_control&lt;br /&gt;
|&lt;br /&gt;
event_fifo (hdl/mf/event_descriptor_fifo)&lt;br /&gt;
state machine to take ADC data from 4 per-channel FIFOs (channel_fifo) and store it into DDR memory (write addr increment is 510*8 (number of samples)*8 = 4080).&lt;br /&gt;
state machine to read transposed ADC data from DDR memory (read addr increment is 8+8=16 - 2 samples * 2 bytes * 4 sca = 16) and create 4 per-sca data streams&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data stream:&lt;br /&gt;
4 per-sca data streams from sca_event_control -&amp;gt; sca_sigproc(event_dat)&lt;br /&gt;
|&lt;br /&gt;
packet_chunker (hdl/lib/packet_chunker.sv) (4*event_dat -&amp;gt; event_segment_dat) - multiplex 4 data streams into 1 stream of UDP-sized packets&lt;br /&gt;
|&lt;br /&gt;
packet_length_prepender (hdl/lib/packet_length_prepender.sv)  (event_segment_dat -&amp;gt; udp_event_val_out)&lt;br /&gt;
|&lt;br /&gt;
udp_event_val -&amp;gt; info qsys (udp_stream_sca) and into sata link (mux channel 2).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware build instructions from Bryerton (obsolete) ==&lt;br /&gt;
&lt;br /&gt;
This is the old README.md file from the firmware git repository.&lt;br /&gt;
&lt;br /&gt;
These instructions are not used to build the firmware (use scrips/compile_project.sh).&lt;br /&gt;
&lt;br /&gt;
They are still useful for figuring out which buttons to push in the altera gui programs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ALPHAg FrontEnd Acquisition Module (FEAM) - REV0&lt;br /&gt;
&lt;br /&gt;
Welcome to the ALPHAg FEAM Project &lt;br /&gt;
&lt;br /&gt;
# Table of Contents&lt;br /&gt;
&lt;br /&gt;
* [Overview](#overview)&lt;br /&gt;
* [Inital Setup](#initial-setup)&lt;br /&gt;
    * [Quartus Setup](#quartus-setup)&lt;br /&gt;
        * [Create the .cdf](#create-the-cdf)&lt;br /&gt;
    * [NIOS Setup](#nios-Setup)&lt;br /&gt;
        * [Create the project files](#create-the-project-files) &lt;br /&gt;
* [Build Instructions](#build-instructions)&lt;br /&gt;
    * [Building from Quartus GUI](#building-from-quartus-gui)&lt;br /&gt;
        * [Generate the QSys File](#generate-the-qsys-file)&lt;br /&gt;
        * [Compile the NIOSII Project](#compile-the-niosii-project)&lt;br /&gt;
        * [Compile the Quartus Project](#compile-the-quartus-project)&lt;br /&gt;
    * [Building from Scripts](#building-from-scripts)&lt;br /&gt;
    * [Installing from JTAG](#installing-from-jtag)&lt;br /&gt;
    * [Installing from ESPER](#installing-from-esper)&lt;br /&gt;
&lt;br /&gt;
# Overview&lt;br /&gt;
&lt;br /&gt;
The FEAM is a digitizer located on the ALPHAg detector. Each FEAM consists of 4 AFTER SCAs for a total of 288 channels.&lt;br /&gt;
&lt;br /&gt;
# Initial Setup&lt;br /&gt;
&lt;br /&gt;
## Quartus Setup&lt;br /&gt;
&lt;br /&gt;
### Create the .cdf&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Click on **Tools -&amp;gt; Programmer**. The **Programmer** window will appear&lt;br /&gt;
3. In the **Programmer** window, click **Auto Detect**. A **Select Device** dialog box will appear&lt;br /&gt;
    1. (Optional) If **Auto Detect** is greyed out, click on **Hardware Setup**. The **Hardware Setup** dialog box will appear&lt;br /&gt;
    2. Under **Hardware Settings**, double-click on the USB JTAG hardware you wish to use&lt;br /&gt;
    3. Click **Close**. The **Hardware Setup** dialog box will close&lt;br /&gt;
5. Click on **File -&amp;gt; Save As**. The **Save As** dialog box will appear&lt;br /&gt;
6. In the **Save As** dialog box, browse to the **/\&amp;lt;project_dir\&amp;gt;/bin/** directory&lt;br /&gt;
7. Make sure the **Add file to current project** checkbox is checked&lt;br /&gt;
7. In the **File name** input box, type &amp;quot;alphag_feam.cdf&amp;quot; and click **Save**&lt;br /&gt;
8. Close the **Programmer** window&lt;br /&gt;
9. Done!&lt;br /&gt;
&lt;br /&gt;
## NIOS Setup&lt;br /&gt;
&lt;br /&gt;
### Create the project files&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
3. The **Workspace Launcher** window will appear, click *OK* to accept the default workspace.&lt;br /&gt;
4. Click **File -&amp;gt; Import...**. The **Import** dialog box will appear&lt;br /&gt;
5. Click on **General -&amp;gt; Existing Projects into Workspace**&lt;br /&gt;
6. Click **Next \&amp;gt;**&lt;br /&gt;
7. Next to **Select root directory** click **Browse...**. A **Browse for Folder** dialog box will appear&lt;br /&gt;
8. Browse to **/\&amp;lt;project_dir\&amp;gt;/hdl/software** and click **OK**&lt;br /&gt;
8. Four Projects should appear in the **Projects** panel: &lt;br /&gt;
    * alphag_feam&lt;br /&gt;
    * alphag\_feam\_bsp &lt;br /&gt;
    * alphag\_feam\_bootloader&lt;br /&gt;
    * alphag\_feam\_bootloader\_bsp&lt;br /&gt;
9. Click **Select All**&lt;br /&gt;
10. Click **Finish**&lt;br /&gt;
11. Done!&lt;br /&gt;
 &lt;br /&gt;
# Build Instructions&lt;br /&gt;
&lt;br /&gt;
## Building from Quartus GUI&lt;br /&gt;
&lt;br /&gt;
**Warning: Please use Quartus Prime Standard Edition 16.1**&lt;br /&gt;
### Generate the QSys File&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Open QSys by clicking **Tools -&amp;gt; QSys**&lt;br /&gt;
2. Click on **File -&amp;gt; Open** (CTRL+O). An **Open File** dialog box should appear.&lt;br /&gt;
3. Select the **alphag_feam.qsys** file from the **/\&amp;lt;project_dir\&amp;gt;/hdl** directory and click **Open**&lt;br /&gt;
4. Modify as necessary. NOTE: Any change to the QSys, even cosmetic such as expanding or collapsing components will cause the QSys to desire a re-generate. &lt;br /&gt;
5. Click **File -&amp;gt; Save** (CTRL+S)&lt;br /&gt;
6. Click **Generate HDL**. A **Generation** dialog box will appear &lt;br /&gt;
7. Select the settings you desire to be changed, if any&lt;br /&gt;
8. Click **Generate**&lt;br /&gt;
9. Wait for the generation to complete.&lt;br /&gt;
10. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the NIOSII Project&lt;br /&gt;
1. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
2. (Optional) If the QSys file has been re-generated performing the following&lt;br /&gt;
    1. Right-click on **alphag\_feam\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
    2. Right-click on **alphag\_feam\_bootloader\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
3. Modify files as needed. WARNING: Do not modify any BSP files by hand! All changes will be lost on next generate.&lt;br /&gt;
4. Click **Project -&amp;gt; Build All** (CTRL+B). If your workspace as multiple projects, it is recommend to close all but the ones related to the FEAM.&lt;br /&gt;
5. Right-click on **alphag\_feam\_bootloader** and select **Make Targets -&amp;gt; Build...**. The **Make Targets** dialog box will appear&lt;br /&gt;
6. In the **Make Targets** dialog box, select **mem\_init\_generate** and click **Build**&lt;br /&gt;
7. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the Quartus Project&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Under **Processing** click **Start Compilation** (CTRL+L)&lt;br /&gt;
2. Wait about 16-30 minutes.&lt;br /&gt;
3. Done!&lt;br /&gt;
  &lt;br /&gt;
**Note:** If Quartus crashed while compiling, delete the **\&amp;lt;project_dir\&amp;gt;/hdl/db** and **\&amp;lt;project_dir\&amp;gt;/hdl/incremental_db** directories and try again&lt;br /&gt;
  &lt;br /&gt;
## Installing from JTAG&lt;br /&gt;
1. Generate the .jic file using the provided /bin/alphag\_feam\_jic.cof&lt;br /&gt;
    1. In the main Quartus window, click **File -&amp;gt; Convert Programming Files**, A **Convert Programming Files** window will appear&lt;br /&gt;
    2. In the **Convert Programming Files** window, click **Open Conversion Setup Data**. An **Open** dialog box will appear&lt;br /&gt;
    3. In the **Open** dialog box, select the **alphag_feam.cof** file located in **/bin/**&lt;br /&gt;
    4. Click **Open**. The **Open dialog box will close&lt;br /&gt;
        * Note the **File name** field, it should display /\&amp;lt;project\_dir\&amp;gt;/bin/alphag\_feam.jic&lt;br /&gt;
    5. In the **Convert Programming Files** window, click **Generate**&lt;br /&gt;
    6. When the .jic is done being generated, a small dialog box will appear, click **OK**&lt;br /&gt;
    7. In the **Convert Programming Files** window, click **Close**&lt;br /&gt;
2. Load the .JIC file using the Programmer&lt;br /&gt;
    1. In the main Quartus window in the **Project Navigator** drop-down input select **Files**.&lt;br /&gt;
    2. Scroll down the window and find the **alphag_feam.cdf**, and double-click it. The **Programmer** window will open&lt;br /&gt;
    3. Click on the icon labelled **5CGXFC4C6**&lt;br /&gt;
    4. Click on the **Change File** button. The **Select New Programming File** dialog box will appear&lt;br /&gt;
    5. Browse to **/\&amp;lt;project_dir\&amp;gt;/bin/** and select **alphag\_feam.jic**&lt;br /&gt;
    6. Click Open. The **Select New Programming File** dialog box will close&lt;br /&gt;
    7. In the main panel, check the **Program/Configure** box on the line that starts **./bin/alphag\_feam.jic**&lt;br /&gt;
    8. Click the **Start** button&lt;br /&gt;
    9. Wait for the **Progress** bar to go to 100% and stop&lt;br /&gt;
    10. Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Internal test pulser =&lt;br /&gt;
&lt;br /&gt;
Documentation from Bryerton:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---------- Forwarded message ---------&lt;br /&gt;
From: Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
Date: Tue, 24 Apr 2018 at 16:18&lt;br /&gt;
Subject: RE: PWB/FEAM internal test pulse&lt;br /&gt;
To: Lars Martin &amp;lt;lmartin@triumf.ca&amp;gt;&lt;br /&gt;
Cc: Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Lars (and Andrea),&lt;br /&gt;
&lt;br /&gt;
In the new(er) firmware the test pulse code has been modified slightly to&lt;br /&gt;
fit in better with the upgraded trigger system. I can add an option to&lt;br /&gt;
allow it to be triggered by the external trigger (currently it has an&lt;br /&gt;
interval option, or you can hit the manual trigger to fire it, if it’s&lt;br /&gt;
enabled)&lt;br /&gt;
&lt;br /&gt;
The *options for the test pulser* are under the *signalproc module*:&lt;br /&gt;
&lt;br /&gt;
*test_pulse_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the test pulse for each&lt;br /&gt;
SCA. If this is False, the other options below will do nothings for that SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the interval trigger for&lt;br /&gt;
each SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval*&lt;br /&gt;
&lt;br /&gt;
An unsigned 32-bit value that marks how many 16ns clock cycles occur&lt;br /&gt;
between interval triggers. Only one value, as there is only one interval&lt;br /&gt;
timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_wdt*&lt;br /&gt;
&lt;br /&gt;
An array of four 16-bit unsigned integers that control the width of the&lt;br /&gt;
pulse for each SCA when the trigger occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, there is a second set of options to control the delay of the *test&lt;br /&gt;
pulse interval trigger*. These options are located under the *trigger&lt;br /&gt;
module*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_ena*&lt;br /&gt;
&lt;br /&gt;
Boolean value enabling/disabling the interval test pulse trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_delay*&lt;br /&gt;
&lt;br /&gt;
Unsigned 32-bit integer controlling the trigger delay, which is the time&lt;br /&gt;
between when the trigger is requested, and when the trigger actually fires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can setup the interval trigger and use that to create event packets&lt;br /&gt;
with the test pulse on set intervals. If the interval trigger is&lt;br /&gt;
insufficient, I can create another option, which is to fire the test pulse&lt;br /&gt;
for enabled SCAs when the external trigger goes. If so, I’ll add this&lt;br /&gt;
option in the *signalproc *module for you:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_on_ext*&lt;br /&gt;
&lt;br /&gt;
An array of four Booleans, that control if the test pulse for that SCA&lt;br /&gt;
fires on external trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember, in order to use the SCA test pulse at all, you must also set the&lt;br /&gt;
SCA to test mode. You can do this by going into the *sca0-3 modules* and&lt;br /&gt;
setting *test* to *functionality *(the value is *3* if you want to set it&lt;br /&gt;
via esper-tool)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Btw currently the SCAs are hard-coded to have all 72 channels receive the&lt;br /&gt;
test pulse on firing, and the option to de-select/select which channels to&lt;br /&gt;
fire is not offered. Would you like this ability? And if so do you want it&lt;br /&gt;
to set all four SCAs the same, or have an option for all 288 channels?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The waveform viewer on the webpage was removed for technical reasons, and&lt;br /&gt;
so all viewing is done via the MIDAS DAQ. There are some preliminary tools&lt;br /&gt;
I’ve created to verify the event packets and their waveforms, but I&lt;br /&gt;
wouldn’t call them easy to setup or use at the moment. (Or very  useful for&lt;br /&gt;
fine comparisons). If KO doesn’t have a way of saving the events to disk, I&lt;br /&gt;
could deliver something that captured and saved waveforms quite quickly.&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Bryerton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From:* Lars Martin&lt;br /&gt;
*Sent:* April 23, 2018 5:10 PM&lt;br /&gt;
*To:* Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
*Cc:* Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
*Subject:* PWB/FEAM internal test pulse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Bryerton,&lt;br /&gt;
&lt;br /&gt;
Andrea and I would like to check the response function of the PWBs. For&lt;br /&gt;
that Daryl suggested to first look at the internal test pulse.&lt;br /&gt;
&lt;br /&gt;
Can you point us to what settings are required to make that go? And to use&lt;br /&gt;
the external trigger if we want to acquire the data?&lt;br /&gt;
&lt;br /&gt;
Ideally we would acquire Midas data from that, but it&#039;s unclear if KO&#039;s&lt;br /&gt;
frontend allows for that right now. Can we access the data with Esper&lt;br /&gt;
instead?&lt;br /&gt;
&lt;br /&gt;
Finally, we haven&#039;t had the waveform display on the web page for a while,&lt;br /&gt;
but Daryl said you guys use it. Are we using a different page somehow?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope all is well with the baby, cheers,&lt;br /&gt;
&lt;br /&gt;
Lars&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* IMPOSSIBLE (ext clock only connected to clock cleaner) add frequency counter for the external clock (62.5 MHz)&lt;br /&gt;
* DONE add random delay before memtest&lt;br /&gt;
* DONE add 4 more bits to udp_delay&lt;br /&gt;
* DONE fix crash on boot if run is active and triggers arrive (check that trigger is off on boot) (do not set trigger/enable_all, ext_trig_ena, inp_trig_ena, signal_proc/force_run to 1 after boot)&lt;br /&gt;
* DONE (kludge jtag uart write()) increase size of jtag uart output buffer, make it unlimited if possible.&lt;br /&gt;
* DONE (kludge jtag uart write()) on dhcp timeout, reboot the fpga - reboot of nios does not clear the jtag uart, which becomes full and nios stops.&lt;br /&gt;
* DONE add NIOS watchdog timeout for fectrl&lt;br /&gt;
* DONE do not use external clock until instructed by fectrl (clock cleaner default is pin select mode, default pin mode is input with pull down, so clock 0 is selected, this is the ext clock. but we can drive clock select pins from the fpga).&lt;br /&gt;
* DONE change clock cleaner power up: use the 2 lines status_clkin0 and status_clkin1 to tell clock cleaner to use the internal clock (clkin2) - from the FPGA drive first line low, second line high. Also change all NIOS code that programs the clock cleaner to keep these two lines in the &amp;quot;input&amp;quot; mode. Current code switches them to &amp;quot;output&amp;quot; mode.&lt;br /&gt;
* DONE clock cleaner power up state is wrong for both choices of clock: 62.5 MHz ext clock and 125 MHz internal clock, see explanation in feam_top.sv. It looks like I need to drive status_clkin0 and status_clkin1 to &amp;quot;holdover&amp;quot; mode, both logic level 1. Currently status_clkin0 is used as SPI read line, this has to be moved to a different line first.&lt;br /&gt;
* add watchdog timeout that works in factory mode (&amp;quot;remote update&amp;quot; watchdog only works in user mode)&lt;br /&gt;
* enable HTTP pipelining - copy changes on mongoose from ADC project.&lt;br /&gt;
* reset everything if it looks like NIOS TCP/IP code has crashed, but enough code is still running to prevent tripping of the fpga-remote-update watchdog timer. such crash tends to happens when the sata link mate is rebooted and incomplete data arrives from the disrupted ethernet data path.&lt;br /&gt;
* DONE when loading AFTER ASIC do not go into infinite loop if read-back is broken (always mismatch).&lt;br /&gt;
* read and report error status information bits for 2983fc.pdf voltages, currents and temperatures chip&lt;br /&gt;
* add provisions for coded trigger&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=971</id>
		<title>PWB</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=PWB&amp;diff=971"/>
		<updated>2023-03-22T20:40:17Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/pwb_rev1_firmware&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag/feam/rev1&lt;br /&gt;
* https://edev-group.triumf.ca/hw/alphag/feam/rev1&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
&lt;br /&gt;
= Schematics =&lt;br /&gt;
&lt;br /&gt;
* [[Image:pwb_rev0.pdf]]&lt;br /&gt;
* [[Image:Pwb-rev1-after.pdf]]&lt;br /&gt;
* [[Image:AlphaG Rev1.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Manuals =&lt;br /&gt;
&lt;br /&gt;
* [[Image:AFTER_MANUAL_V1.pdf]] AFTER SCA manual v1&lt;br /&gt;
* [[Image:AFTER_DataSheet1_1.pdf]] AFTER SCA manual v1.1&lt;br /&gt;
* [[Image:AFTER_SCA_table2.pdf]] AFTER SCA channel map&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Power distribution and monitoring ==&lt;br /&gt;
&lt;br /&gt;
External power supply is:&lt;br /&gt;
* +5V&lt;br /&gt;
* +2V&lt;br /&gt;
&lt;br /&gt;
Central board:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.1R) - Fuse_5V&lt;br /&gt;
* Ext_2V - F2/F3 - RS2 (0.1R) - Idig2-&lt;br /&gt;
* LDO3 - Fuse_5V - DIG_3.3V - selfenable - ADM7154&lt;br /&gt;
* LDO5 - Fuse_5V - DIG_2.5V - selfenable - ADM7154&lt;br /&gt;
* LDO_CLN - Fuse5V - CLN_3.3V - selfenable - &lt;br /&gt;
* VREG - DIG_3.3V - -2.5V SCA BIAS - selfenable - LTC1983ES6-3#TRMPBF&lt;br /&gt;
* LDO7 - DIG_2.5V - DDR3_VRef - enable DDR3_1P5V, DDR3_PG, DDR3_VttEN&lt;br /&gt;
* LDO2 - Idig2V- - DIG_1.1V - enable DIG_3.3V - LT3071&lt;br /&gt;
* LDO6 - Idig2V- - DDR3_1P5V - enable DIG_3.3V - LT3083&lt;br /&gt;
&lt;br /&gt;
SCA Wing:&lt;br /&gt;
&lt;br /&gt;
* Ext_5V - F1 - RS1 (0.3R) - Isca- - SCA_Fuse5V&lt;br /&gt;
* LDO1 - SCA_Fuse5V - SCA3.3V - enable ADC_PWR_EN - ADM7154&lt;br /&gt;
* LDO2 - SCA3.3V - ADC1.8V - selfenable - ADM7154&lt;br /&gt;
* LDO3 - SCA3.3V - TRN2.5V - selfenable - LT1761&lt;br /&gt;
* REF - SCA3.3V - 1.45V Vicm - selfenable - LM4121&lt;br /&gt;
&lt;br /&gt;
esper variables:&lt;br /&gt;
&lt;br /&gt;
* board/i_sca12, i_sca34, v_sca12, v_sca34: voltage and current into LDO1, after fuse F1 (wing board)&lt;br /&gt;
* board/i_p2, v_p2: voltage and current on 2V bus after fuses F2/F3&lt;br /&gt;
* board/i_p5, v_p5: voltage and current on 5V bus after fuse F1 (central board)&lt;br /&gt;
&lt;br /&gt;
== Trigger and Clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock (62.5MHz) and trigger are distributed to the PWB columns via the [https://edev-group.triumf.ca/hw/alphag/trigger-card-sata-adapter/rev1 trigger SATA adapter].&lt;br /&gt;
&lt;br /&gt;
The two miniSAS cables from cdm03 port 5 and 6 are connected to a miniSAS-SATA splitter 1-to-4 (CS Electronics &amp;quot;iSAS SATA adapter&amp;quot; ADP-887P-1X). Since there are only 8 columns and the clock and trigger signals are daisy-chained across the 8 rows, this scheme is sufficient to provide the necessary inputs to all 64 PWBs.&lt;br /&gt;
&lt;br /&gt;
[https://www.techcable.com/sas-mini-sas-cables/sata-cables/ SATA 6Gb/s Cable with Latching Clip. Straight Pinout 1-1 247726-L  40in]&lt;br /&gt;
&lt;br /&gt;
== Optical Link ==&lt;br /&gt;
&lt;br /&gt;
Main data uplink.&lt;br /&gt;
&lt;br /&gt;
SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ [[File:AVAGO SFP specs.pdf|SFP (Small Form Pluggable) Avago Technologies AFBR-57M5APZ]]&lt;br /&gt;
&lt;br /&gt;
Fiber optic Tripp Lite N820 - 10 m [[File:FiberOptic TrippLite specs.pdf|Fiber optic Tripp Lite N820 - 10 m]]&lt;br /&gt;
&lt;br /&gt;
== SATA Link ==&lt;br /&gt;
&lt;br /&gt;
Secondary data uplink, capable also to deliver clock and trigger.&lt;br /&gt;
&lt;br /&gt;
The SATA link connects PWB from adjacent columuns on the same row.&lt;br /&gt;
&lt;br /&gt;
The SATA cable is a &amp;quot;crossed cable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Firmware =&lt;br /&gt;
&lt;br /&gt;
== Firmware update ==&lt;br /&gt;
&lt;br /&gt;
PWB firmware update is done using &amp;quot;esper-tool&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update factory_rpd&lt;br /&gt;
esper-tool -v upload -f file.rpd http://pwbNN update file_rpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of PWB firmware pwb_rev1_20200706_ko:&lt;br /&gt;
&lt;br /&gt;
Permission to write into the flash memory is controlled by esper variables:&lt;br /&gt;
&lt;br /&gt;
* allow_write set to &amp;quot;false&amp;quot;: &amp;quot;esper-tool upload&amp;quot; does a &amp;quot;verify&amp;quot;: successful upload means epcq flash content is same as rpd file, error means content is not the same.&lt;br /&gt;
* allow_write set to &amp;quot;true&amp;quot;: &amp;quot;esper-tool upload&amp;quot; updates the epcq flash from the rpd file: for each data block, read the epcq flash, compare to rpd data, if different, erase the flash block, write the flash, read the flash, if there is a mismatch (bad write), return an error.&lt;br /&gt;
* allow_factory_write set to &amp;quot;true&amp;quot; to enable writing to the &amp;quot;factory_rpd&amp;quot;. DO NOT SET IT TO &amp;quot;true&amp;quot; UNLESS YOU MEAN TO UPDATE THE PWB BOOTLOADER. IF YOU FLASH BUM FIRMWARE or IF THERE IS A POWER OUTAGE WHILE UPDATING, THE PWB WILL BE BRICKED and has to be recovered by connecting a USB blaster.&lt;br /&gt;
&lt;br /&gt;
To update firmware of multiple boards to correct version, recommended is the script &amp;quot;update_pwb.perl&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/online/src&lt;br /&gt;
./update_pwb.perl pwb12 pwb06 pwb78&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Factory page and user page firmware boot ==&lt;br /&gt;
&lt;br /&gt;
Each PWB board has 2 firmware images: boot loader (factory page)&lt;br /&gt;
and data acquisition (user page). On power up, the FPGA loads and runs&lt;br /&gt;
the boot loader firmware from the factory page, later the control&lt;br /&gt;
software reboots the FPGA into the data acquisition firmware from&lt;br /&gt;
the user page.&lt;br /&gt;
&lt;br /&gt;
Because loading defective firmware can brick https://en.wikipedia.org/wiki/Brick_(electronics)&lt;br /&gt;
the PWB, new firmware images are loaded into the user page, if anything is wrong,&lt;br /&gt;
the PWB can still boot from the factory page and one can use the firmware update&lt;br /&gt;
function to load a good firmware image into the user page.&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is not intended for data acquisition, it is only meant to provide three functions:&lt;br /&gt;
* boot enough hardware and software to communicate via the ethernet and the sata link&lt;br /&gt;
* firmware update (both factory page and user page)&lt;br /&gt;
* reboot into the user page&lt;br /&gt;
&lt;br /&gt;
The boot loader firmware in the factory page is usually never updated unless absolutely&lt;br /&gt;
needed to fix a problem with these three functions (i.e. compatibility with sata link communications).&lt;br /&gt;
&lt;br /&gt;
If factory image is corrupted or the contains defective firmware and the PWB does not boot (no dhcp, no ping, no esper),&lt;br /&gt;
the only way to unbrick it is by loading good firmware using a jtag flash programmer (usb-blaster). Connecting it requires&lt;br /&gt;
physical access to the jtag connector on the PWB board. It is impossible when the detector is fully assembled in the experiment.&lt;br /&gt;
&lt;br /&gt;
The PWB has a 32 Mbyte EPCQ flash memory chip, it is divided into 2 pages 16 Mbytes of factory page and 16 Mbytes of user page.&lt;br /&gt;
&lt;br /&gt;
A complete firmware image generally contains 3 pieces:&lt;br /&gt;
* FPGA firmware and NIOS &amp;quot;feam_bootloader&amp;quot; software RAM image (sof file)&lt;br /&gt;
* NIOS &amp;quot;feam&amp;quot; software RAM image (feam.elf.flash.hex) - all the C code for esper communications and PWB data acquisition&lt;br /&gt;
* NIOS filesystem image (feam.webpkg.hex) - esper web pages&lt;br /&gt;
&lt;br /&gt;
This is the boot sequence:&lt;br /&gt;
* on power-up the FPGA automatically loads the sof file from address 0 of the EPCQ flash (this is the factory image sof file)&lt;br /&gt;
* the FPGA is &amp;quot;started&amp;quot;&lt;br /&gt;
* the NIOS CPU starts executing the &amp;quot;feam_bootloader&amp;quot; C code embedded in the sof file (NIOS project hdl/software/feam_bootloader)&lt;br /&gt;
* feam_bootloader initializes the hardware (clocks, DDR memory, etc)&lt;br /&gt;
* feam_bootloader write-protects the EPCQ flash memory&lt;br /&gt;
* feam_bootloader copies the &amp;quot;feam&amp;quot; software from EPCQ flash to the DDR memory (after checking for correct checkum)&lt;br /&gt;
* feam_bootloader restarts the NIOS CPU&lt;br /&gt;
* the NIOS CPU starts running from DDR memory, executes the &amp;quot;feam&amp;quot; software (NIOS project hdl/software/feam)&lt;br /&gt;
* call main() in hdl/software/feam/src/task_init.c&lt;br /&gt;
* call task_init() in the same file&lt;br /&gt;
* infinite loop waiting for IP address via DHCP&lt;br /&gt;
* after have IP address, call task_esper() from hdl/software/feam/src/task_esper.c&lt;br /&gt;
* task_esper() creates all the esper modules, esper variables, etc,&lt;br /&gt;
* mod_http.c starts the mongoose web server&lt;br /&gt;
* PWB is open for business&lt;br /&gt;
&lt;br /&gt;
This is the protection against booting corrupted firmware:&lt;br /&gt;
* FPGA hardware loads the sof file from epcq flash and checks for correct checksum before &amp;quot;starting&amp;quot; it&lt;br /&gt;
* NIOS CPU is part of the sof file, protected by sof file checksum&lt;br /&gt;
* NIOS feam_bootloader C code is part of the sof file, protected by the sof checksum&lt;br /&gt;
* feam_bootloader checks for correct signatures and checksums of the DDR memory image&lt;br /&gt;
* &amp;quot;feam&amp;quot; C code is protected by the checksum of the DDR memory image&lt;br /&gt;
&lt;br /&gt;
== NIOS terminal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ /opt/intelFPGA/17.0/quartus/bin/nios2-terminal&lt;br /&gt;
nios2-terminal: connected to hardware target using JTAG UART on cable&lt;br /&gt;
nios2-terminal: &amp;quot;USB-Blaster [2-1.2]&amp;quot;, device 1, instance 0&lt;br /&gt;
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)&lt;br /&gt;
PWB Revision 1 Boot Loader&lt;br /&gt;
Ver 2.0  Build 357 - Wed Jun  6 15:05:35 PDT 2018&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash boot loader firmware via jtag ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/16.1/quartus/bin/jtagconfig&lt;br /&gt;
1) USB-Blaster [2-1.2]&lt;br /&gt;
  02B030DD   5CGTFD7(B5|C5|D5)/5CGXBC7B6/..&lt;br /&gt;
$ cd ~/online/firmware/pwb_rev1&lt;br /&gt;
$ ls -l&lt;br /&gt;
$ /opt/intelFPGA/17.1/quartus/bin/quartus_pgmw&lt;br /&gt;
... auto detect&lt;br /&gt;
... load the jic file&lt;br /&gt;
... in menu tools-&amp;gt;programmer, enable &amp;quot;unprotect device&amp;quot;&lt;br /&gt;
... start program/configure operation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash user page firmware via esper-tool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ cd online/src&lt;br /&gt;
$ more update_pwb.perl ### check that $fw is set to the desired firmware file&lt;br /&gt;
$ ./update_pwb.perl pwb06 ### or give more PWB names or give &amp;quot;all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
=== quartus version to use ===&lt;br /&gt;
&lt;br /&gt;
* quartus 16.1 should be used for jtag (jtagconfig and jtagd)&lt;br /&gt;
* quartus 17.0 should be used to build the PWB firmware (17.1 is not compatible)&lt;br /&gt;
&lt;br /&gt;
=== start license server ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh agmini@daq16&lt;br /&gt;
/opt/intelFPGA/17.0/quartus/linux64/lmgrd -c ~agmini/online/license-daq16.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== prepare the build environment ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh agmini@daq16&lt;br /&gt;
$ /opt/intelFPGA/17.0/nios2eds/nios2_command_shell.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get latest version of the code and build it ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd online/firmware/git/pwb_rev1_firmware&lt;br /&gt;
$ git pull&lt;br /&gt;
$ git checkout alphag&lt;br /&gt;
$ git pull&lt;br /&gt;
$ ./scripts/compile_project.sh&lt;br /&gt;
... about 30-40 minutes ...&lt;br /&gt;
$ ls -l bin/*.sof bin/*.jic bin/*.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 12727389 Jan 24  2018 bin/feam_rev1_auto.rpd&lt;br /&gt;
-rw-r--r-- 1 agmini alpha 33554661 Jan 24  2018 bin/feam_rev1.jic&lt;br /&gt;
-rw-r--r-- 1 agmini alpha  6974754 Jan 24  2018 bin/rev1.sof&lt;br /&gt;
$ ### feam.jic is loaded via jtag&lt;br /&gt;
$ ### feam_auto.rpd is loaded via esper&lt;br /&gt;
$ ### feam.sof is used to attach the quartus signal tap logic analyzer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firmware build order and sequence ===&lt;br /&gt;
&lt;br /&gt;
* erase previous build&lt;br /&gt;
* regenerate qsys&lt;br /&gt;
* regenerate NIOS BSP &amp;quot;feam_bootloader_bsp&amp;quot; and &amp;quot;feam_bsp&amp;quot;&lt;br /&gt;
* build NIOS projects &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot;&lt;br /&gt;
* build quartus sof file (with the &amp;quot;feam_bootloader&amp;quot; nios project inside)&lt;br /&gt;
* build jic and rpd files (with the quartus sof file and the &amp;quot;feam&amp;quot; nios project inside)&lt;br /&gt;
* load sof file into the FPGA using jtag (be careful about compatible &amp;quot;feam&amp;quot; nios project already in the epcq flash)&lt;br /&gt;
* load jic file into the epcq factory page using jtag (cycle power for them to take effect)&lt;br /&gt;
* load rpd file into the epcq factory or user page using esper&lt;br /&gt;
&lt;br /&gt;
=== scripts for building the firmware ===&lt;br /&gt;
&lt;br /&gt;
* scripts/compile_project.sh - build everything from scratch:&lt;br /&gt;
* scripts/compile_qsys.sh - regenerate the main qsys component&lt;br /&gt;
* scripts/compile_nios.sh - regenerate the BSPs, then same as compile_elf.sh&lt;br /&gt;
* scripts/compile_elf.sh - build the BSPs, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; NIOS projects&lt;br /&gt;
* scripts/update_elf.sh - regenerate the rpd and jic files to include the new &amp;quot;feam&amp;quot; NIOS build (keeps the old &amp;quot;feam_bootloader&amp;quot; in the sof file)&lt;br /&gt;
* scripts/update_bootloader.sh - also regenerate the sof file to include the new &amp;quot;feam_bootloader&amp;quot; build&lt;br /&gt;
* scripts/clean_quartus.sh - prepare quartus fpga sof file to build from scratch&lt;br /&gt;
* scripts/compile_quartus.sh - build the quartus fpga sof file incrementally (run clean_quartus.sh to build from scratch).&lt;br /&gt;
* scripts/load_jtag_sof.pl bin/rev1.sof - load sof file into the FPGA. this will boot the new fpga firmware, the new feam_bootloader (if update_bootloader.sh was run), but with the old &amp;quot;feam&amp;quot; already in epcq flash. (beware of incompatible sof, &amp;quot;feam_bootloader&amp;quot; and &amp;quot;feam&amp;quot; builds!)&lt;br /&gt;
* scripts/load_jtag_jic.pl bin/feam_rev1.jic - load jic file into the EPCQ flash, same as using the graphical flash programmer tool. (this will leave the FPGA running the quartus jtag flash loader firmware, not the PWB firmware. Cycle power for new jic file to take effect).&lt;br /&gt;
&lt;br /&gt;
== ESPER Variables ==&lt;br /&gt;
&lt;br /&gt;
* Board&lt;br /&gt;
** invert_ext_trig - invert trigger signal from CDM before it drives any logic (to undo incorrect signal polarity)&lt;br /&gt;
** reset_nios - goggle up, them down to reset NIOS subsystem&lt;br /&gt;
&lt;br /&gt;
* Signalproc&lt;br /&gt;
** test_mode - ADC data is replaced with a test pattern, see test mode bits in sca_x_ch_ctrl.&lt;br /&gt;
** sca_a_ch_ctrl, sca_b_ch_ctrl, sca_c_ch_ctrl, sca_d_ch_ctrl - channel control bits:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11..0 - threshold - channel suppression threshold&lt;br /&gt;
14..12 - ctrl_test_mode - test mode:&lt;br /&gt;
         0=fixed patter 0xa5a,&lt;br /&gt;
         1=time bin counter,&lt;br /&gt;
         2=time bin counter with channel number,&lt;br /&gt;
         3=sequential adc sample counter,&lt;br /&gt;
         4={ch_crossed_out,trig_pos,trig_neg,adc[8:0]},&lt;br /&gt;
         5={trig,adc[10:0]},&lt;br /&gt;
         6={ch_crossed_min,adc[10:0]}&lt;br /&gt;
15 - ctrl_supp_mode - channel suppression mode: 0=adc&amp;lt;=(baseline-threshold), 1=adc&amp;lt;=threshold&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Link&lt;br /&gt;
** link_ctrl - sata link control. The bits are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - sata_link_udp_stream_in_enable - permit data flow from sata link to OFFLOAD_SATA&lt;br /&gt;
1 - udp_stream_out_enable - permit sca data flow to sata link&lt;br /&gt;
2 - sata_to_eth_enable - permit ethernet data flow from sata link to TSE_MAC&lt;br /&gt;
3 - eth_to_sata_enable - permit ethernet data flow from TSE MAC to sata link&lt;br /&gt;
4 - enable_stop_our_tx - enable flow control: allow stop_tx&lt;br /&gt;
#5 - stop_our_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
6 - enable_stop_remote_tx - enable flow control: allow send &amp;quot;stop_tx&amp;quot;&lt;br /&gt;
#7 - stop_remote_tx - manually activate the flow control signal into link_tx&lt;br /&gt;
8 - tx_test_pattern_udp - udp data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
9 - tx_test_pattern_eth - nios-to-sata data is replaced by test pattern 0x11111111, 0x22222222, etc.&lt;br /&gt;
10 - udp_delay_enable - delay between udp packets, see udp_delay_value below&lt;br /&gt;
11 - reboot_tx - send K_REBOOT command to the sata link mate, where it has same effect as board/reset_nios.&lt;br /&gt;
12 - sata_to_nios_disable&lt;br /&gt;
13 - nios_to_sata_disable&lt;br /&gt;
14 - &lt;br /&gt;
15 - &lt;br /&gt;
16 -&lt;br /&gt;
24..31 - udp_delay_value - delay between udp packets (top 8 bits of a 20-bit counter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware data path ==&lt;br /&gt;
&lt;br /&gt;
Main data path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feam_top&lt;br /&gt;
|&lt;br /&gt;
sca_sigproc&lt;br /&gt;
|&lt;br /&gt;
sca_event_control&lt;br /&gt;
4 * sca_control (sca_channel.sv)&lt;br /&gt;
4 * channel_fifo (1024 samples)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_control (sca_channel.sv)&lt;br /&gt;
|&lt;br /&gt;
state machine to control SCA read and write enables&lt;br /&gt;
|&lt;br /&gt;
sca_write_control (what does it do?!?)&lt;br /&gt;
sca_read_control&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_read_control&lt;br /&gt;
|&lt;br /&gt;
state machine to store ADC samples into per-channel FIFOs (channel_fifo)&lt;br /&gt;
selector to replace ADC samples with a test pattern&lt;br /&gt;
79*sca_trig_one -&amp;gt; ch_crossed_out - channel hit detector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sca_event_control&lt;br /&gt;
|&lt;br /&gt;
event_fifo (hdl/mf/event_descriptor_fifo)&lt;br /&gt;
state machine to take ADC data from 4 per-channel FIFOs (channel_fifo) and store it into DDR memory (write addr increment is 510*8 (number of samples)*8 = 4080).&lt;br /&gt;
state machine to read transposed ADC data from DDR memory (read addr increment is 8+8=16 - 2 samples * 2 bytes * 4 sca = 16) and create 4 per-sca data streams&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data stream:&lt;br /&gt;
4 per-sca data streams from sca_event_control -&amp;gt; sca_sigproc(event_dat)&lt;br /&gt;
|&lt;br /&gt;
packet_chunker (hdl/lib/packet_chunker.sv) (4*event_dat -&amp;gt; event_segment_dat) - multiplex 4 data streams into 1 stream of UDP-sized packets&lt;br /&gt;
|&lt;br /&gt;
packet_length_prepender (hdl/lib/packet_length_prepender.sv)  (event_segment_dat -&amp;gt; udp_event_val_out)&lt;br /&gt;
|&lt;br /&gt;
udp_event_val -&amp;gt; info qsys (udp_stream_sca) and into sata link (mux channel 2).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware build instructions from Bryerton (obsolete) ==&lt;br /&gt;
&lt;br /&gt;
This is the old README.md file from the firmware git repository.&lt;br /&gt;
&lt;br /&gt;
These instructions are not used to build the firmware (use scrips/compile_project.sh).&lt;br /&gt;
&lt;br /&gt;
They are still useful for figuring out which buttons to push in the altera gui programs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ALPHAg FrontEnd Acquisition Module (FEAM) - REV0&lt;br /&gt;
&lt;br /&gt;
Welcome to the ALPHAg FEAM Project &lt;br /&gt;
&lt;br /&gt;
# Table of Contents&lt;br /&gt;
&lt;br /&gt;
* [Overview](#overview)&lt;br /&gt;
* [Inital Setup](#initial-setup)&lt;br /&gt;
    * [Quartus Setup](#quartus-setup)&lt;br /&gt;
        * [Create the .cdf](#create-the-cdf)&lt;br /&gt;
    * [NIOS Setup](#nios-Setup)&lt;br /&gt;
        * [Create the project files](#create-the-project-files) &lt;br /&gt;
* [Build Instructions](#build-instructions)&lt;br /&gt;
    * [Building from Quartus GUI](#building-from-quartus-gui)&lt;br /&gt;
        * [Generate the QSys File](#generate-the-qsys-file)&lt;br /&gt;
        * [Compile the NIOSII Project](#compile-the-niosii-project)&lt;br /&gt;
        * [Compile the Quartus Project](#compile-the-quartus-project)&lt;br /&gt;
    * [Building from Scripts](#building-from-scripts)&lt;br /&gt;
    * [Installing from JTAG](#installing-from-jtag)&lt;br /&gt;
    * [Installing from ESPER](#installing-from-esper)&lt;br /&gt;
&lt;br /&gt;
# Overview&lt;br /&gt;
&lt;br /&gt;
The FEAM is a digitizer located on the ALPHAg detector. Each FEAM consists of 4 AFTER SCAs for a total of 288 channels.&lt;br /&gt;
&lt;br /&gt;
# Initial Setup&lt;br /&gt;
&lt;br /&gt;
## Quartus Setup&lt;br /&gt;
&lt;br /&gt;
### Create the .cdf&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Click on **Tools -&amp;gt; Programmer**. The **Programmer** window will appear&lt;br /&gt;
3. In the **Programmer** window, click **Auto Detect**. A **Select Device** dialog box will appear&lt;br /&gt;
    1. (Optional) If **Auto Detect** is greyed out, click on **Hardware Setup**. The **Hardware Setup** dialog box will appear&lt;br /&gt;
    2. Under **Hardware Settings**, double-click on the USB JTAG hardware you wish to use&lt;br /&gt;
    3. Click **Close**. The **Hardware Setup** dialog box will close&lt;br /&gt;
5. Click on **File -&amp;gt; Save As**. The **Save As** dialog box will appear&lt;br /&gt;
6. In the **Save As** dialog box, browse to the **/\&amp;lt;project_dir\&amp;gt;/bin/** directory&lt;br /&gt;
7. Make sure the **Add file to current project** checkbox is checked&lt;br /&gt;
7. In the **File name** input box, type &amp;quot;alphag_feam.cdf&amp;quot; and click **Save**&lt;br /&gt;
8. Close the **Programmer** window&lt;br /&gt;
9. Done!&lt;br /&gt;
&lt;br /&gt;
## NIOS Setup&lt;br /&gt;
&lt;br /&gt;
### Create the project files&lt;br /&gt;
1. Open Quartus Prime Standard Edition&lt;br /&gt;
2. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
3. The **Workspace Launcher** window will appear, click *OK* to accept the default workspace.&lt;br /&gt;
4. Click **File -&amp;gt; Import...**. The **Import** dialog box will appear&lt;br /&gt;
5. Click on **General -&amp;gt; Existing Projects into Workspace**&lt;br /&gt;
6. Click **Next \&amp;gt;**&lt;br /&gt;
7. Next to **Select root directory** click **Browse...**. A **Browse for Folder** dialog box will appear&lt;br /&gt;
8. Browse to **/\&amp;lt;project_dir\&amp;gt;/hdl/software** and click **OK**&lt;br /&gt;
8. Four Projects should appear in the **Projects** panel: &lt;br /&gt;
    * alphag_feam&lt;br /&gt;
    * alphag\_feam\_bsp &lt;br /&gt;
    * alphag\_feam\_bootloader&lt;br /&gt;
    * alphag\_feam\_bootloader\_bsp&lt;br /&gt;
9. Click **Select All**&lt;br /&gt;
10. Click **Finish**&lt;br /&gt;
11. Done!&lt;br /&gt;
 &lt;br /&gt;
# Build Instructions&lt;br /&gt;
&lt;br /&gt;
## Building from Quartus GUI&lt;br /&gt;
&lt;br /&gt;
**Warning: Please use Quartus Prime Standard Edition 16.1**&lt;br /&gt;
### Generate the QSys File&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Open QSys by clicking **Tools -&amp;gt; QSys**&lt;br /&gt;
2. Click on **File -&amp;gt; Open** (CTRL+O). An **Open File** dialog box should appear.&lt;br /&gt;
3. Select the **alphag_feam.qsys** file from the **/\&amp;lt;project_dir\&amp;gt;/hdl** directory and click **Open**&lt;br /&gt;
4. Modify as necessary. NOTE: Any change to the QSys, even cosmetic such as expanding or collapsing components will cause the QSys to desire a re-generate. &lt;br /&gt;
5. Click **File -&amp;gt; Save** (CTRL+S)&lt;br /&gt;
6. Click **Generate HDL**. A **Generation** dialog box will appear &lt;br /&gt;
7. Select the settings you desire to be changed, if any&lt;br /&gt;
8. Click **Generate**&lt;br /&gt;
9. Wait for the generation to complete.&lt;br /&gt;
10. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the NIOSII Project&lt;br /&gt;
1. Open the NIOS II Software Build Tools by clicking **Tools -&amp;gt; NIOS II Software Build Tools for Eclipse**&lt;br /&gt;
2. (Optional) If the QSys file has been re-generated performing the following&lt;br /&gt;
    1. Right-click on **alphag\_feam\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
    2. Right-click on **alphag\_feam\_bootloader\_bsp** and select **NIOS II -&amp;gt; Generate BSP**. The BSP will regenerate&lt;br /&gt;
3. Modify files as needed. WARNING: Do not modify any BSP files by hand! All changes will be lost on next generate.&lt;br /&gt;
4. Click **Project -&amp;gt; Build All** (CTRL+B). If your workspace as multiple projects, it is recommend to close all but the ones related to the FEAM.&lt;br /&gt;
5. Right-click on **alphag\_feam\_bootloader** and select **Make Targets -&amp;gt; Build...**. The **Make Targets** dialog box will appear&lt;br /&gt;
6. In the **Make Targets** dialog box, select **mem\_init\_generate** and click **Build**&lt;br /&gt;
7. Done!&lt;br /&gt;
&lt;br /&gt;
### Compile the Quartus Project&lt;br /&gt;
1. Open Quartus Standard Edition 16.1&lt;br /&gt;
1. Under **Processing** click **Start Compilation** (CTRL+L)&lt;br /&gt;
2. Wait about 16-30 minutes.&lt;br /&gt;
3. Done!&lt;br /&gt;
  &lt;br /&gt;
**Note:** If Quartus crashed while compiling, delete the **\&amp;lt;project_dir\&amp;gt;/hdl/db** and **\&amp;lt;project_dir\&amp;gt;/hdl/incremental_db** directories and try again&lt;br /&gt;
  &lt;br /&gt;
## Installing from JTAG&lt;br /&gt;
1. Generate the .jic file using the provided /bin/alphag\_feam\_jic.cof&lt;br /&gt;
    1. In the main Quartus window, click **File -&amp;gt; Convert Programming Files**, A **Convert Programming Files** window will appear&lt;br /&gt;
    2. In the **Convert Programming Files** window, click **Open Conversion Setup Data**. An **Open** dialog box will appear&lt;br /&gt;
    3. In the **Open** dialog box, select the **alphag_feam.cof** file located in **/bin/**&lt;br /&gt;
    4. Click **Open**. The **Open dialog box will close&lt;br /&gt;
        * Note the **File name** field, it should display /\&amp;lt;project\_dir\&amp;gt;/bin/alphag\_feam.jic&lt;br /&gt;
    5. In the **Convert Programming Files** window, click **Generate**&lt;br /&gt;
    6. When the .jic is done being generated, a small dialog box will appear, click **OK**&lt;br /&gt;
    7. In the **Convert Programming Files** window, click **Close**&lt;br /&gt;
2. Load the .JIC file using the Programmer&lt;br /&gt;
    1. In the main Quartus window in the **Project Navigator** drop-down input select **Files**.&lt;br /&gt;
    2. Scroll down the window and find the **alphag_feam.cdf**, and double-click it. The **Programmer** window will open&lt;br /&gt;
    3. Click on the icon labelled **5CGXFC4C6**&lt;br /&gt;
    4. Click on the **Change File** button. The **Select New Programming File** dialog box will appear&lt;br /&gt;
    5. Browse to **/\&amp;lt;project_dir\&amp;gt;/bin/** and select **alphag\_feam.jic**&lt;br /&gt;
    6. Click Open. The **Select New Programming File** dialog box will close&lt;br /&gt;
    7. In the main panel, check the **Program/Configure** box on the line that starts **./bin/alphag\_feam.jic**&lt;br /&gt;
    8. Click the **Start** button&lt;br /&gt;
    9. Wait for the **Progress** bar to go to 100% and stop&lt;br /&gt;
    10. Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Internal test pulser =&lt;br /&gt;
&lt;br /&gt;
Documentation from Bryerton:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---------- Forwarded message ---------&lt;br /&gt;
From: Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
Date: Tue, 24 Apr 2018 at 16:18&lt;br /&gt;
Subject: RE: PWB/FEAM internal test pulse&lt;br /&gt;
To: Lars Martin &amp;lt;lmartin@triumf.ca&amp;gt;&lt;br /&gt;
Cc: Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Lars (and Andrea),&lt;br /&gt;
&lt;br /&gt;
In the new(er) firmware the test pulse code has been modified slightly to&lt;br /&gt;
fit in better with the upgraded trigger system. I can add an option to&lt;br /&gt;
allow it to be triggered by the external trigger (currently it has an&lt;br /&gt;
interval option, or you can hit the manual trigger to fire it, if it’s&lt;br /&gt;
enabled)&lt;br /&gt;
&lt;br /&gt;
The *options for the test pulser* are under the *signalproc module*:&lt;br /&gt;
&lt;br /&gt;
*test_pulse_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the test pulse for each&lt;br /&gt;
SCA. If this is False, the other options below will do nothings for that SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval_ena*&lt;br /&gt;
&lt;br /&gt;
An array of four booleans, that control turning on the interval trigger for&lt;br /&gt;
each SCA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_interval*&lt;br /&gt;
&lt;br /&gt;
An unsigned 32-bit value that marks how many 16ns clock cycles occur&lt;br /&gt;
between interval triggers. Only one value, as there is only one interval&lt;br /&gt;
timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_wdt*&lt;br /&gt;
&lt;br /&gt;
An array of four 16-bit unsigned integers that control the width of the&lt;br /&gt;
pulse for each SCA when the trigger occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, there is a second set of options to control the delay of the *test&lt;br /&gt;
pulse interval trigger*. These options are located under the *trigger&lt;br /&gt;
module*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_ena*&lt;br /&gt;
&lt;br /&gt;
Boolean value enabling/disabling the interval test pulse trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*intp_trig_delay*&lt;br /&gt;
&lt;br /&gt;
Unsigned 32-bit integer controlling the trigger delay, which is the time&lt;br /&gt;
between when the trigger is requested, and when the trigger actually fires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can setup the interval trigger and use that to create event packets&lt;br /&gt;
with the test pulse on set intervals. If the interval trigger is&lt;br /&gt;
insufficient, I can create another option, which is to fire the test pulse&lt;br /&gt;
for enabled SCAs when the external trigger goes. If so, I’ll add this&lt;br /&gt;
option in the *signalproc *module for you:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*test_pulse_on_ext*&lt;br /&gt;
&lt;br /&gt;
An array of four Booleans, that control if the test pulse for that SCA&lt;br /&gt;
fires on external trigger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember, in order to use the SCA test pulse at all, you must also set the&lt;br /&gt;
SCA to test mode. You can do this by going into the *sca0-3 modules* and&lt;br /&gt;
setting *test* to *functionality *(the value is *3* if you want to set it&lt;br /&gt;
via esper-tool)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Btw currently the SCAs are hard-coded to have all 72 channels receive the&lt;br /&gt;
test pulse on firing, and the option to de-select/select which channels to&lt;br /&gt;
fire is not offered. Would you like this ability? And if so do you want it&lt;br /&gt;
to set all four SCAs the same, or have an option for all 288 channels?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The waveform viewer on the webpage was removed for technical reasons, and&lt;br /&gt;
so all viewing is done via the MIDAS DAQ. There are some preliminary tools&lt;br /&gt;
I’ve created to verify the event packets and their waveforms, but I&lt;br /&gt;
wouldn’t call them easy to setup or use at the moment. (Or very  useful for&lt;br /&gt;
fine comparisons). If KO doesn’t have a way of saving the events to disk, I&lt;br /&gt;
could deliver something that captured and saved waveforms quite quickly.&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Bryerton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*From:* Lars Martin&lt;br /&gt;
*Sent:* April 23, 2018 5:10 PM&lt;br /&gt;
*To:* Bryerton Shaw &amp;lt;bryerton@triumf.ca&amp;gt;&lt;br /&gt;
*Cc:* Andrea Capra &amp;lt;acapra@triumf.ca&amp;gt;&lt;br /&gt;
*Subject:* PWB/FEAM internal test pulse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Bryerton,&lt;br /&gt;
&lt;br /&gt;
Andrea and I would like to check the response function of the PWBs. For&lt;br /&gt;
that Daryl suggested to first look at the internal test pulse.&lt;br /&gt;
&lt;br /&gt;
Can you point us to what settings are required to make that go? And to use&lt;br /&gt;
the external trigger if we want to acquire the data?&lt;br /&gt;
&lt;br /&gt;
Ideally we would acquire Midas data from that, but it&#039;s unclear if KO&#039;s&lt;br /&gt;
frontend allows for that right now. Can we access the data with Esper&lt;br /&gt;
instead?&lt;br /&gt;
&lt;br /&gt;
Finally, we haven&#039;t had the waveform display on the web page for a while,&lt;br /&gt;
but Daryl said you guys use it. Are we using a different page somehow?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope all is well with the baby, cheers,&lt;br /&gt;
&lt;br /&gt;
Lars&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* IMPOSSIBLE (ext clock only connected to clock cleaner) add frequency counter for the external clock (62.5 MHz)&lt;br /&gt;
* DONE add random delay before memtest&lt;br /&gt;
* DONE add 4 more bits to udp_delay&lt;br /&gt;
* DONE fix crash on boot if run is active and triggers arrive (check that trigger is off on boot) (do not set trigger/enable_all, ext_trig_ena, inp_trig_ena, signal_proc/force_run to 1 after boot)&lt;br /&gt;
* DONE (kludge jtag uart write()) increase size of jtag uart output buffer, make it unlimited if possible.&lt;br /&gt;
* DONE (kludge jtag uart write()) on dhcp timeout, reboot the fpga - reboot of nios does not clear the jtag uart, which becomes full and nios stops.&lt;br /&gt;
* DONE add NIOS watchdog timeout for fectrl&lt;br /&gt;
* DONE do not use external clock until instructed by fectrl (clock cleaner default is pin select mode, default pin mode is input with pull down, so clock 0 is selected, this is the ext clock. but we can drive clock select pins from the fpga).&lt;br /&gt;
* DONE change clock cleaner power up: use the 2 lines status_clkin0 and status_clkin1 to tell clock cleaner to use the internal clock (clkin2) - from the FPGA drive first line low, second line high. Also change all NIOS code that programs the clock cleaner to keep these two lines in the &amp;quot;input&amp;quot; mode. Current code switches them to &amp;quot;output&amp;quot; mode.&lt;br /&gt;
* DONE clock cleaner power up state is wrong for both choices of clock: 62.5 MHz ext clock and 125 MHz internal clock, see explanation in feam_top.sv. It looks like I need to drive status_clkin0 and status_clkin1 to &amp;quot;holdover&amp;quot; mode, both logic level 1. Currently status_clkin0 is used as SPI read line, this has to be moved to a different line first.&lt;br /&gt;
* add watchdog timeout that works in factory mode (&amp;quot;remote update&amp;quot; watchdog only works in user mode)&lt;br /&gt;
* enable HTTP pipelining - copy changes on mongoose from ADC project.&lt;br /&gt;
* reset everything if it looks like NIOS TCP/IP code has crashed, but enough code is still running to prevent tripping of the fpga-remote-update watchdog timer. such crash tends to happens when the sata link mate is rebooted and incomplete data arrives from the disrupted ethernet data path.&lt;br /&gt;
* DONE when loading AFTER ASIC do not go into infinite loop if read-back is broken (always mismatch).&lt;br /&gt;
* read and report error status information bits for 2983fc.pdf&lt;br /&gt;
* add provisions for coded trigger&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=970</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=970"/>
		<updated>2022-10-17T21:09:02Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/expalpha/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha/agana - git repository for agana&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
== Single ADC: (fw rel-20201112-ko) ==&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
== Single PWB, fw 20201005_ko, see https://alphacpc05.cern.ch/elog/Detectors/5563 ==&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data:&lt;br /&gt;
* up to 500 Hz, stable&lt;br /&gt;
&lt;br /&gt;
All pads firing (FW pulser)&lt;br /&gt;
* 4 SCA: up to 272 Hz, 81.6 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 2 SCA: up to 295 Hz, 44.25 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 1 SCA: up to 295 Hz, 22.5 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
&lt;br /&gt;
Conclusion:&lt;br /&gt;
* max PWB date rate 80 Mbytes/sec,&lt;br /&gt;
* max non-suppressed PWB trigger rate: 295 Hz&lt;br /&gt;
* max suppressed PWB trigger rate: 500 Hz (1.6 ms sca readout time)&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 sas links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 sas links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 minisas links 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 minisas links 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* BscFromAdc16a - (at CERN, set to &amp;quot;y&amp;quot;) route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 0..7&lt;br /&gt;
* BscFromAdc16b - route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 8..15&lt;br /&gt;
* BscBotOnly - route BSC trigger data from bottom ASD cards, bsc64_bus = bot&lt;br /&gt;
* BscTopOnly - route BSC trigger data from top ASD cards, bsc64_bus = top&lt;br /&gt;
* BscBotTopOr - (set to &amp;quot;y&amp;quot;) use bsc64_bus = (top OR bottom)&lt;br /&gt;
* BscBotTopAnd - use bsc64_bus = (top AND bottom)&lt;br /&gt;
* BscMultiplicityMin - (set to 2) BSC multiplicity trigger - minimum multiplicity&lt;br /&gt;
* BscMultiplicityWindowClk8 - (set to 80) BSC multiplicity window, 8 ns clocks&lt;br /&gt;
* BscEmptyWindowClk8 - (set to 80) BSC empty window, 8 ns clocks, see [[TRG#bsc64_multiplicity_trigger]]&lt;br /&gt;
* BscGrandOrDelayClk16 - (not implemented) trigger delay used by fectrl when TrigSrc/TrigBscGrandOr is selected&lt;br /&gt;
* BscMultTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigBscMult is selected&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_grand_or), 0x9: (BSC multiplicity)*(TWC aw16_grand_or), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
* CoincTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigCoinc is selected&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=User_talk:Ina&amp;diff=969</id>
		<title>User talk:Ina</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=User_talk:Ina&amp;diff=969"/>
		<updated>2022-09-20T16:50:20Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;AgWiki&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Olchansk|Olchansk]] ([[User talk:Olchansk|talk]]) 09:50, 20 September 2022 (PDT)&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=968</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=968"/>
		<updated>2022-07-25T22:46:23Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Performance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
== Single ADC: (fw rel-20201112-ko) ==&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
== Single PWB, fw 20201005_ko, see https://alphacpc05.cern.ch/elog/Detectors/5563 ==&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data:&lt;br /&gt;
* up to 500 Hz, stable&lt;br /&gt;
&lt;br /&gt;
All pads firing (FW pulser)&lt;br /&gt;
* 4 SCA: up to 272 Hz, 81.6 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 2 SCA: up to 295 Hz, 44.25 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 1 SCA: up to 295 Hz, 22.5 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
&lt;br /&gt;
Conclusion:&lt;br /&gt;
* max PWB date rate 80 Mbytes/sec,&lt;br /&gt;
* max non-suppressed PWB trigger rate: 295 Hz&lt;br /&gt;
* max suppressed PWB trigger rate: 500 Hz (1.6 ms sca readout time)&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 sas links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 sas links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 minisas links 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 minisas links 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* BscFromAdc16a - (at CERN, set to &amp;quot;y&amp;quot;) route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 0..7&lt;br /&gt;
* BscFromAdc16b - route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 8..15&lt;br /&gt;
* BscBotOnly - route BSC trigger data from bottom ASD cards, bsc64_bus = bot&lt;br /&gt;
* BscTopOnly - route BSC trigger data from top ASD cards, bsc64_bus = top&lt;br /&gt;
* BscBotTopOr - (set to &amp;quot;y&amp;quot;) use bsc64_bus = (top OR bottom)&lt;br /&gt;
* BscBotTopAnd - use bsc64_bus = (top AND bottom)&lt;br /&gt;
* BscMultiplicityMin - (set to 2) BSC multiplicity trigger - minimum multiplicity&lt;br /&gt;
* BscMultiplicityWindowClk8 - (set to 80) BSC multiplicity window, 8 ns clocks&lt;br /&gt;
* BscEmptyWindowClk8 - (set to 80) BSC empty window, 8 ns clocks, see [[TRG#bsc64_multiplicity_trigger]]&lt;br /&gt;
* BscGrandOrDelayClk16 - (not implemented) trigger delay used by fectrl when TrigSrc/TrigBscGrandOr is selected&lt;br /&gt;
* BscMultTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigBscMult is selected&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_grand_or), 0x9: (BSC multiplicity)*(TWC aw16_grand_or), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
* CoincTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigCoinc is selected&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=967</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=967"/>
		<updated>2022-07-25T22:45:57Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Performance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
Single ADC: (fw rel-20201112-ko)&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
Single PWB, fw 20201005_ko, see https://alphacpc05.cern.ch/elog/Detectors/5563&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data:&lt;br /&gt;
* up to 500 Hz, stable&lt;br /&gt;
&lt;br /&gt;
All pads firing (FW pulser)&lt;br /&gt;
* 4 SCA: up to 272 Hz, 81.6 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 2 SCA: up to 295 Hz, 44.25 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
* 1 SCA: up to 295 Hz, 22.5 Mbytes/sec, at higher rate: event fifo overflow&lt;br /&gt;
&lt;br /&gt;
Conclusion:&lt;br /&gt;
* max PWB date rate 80 Mbytes/sec,&lt;br /&gt;
* max non-suppressed PWB trigger rate: 295 Hz&lt;br /&gt;
* max suppressed PWB trigger rate: 500 Hz (1.6 ms sca readout time)&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 sas links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 sas links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 minisas links 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 minisas links 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* BscFromAdc16a - (at CERN, set to &amp;quot;y&amp;quot;) route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 0..7&lt;br /&gt;
* BscFromAdc16b - route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 8..15&lt;br /&gt;
* BscBotOnly - route BSC trigger data from bottom ASD cards, bsc64_bus = bot&lt;br /&gt;
* BscTopOnly - route BSC trigger data from top ASD cards, bsc64_bus = top&lt;br /&gt;
* BscBotTopOr - (set to &amp;quot;y&amp;quot;) use bsc64_bus = (top OR bottom)&lt;br /&gt;
* BscBotTopAnd - use bsc64_bus = (top AND bottom)&lt;br /&gt;
* BscMultiplicityMin - (set to 2) BSC multiplicity trigger - minimum multiplicity&lt;br /&gt;
* BscMultiplicityWindowClk8 - (set to 80) BSC multiplicity window, 8 ns clocks&lt;br /&gt;
* BscEmptyWindowClk8 - (set to 80) BSC empty window, 8 ns clocks, see [[TRG#bsc64_multiplicity_trigger]]&lt;br /&gt;
* BscGrandOrDelayClk16 - (not implemented) trigger delay used by fectrl when TrigSrc/TrigBscGrandOr is selected&lt;br /&gt;
* BscMultTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigBscMult is selected&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_grand_or), 0x9: (BSC multiplicity)*(TWC aw16_grand_or), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
* CoincTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigCoinc is selected&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=966</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=966"/>
		<updated>2022-07-25T18:06:24Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Firmware revisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
* 0x62ded109 - fix cbtrg fifo data corruption, 1st fifo word was missing, 2nd fifo word sent twice.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== general format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0x8ccccccc&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
different versions of trigger packets should be decoded according to packet length:&lt;br /&gt;
40 bytes: initial firmware&lt;br /&gt;
76 bytes: firmware 0x618b790b (Nov 2021)&lt;br /&gt;
80 bytes: firmware 0x62d1c47e (Jul 2022)&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xCccccccc&lt;br /&gt;
[2] fifo status&lt;br /&gt;
[3] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xDccccccc&lt;br /&gt;
[2] 0xDEADBEEF&lt;br /&gt;
[3] fifo status&lt;br /&gt;
[4] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
packet size 76 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 udp packet counter&lt;br /&gt;
1	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
2	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
9	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
packet size 80 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 udp packet counter&lt;br /&gt;
1	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
2	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
9	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
18         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
19	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=965</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=965"/>
		<updated>2022-07-25T16:59:49Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* firmware 0x618b790b (Nov 2021) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== general format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0x8ccccccc&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
different versions of trigger packets should be decoded according to packet length:&lt;br /&gt;
40 bytes: initial firmware&lt;br /&gt;
76 bytes: firmware 0x618b790b (Nov 2021)&lt;br /&gt;
80 bytes: firmware 0x62d1c47e (Jul 2022)&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xCccccccc&lt;br /&gt;
[2] fifo status&lt;br /&gt;
[3] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xDccccccc&lt;br /&gt;
[2] 0xDEADBEEF&lt;br /&gt;
[3] fifo status&lt;br /&gt;
[4] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
packet size 76 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 udp packet counter&lt;br /&gt;
1	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
2	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
9	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
packet size 80 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 udp packet counter&lt;br /&gt;
1	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
2	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
9	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
18         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
19	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=964</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=964"/>
		<updated>2022-07-25T16:59:19Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* firmware 0x62d1c47e (Jul 2022) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== general format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0x8ccccccc&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
different versions of trigger packets should be decoded according to packet length:&lt;br /&gt;
40 bytes: initial firmware&lt;br /&gt;
76 bytes: firmware 0x618b790b (Nov 2021)&lt;br /&gt;
80 bytes: firmware 0x62d1c47e (Jul 2022)&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xCccccccc&lt;br /&gt;
[2] fifo status&lt;br /&gt;
[3] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xDccccccc&lt;br /&gt;
[2] 0xDEADBEEF&lt;br /&gt;
[3] fifo status&lt;br /&gt;
[4] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
packet size 80 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 udp packet counter&lt;br /&gt;
1	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
2	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
9	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
19	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
packet size 80 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 udp packet counter&lt;br /&gt;
1	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
2	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
9	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
18         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
19	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=963</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=963"/>
		<updated>2022-07-25T16:58:29Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* firmware 0x618b790b (Nov 2021) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== general format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0x8ccccccc&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
different versions of trigger packets should be decoded according to packet length:&lt;br /&gt;
40 bytes: initial firmware&lt;br /&gt;
76 bytes: firmware 0x618b790b (Nov 2021)&lt;br /&gt;
80 bytes: firmware 0x62d1c47e (Jul 2022)&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xCccccccc&lt;br /&gt;
[2] fifo status&lt;br /&gt;
[3] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xDccccccc&lt;br /&gt;
[2] 0xDEADBEEF&lt;br /&gt;
[3] fifo status&lt;br /&gt;
[4] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
packet size 80 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 udp packet counter&lt;br /&gt;
1	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
2	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
9	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
19	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=962</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=962"/>
		<updated>2022-07-25T16:57:32Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* general format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== general format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0x8ccccccc&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
different versions of trigger packets should be decoded according to packet length:&lt;br /&gt;
40 bytes: initial firmware&lt;br /&gt;
76 bytes: firmware 0x618b790b (Nov 2021)&lt;br /&gt;
80 bytes: firmware 0x62d1c47e (Jul 2022)&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xCccccccc&lt;br /&gt;
[2] fifo status&lt;br /&gt;
[3] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet, firmware 0x618b790b (Nov 2021)&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xDccccccc&lt;br /&gt;
[2] 0xDEADBEEF&lt;br /&gt;
[3] fifo status&lt;br /&gt;
[4] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
0x0ccccccc is the 28 bit fifo packet counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=961</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=961"/>
		<updated>2022-07-25T16:46:23Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* general format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== general format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0x8ccccccc&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xCccccccc&lt;br /&gt;
[2] fifo status&lt;br /&gt;
[3] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&lt;br /&gt;
chronobox fifo packet:&lt;br /&gt;
&lt;br /&gt;
[0] udp packet counter&lt;br /&gt;
[1] 0xDccccccc&lt;br /&gt;
[2] 0xDEADBEEF&lt;br /&gt;
[3] fifo status&lt;br /&gt;
[4] fifo data&lt;br /&gt;
...&lt;br /&gt;
[N] 0xEccccccc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=960</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=960"/>
		<updated>2022-07-25T16:42:53Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* UDP data format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== general format ==&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=959</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=959"/>
		<updated>2022-07-24T22:44:00Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Firmware revisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=955</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=955"/>
		<updated>2022-07-16T22:18:24Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Firmware revisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
* 0x62d32d95 - updated cbtrg, switched to edge-triggered cbtrg inputs, improved BSC multiplicity trigger, improved coinc trigger, added burst pulser.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=954</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=954"/>
		<updated>2022-07-16T21:43:19Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* additional registers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=953</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=953"/>
		<updated>2022-07-16T21:43:06Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* additional registers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name  | firmware   | description&lt;br /&gt;
0x60 | rw | cb_control_out       | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status            | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out      | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out      | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out   | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out   | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out   | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out   | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num         | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out   | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out   | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out      | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status       | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out  | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status       | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data         | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out    | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=952</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=952"/>
		<updated>2022-07-16T21:42:16Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* additional registers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg  | rw/ro/rol | quartus name | firmware | description&lt;br /&gt;
0x60 | rw | cb_control_out | 0x618b790b | chronobox control&lt;br /&gt;
0x61 | rw | cb_status | 0x618b790b |  chronobox status&lt;br /&gt;
0x62 | rw | cb_invert_a_out | 0x618b790b | chronobox input invert&lt;br /&gt;
0x63 | rw | cb_invert_b_out | 0x618b790b |&lt;br /&gt;
0x64 | rw | cb_enable_le_a_out | 0x618b790b | timestamp enable leading edge&lt;br /&gt;
0x65 | rw | cb_enable_le_b_out | 0x618b790b |&lt;br /&gt;
0x66 | rw | cb_enable_te_a_out | 0x618b790b | timestamp enable traiing edge &lt;br /&gt;
0x67 | rw | cb_enable_te_b_out | 0x618b790b | &lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B | rw | cb_sync_mask_a_out | 0x618b790b | chronobox sync signal source&lt;br /&gt;
0x6C | rw | cb_sync_mask_b_out | 0x618b790b | &lt;br /&gt;
0x6D | rw | cb_sync_reg_out | 0x618b790b | chronobox sync register&lt;br /&gt;
0x6E | ro | cb_sync_status | 0x618b790b | chronobox sync status&lt;br /&gt;
0x6F | rw | cb_latch_period_out | 0x618b790b | chronobox scalers latch period&lt;br /&gt;
0x70 | ro | cb_fifo_status | 0x618b790b | chronobox data fifo status&lt;br /&gt;
0x71 | ro | cb_fifo_data | 0x618b790b | read chronobox data fifo (cb_fifo_rdack_out &amp;lt;= 1)&lt;br /&gt;
0x72 | rw | cb_udp_period_out | 0x618b790b | period for flushing fifo to UDP&lt;br /&gt;
0x73 | rw | cb_udp_threshold_out | 0x618b790b | byte threshold for flushing fifo to UDP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=951</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=951"/>
		<updated>2022-07-16T21:33:15Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Coincidence trigger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence to be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC grand-or and TPC AW grand-or signals: start 0x5, required 0x5&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW grand-or triggers: start 0x9, required 0x9&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=950</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=950"/>
		<updated>2022-07-16T21:16:07Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* /Equipment/CTRL/Settings/TRG - trigger settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
Single ADC: (fw rel-20201112-ko)&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 sas links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 sas links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 minisas links 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 minisas links 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* BscFromAdc16a - (at CERN, set to &amp;quot;y&amp;quot;) route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 0..7&lt;br /&gt;
* BscFromAdc16b - route BSC trigger data (bsc64_bus) from 100 MHz adc16 digitizers minisas links 8..15&lt;br /&gt;
* BscBotOnly - route BSC trigger data from bottom ASD cards, bsc64_bus = bot&lt;br /&gt;
* BscTopOnly - route BSC trigger data from top ASD cards, bsc64_bus = top&lt;br /&gt;
* BscBotTopOr - (set to &amp;quot;y&amp;quot;) use bsc64_bus = (top OR bottom)&lt;br /&gt;
* BscBotTopAnd - use bsc64_bus = (top AND bottom)&lt;br /&gt;
* BscMultiplicityMin - (set to 2) BSC multiplicity trigger - minimum multiplicity&lt;br /&gt;
* BscMultiplicityWindowClk8 - (set to 80) BSC multiplicity window, 8 ns clocks&lt;br /&gt;
* BscEmptyWindowClk8 - (set to 80) BSC empty window, 8 ns clocks, see [[TRG#bsc64_multiplicity_trigger]]&lt;br /&gt;
* BscGrandOrDelayClk16 - (not implemented) trigger delay used by fectrl when TrigSrc/TrigBscGrandOr is selected&lt;br /&gt;
* BscMultTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigBscMult is selected&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_grand_or), 0x9: (BSC multiplicity)*(TWC aw16_grand_or), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
* CoincTrigDelayClk16 - trigger delay used by fectrl when TrigSrc/TrigCoinc is selected&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=949</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=949"/>
		<updated>2022-07-16T21:07:57Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* /Equipment/CTRL/Settings/TRG - trigger settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
Single ADC: (fw rel-20201112-ko)&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 sas links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 sas links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 sas links 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 sas links 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* BscFromAdc16a - route BSC trigger (bsc64_bus) from 100 MHz adc16 digitizers sas links 0..7&lt;br /&gt;
* BscFromAdc16b - route BSC trigger (bsc64_bus) from 100 MHz adc16 digitizers sas links 8..15&lt;br /&gt;
* BscBotOnly&lt;br /&gt;
* BscTopOnly&lt;br /&gt;
* BscBotTopOr&lt;br /&gt;
* BscBotTopAnd&lt;br /&gt;
* BscMultiplicityMin&lt;br /&gt;
* BscMultiplicityWindowClk8&lt;br /&gt;
* BscEmptyWindowClk8&lt;br /&gt;
* BscMultTrigDelayClk16&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_1ormore), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
* CoincTrigDelayClk16&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=948</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=948"/>
		<updated>2022-07-16T21:03:54Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* /Equipment/CTRL/Settings/TRG - trigger settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
Single ADC: (fw rel-20201112-ko)&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 data links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 data links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 in ADCs 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 in ADCs 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* BscFromAdc16a&lt;br /&gt;
* BscFromAdc16b&lt;br /&gt;
* BscBotOnly&lt;br /&gt;
* BscTopOnly&lt;br /&gt;
* BscBotTopOr&lt;br /&gt;
* BscBotTopAnd&lt;br /&gt;
* BscMultiplicityMin&lt;br /&gt;
* BscMultiplicityWindowClk8&lt;br /&gt;
* BscEmptyWindowClk8&lt;br /&gt;
* BscMultTrigDelayClk16&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_1ormore), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
* CoincTrigDelayClk16&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=947</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=947"/>
		<updated>2022-07-16T21:00:27Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* /Equipment/CTRL/Settings/TrigSrc - trigger source selection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
Single ADC: (fw rel-20201112-ko)&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on adc16_grand_or or adc32_grand_or&lt;br /&gt;
* (removed from trg firmware) Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* (removed from trg firmware) Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincB                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincC                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoincD                    - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAwCoinc                     - ditto&lt;br /&gt;
* (removed from trg firmware) TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* (removed from trg firmware) TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* (removed from trg firmware) TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 data links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 data links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 in ADCs 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 in ADCs 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_1ormore), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=946</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=946"/>
		<updated>2022-07-15T21:55:08Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* firmware 0x62d1c47e (Jul 2022) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17         udp_data_out  &amp;lt;= conf_fw_rev;&lt;br /&gt;
18	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values of udp_coinc_latch[7:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_aw16_mult[7:0] and udp_aw16_bus[15:0]:&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
Values of udp_bsc64_mult[7:0] and udp_bsc64_bus[63:0]&lt;br /&gt;
* aaa&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=945</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=945"/>
		<updated>2022-07-15T21:51:11Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* firmware 0x618b790b (Nov 2021) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firmware 0x62d1c47e (Jul 2022) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=944</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=944"/>
		<updated>2022-07-15T21:50:01Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* conf_coinc_control bits */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_coinc_required[5]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_coinc_required[6]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_coinc_required[7]&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=943</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=943"/>
		<updated>2022-07-15T21:48:16Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* conf_bsc_control bits */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_empty_wondow || 0x62d1c47e || bsc64 empty window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=942</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=942"/>
		<updated>2022-07-15T20:00:17Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Register addresses */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1c47e || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=941</id>
		<title>Daq</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=Daq&amp;diff=941"/>
		<updated>2022-07-15T19:57:03Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* /Equipment/CTRL/Settings/Pulser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Links =&lt;br /&gt;
&lt;br /&gt;
* https://alphacpc05.cern.ch/agdaq/ -- midas daq page for the agdaq system at CERN&lt;br /&gt;
* https://daq16.triumf.ca -- midas daq page for the agmini system at TRIUMF&lt;br /&gt;
* https://daq.triumf.ca/elog-alphag/alphag/ -- elog&lt;br /&gt;
* https://daqstore.triumf.ca/AgWiki/index.php/Main_Page -- this wiki&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/agdaq - git repository for agdaq&lt;br /&gt;
* https://bitbucket.org/expalpha  -- git repository on bitbucket&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/alphag -- git repository on edev gitlab&lt;br /&gt;
&lt;br /&gt;
= Inventory database =&lt;br /&gt;
&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/170 - PWB inventory database&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/168 - ADC (GRIF-16) inventory, FMC-ADC32rev0,rev1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/176 - FMC-ADC32rev1.1 inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/174 - BSC RTM inventory&lt;br /&gt;
* https://ladd00.triumf.ca/daqinv/frontend/list/173 - BSC ASD inventory&lt;br /&gt;
&lt;br /&gt;
= Hardware manuals =&lt;br /&gt;
&lt;br /&gt;
* [[TRG]] - trigger board (GRIF-C) manual&lt;br /&gt;
* CDM - https://daq.triumf.ca/DaqWiki/index.php/VME-CDM -- clock VME-CDM manual&lt;br /&gt;
* ADC - https://daq.triumf.ca/DaqWiki/index.php/VME-GRIF-ADC16-Rev1 -- GRIF-16 ADC manual&lt;br /&gt;
* [[PWB]] - TPC Pad Wing Board manual&lt;br /&gt;
* TDC - https://daq.triumf.ca/DaqWiki/index.php/GSI_TRB3&lt;br /&gt;
* [[chronobox]] - chronobox manual&lt;br /&gt;
* [[ASD]] - BSC preamp board&lt;br /&gt;
* [[RTM]] - BSC VME rear transition board&lt;br /&gt;
&lt;br /&gt;
= Performance =&lt;br /&gt;
&lt;br /&gt;
Full system: (ADC fw rel-20201112-ko, PWB fw 20201005_ko)&lt;br /&gt;
* 1 Hz stable, ADC adc32 9 supp off rate 0.3 M/s, adc16 off, PWB udp_delay 25 supp off active 64 rate 6.6+4+6+4.6=21.2 M/s, TDC off, total rate 21 M/s&lt;br /&gt;
* 500 Hz stable, ADC adc32 9 supp 1500 rate 6 M/s, adc16 off, PWB udp_delay 10 supp 100 active 63 rate 3+4+3+3=13 M/s, TDC off, total rate 19 M/s&lt;br /&gt;
&lt;br /&gt;
Single ADC: (fw rel-20201112-ko)&lt;br /&gt;
&lt;br /&gt;
Fully suppressed data, sthreshold 5000&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 500 Hz: stable (nominal max trigger rate)&lt;br /&gt;
* 6700 Hz: stable, 8 Mbytes/sec&lt;br /&gt;
* 6800 Hz: evb eventually confused&lt;br /&gt;
* 6850 Hz: evb confused, no lost triggers in the ADC, no crash in the ADC&lt;br /&gt;
&lt;br /&gt;
All data, 510 samples/event, sthreshold 10 (fw rel-20201122-ko)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable, 3.4 Mbytes/sec&lt;br /&gt;
* 500 Hz: stable, 17 Mbytes/sec (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 Mbytes/sec&lt;br /&gt;
* 3100 Hz: stable, 106 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3200 Hz: stable, 110 M/s - TRG communication is in trouble&lt;br /&gt;
* 3300 Hz: stable, 116 M/s&lt;br /&gt;
* 3400 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
no suppression (different fpga data path)&lt;br /&gt;
* 1 Hz: stable&lt;br /&gt;
* 100 Hz: stable&lt;br /&gt;
* 500 Hz: stable, 17 M/s (nominal max trigger rate)&lt;br /&gt;
* 1000 Hz: stable, 32 M/s&lt;br /&gt;
* 3000 Hz: stable, 100 M/s (approaching saturation of 1gige ethernet)&lt;br /&gt;
* 3300 Hz: incomplete events, no ADC crash (&amp;quot;dropped due to full&amp;quot; counting, &amp;quot;dropped due to busy&amp;quot; are zero, this is as expected).&lt;br /&gt;
&lt;br /&gt;
= Network connections =&lt;br /&gt;
&lt;br /&gt;
The experiment private network number is: 192.168.1.x, gateway 192.168.1.1, netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
network map:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---- TRIUMF/CERN network --1gige-- alphagdaq --10gige-- juniper switch --1gige-- centrecom switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== alphagdaq network connections ==&lt;br /&gt;
&lt;br /&gt;
on the rear of the machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
|   | rj45 | rj45 |         | sfp | sfp |&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
&lt;br /&gt;
- left rj45 - copper 1gige - eno1 - spare (inactive)&lt;br /&gt;
- right rj45 - copper 1gige - eno2 - dhcp - cern/triumf network&lt;br /&gt;
- left sfp - 10gige - enp1s0f1 - spare (inactive)&lt;br /&gt;
- right sfp - 10gige - enp1s0f0 - static 192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== connections between switches ==&lt;br /&gt;
&lt;br /&gt;
* alphagdaq to juniper switch: direct attach (DAC) 10gige cable into any port of juniper switch&lt;br /&gt;
* juniper switch to centrecom switch: rj45 sfp in any port of juniper switch - cat5e/cat6 cable - to any port of centrecom switch&lt;br /&gt;
* cat5e/cat6 cable from any port of centrecom switch to the XXX port on the back of the juniper switch&lt;br /&gt;
&lt;br /&gt;
== juniper switch ==&lt;br /&gt;
&lt;br /&gt;
connected to juniper switch front is:&lt;br /&gt;
&lt;br /&gt;
* everything that sends event data to alphagdaq, specifically:&lt;br /&gt;
** TRG (rj45 sfp)&lt;br /&gt;
** 16x ADC (fiber sfp)&lt;br /&gt;
** 64x PWB (fiber sfp)&lt;br /&gt;
* 10gige uplink to alphagdaq (10gige DAC cable)&lt;br /&gt;
* 1gige link to centrecom switch (rj45 sfp)&lt;br /&gt;
* 40gige ports are not used&lt;br /&gt;
&lt;br /&gt;
connected to the juniper switch rear:&lt;br /&gt;
&lt;br /&gt;
* CON is the serial console via RJ45-to-DB9 to USB-serial adapter to alphagdaq USB port (9600bps, 8N1, no flow control)&lt;br /&gt;
* C0 is the management ethernet interface port, connect to any port on the centrecom switch (juniper-private will ping)&lt;br /&gt;
&lt;br /&gt;
== centrecom switch ==&lt;br /&gt;
&lt;br /&gt;
* everything with copper rj45 connections, specifically:&lt;br /&gt;
** CDM boards&lt;br /&gt;
** HV, LV and VME power supplies&lt;br /&gt;
** RaspberryPi3 boards&lt;br /&gt;
** gas handling MFCs (algas)&lt;br /&gt;
** cooling system controller (moxa01)&lt;br /&gt;
&lt;br /&gt;
= USB connections =&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* alphagdaq has USB2 and USB3 connections. They are not the same, they are not generally interchangeable.&lt;br /&gt;
* USB3 connections and cables are generally blue coloured.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from alphagdaq:&lt;br /&gt;
&lt;br /&gt;
* front USB3 port (blue): USB-A-to-B cable to USB blaster connected to the trigger board (front of rack)&lt;br /&gt;
* rear USB3 port (blue): USB3 short jumper to USB3 hub&lt;br /&gt;
* rear USB2 port (black): USB2 unpowered hub (Logiix) to USB-A-to-B cable to UPS USB connector&lt;br /&gt;
* rear USB2 port (black): USB-to-Serial adaper to DB9 to RJ45 adapter to Juniper switch console port&lt;br /&gt;
&lt;br /&gt;
Note: UPS USB connection does not work with alphagdaq USB ports (both usb2 and usb3), but combination&lt;br /&gt;
using the unpowered USB2 hub seems to work ok.&lt;br /&gt;
&lt;br /&gt;
List of USB connections from the USB hub:&lt;br /&gt;
&lt;br /&gt;
* this is a powered USB3 hub&lt;br /&gt;
* USB-A-to-MicroUSB - to lvdb boards&lt;br /&gt;
* USB-A-to-Wiener interlock cable&lt;br /&gt;
&lt;br /&gt;
= Clock and trigger distribution =&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
Trigger is generated by the trigger board (aka TRG, aka GRIF-C),&lt;br /&gt;
from the TRG eSATA output through the eSATA splitter it is fed into&lt;br /&gt;
the master CDM. The master CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
One of the master CDM MiniSAS outputs is connected to the CDM slave eSATA input.&lt;br /&gt;
The same as the master CDM, the slave CDM outputs the trigger on all MiniSAS output ports.&lt;br /&gt;
&lt;br /&gt;
The master 62.5MHz clock is generated by the master CDM using the internal 10MHz oscillator&lt;br /&gt;
or the external 10MHz AD clock. Also on MiniSAS port 6 the master CDM generates&lt;br /&gt;
the 200MHz clock for the TDC. This clock is frequency-locked to the master 62.5MHz clock.&lt;br /&gt;
&lt;br /&gt;
Master CDM clock selection (external CD 10MHz clock or internal oscillator 10MHz clock)&lt;br /&gt;
is done by a magic esper command (see below).&lt;br /&gt;
&lt;br /&gt;
From the master CDM, the clock is fed to: the slave CDM, the TRG (via the eSATA splitter)&lt;br /&gt;
and to the TDC (via the RJ45 splitter).&lt;br /&gt;
&lt;br /&gt;
The slave CDM sends the clock and the trigger to the ADCs and PWBs.&lt;br /&gt;
&lt;br /&gt;
== Chronobox connections ==&lt;br /&gt;
&lt;br /&gt;
Chronoboxes are synchronized with the daq using two signals: 10 MHz timestamp clock and TTL sync.&lt;br /&gt;
&lt;br /&gt;
The sync signal used is the trigger signal - timestamps are reset by the 1st event - which is not a physics event, but the first trigger in the trigger sync sequence.&lt;br /&gt;
&lt;br /&gt;
All chronoboxes are configured in &amp;quot;slave&amp;quot; and &amp;quot;chain&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
Slave mode: 10 MHz timestamp clock goes into the CLK_IN input (configured as NIM on the first chronobox and TTL on all others), sync signal goes into TTL input LEMO 4. (bank B direction set to &amp;quot;in&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Chain mode: 10 MHz timestamp clock is TTL output LEMO 0, sync is TTL output LEMO 1. (bank A direction set to &amp;quot;out&amp;quot;). These signals feed into CLK_IN (TTL mode) and TTL input LEMO 4 in the next chronobox in the chain.&lt;br /&gt;
&lt;br /&gt;
The first chronobox receives the 10 MHz timestamp clock and sync signals from the master CDM per diagrams below.&lt;br /&gt;
&lt;br /&gt;
* CDM 10 MHz clock output is NIM, feeds directly into the chronobox CLK_IN (NIM mode).&lt;br /&gt;
* CDM &amp;quot;trigger&amp;quot; (&amp;quot;sync&amp;quot;) output is NIM, has to go through a NIM-to-TTL converter before feeding chronobox TTL input LEMO 4. I use a LeCroy 222 &amp;quot;gate and delay generator&amp;quot; module. NIM input goes into the &amp;quot;Start&amp;quot; input, TTL output is taken from the &amp;quot;TTL&amp;quot; output. Signal width is adjusted to around 100-1000 ns. Any other sutable NIM-to-TTL converter can also be used.&lt;br /&gt;
* &amp;quot;sync&amp;quot; output must be enabled in the master CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
esper-tool cdm00&lt;br /&gt;
cd cdm&lt;br /&gt;
write multi_sync 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematic ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRG (GRIF-C)&lt;br /&gt;
------------&lt;br /&gt;
eSATA &amp;lt;------&amp;gt; eSATA splitter&lt;br /&gt;
&lt;br /&gt;
eSATA splitter&lt;br /&gt;
--------------&lt;br /&gt;
trigger ---&amp;gt; eSATA ---&amp;gt; CDM-Master eSATA (trigger signal)&lt;br /&gt;
clock &amp;lt;--- (eSATA --- MiniSAS) &amp;lt;--- CDM MiniSAS (62.5MHz clock)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Master&lt;br /&gt;
----------&lt;br /&gt;
LEMO1B &amp;lt;----- 10 MHz AD clock (NIM)&lt;br /&gt;
LEMO2A --&amp;gt; (only if there is no external clock) 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
LEMO2B --&amp;gt; chronobox sync (NIM) --&amp;gt; NIM-to-TTL --&amp;gt; long lemo cable to chronobox sync input (TTL)&lt;br /&gt;
LEMO3B --&amp;gt; long lemo cable to chronobox clock input (NIM) (CLK_IN configured for NIM input)&lt;br /&gt;
eSATA &amp;lt;--- eSATA splitter &amp;lt;--- eSATA from TRG (trigger signal)&lt;br /&gt;
MiniSAS 1 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; CDM-Slave eSATA (62.5 MHz)&lt;br /&gt;
MiniSAS 6 --&amp;gt; (MiniSAS --- eSATA) --&amp;gt; eSATA splitter --&amp;gt; RJ45 --&amp;gt; TDC (200 MHz)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM-Slave&lt;br /&gt;
---------&lt;br /&gt;
LEMO2A --&amp;gt; 4ns lemo cable --&amp;gt; LEMO1B (62.5 MHz frequency monitor)&lt;br /&gt;
eSATA &amp;lt;--- trigger and 62.5MHz clock from CDM-Master&lt;br /&gt;
MiniSAS 1 --&amp;gt; ADC trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 2 --&amp;gt; same&lt;br /&gt;
MiniSAS 3 --&amp;gt; same&lt;br /&gt;
MiniSAS 4 --&amp;gt; same&lt;br /&gt;
MiniSAS 5 --&amp;gt; PWB trigger and 62.5MHz clock&lt;br /&gt;
MiniSAS 6 --&amp;gt; same&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VME_Crate_CERN.jpeg|800x450px|Layout of the VME crate at CERN.]]&lt;br /&gt;
&lt;br /&gt;
Layout of the VME crate at CERN. The ALPHA-T module is in the rightmost slot. The Master CDM is next to it and it&#039;s labelled as #02. The Slave CDM is on the lefmost position and labelled by #03.&lt;br /&gt;
&lt;br /&gt;
== Setup of CDM boards ==&lt;br /&gt;
&lt;br /&gt;
ALPHA-g uses the Rev3 CDM boards. The 4 CDM boards that belong to ALPHA-g&lt;br /&gt;
have serial numbers 0, 1, 2 and 3 and are labeled cdm00, cdm01, cdm02, cdm03.&lt;br /&gt;
&lt;br /&gt;
All the boards can be used as master and slave positions, but have to be&lt;br /&gt;
configured appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Slave setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* connect esata external clock&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 4&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [62500246]                      &lt;br /&gt;
12    ext_clk          uint32           R                 [62500246]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If needed, check correct operation of the pll lock monitoring:&lt;br /&gt;
&lt;br /&gt;
* unplug the esata cable from the master CDM&lt;br /&gt;
* &amp;quot;red&amp;quot; light should go off&lt;br /&gt;
* read of lmk should report &amp;quot;pll1_ld&amp;quot; value 0 and &amp;quot;ld1_counter&amp;quot; and &amp;quot;ld2_counter&amp;quot; should increment&lt;br /&gt;
* reconnect the esata cable&lt;br /&gt;
* &amp;quot;red&amp;quot; light should return&lt;br /&gt;
* read of lmk should report both pll1_ld and pll2_ld locked (values &amp;quot;1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Master setup ===&lt;br /&gt;
&lt;br /&gt;
* install the board&lt;br /&gt;
* connect ethernet&lt;br /&gt;
* esper-tool cdmNN ### i.e. esper-tool cdm01&lt;br /&gt;
* cd template&lt;br /&gt;
* write current_setup 3&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 0&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* read&lt;br /&gt;
* observe clock frequency counters report correct values. &amp;quot;ext_clk&amp;quot; will only count if the &amp;quot;clock loopback&amp;quot; lemo jumper is installed (see below)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12    ext_clk          uint32           R                 [62500189]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
156   ld1_counter      uint32           RW                [3]                             &lt;br /&gt;
157   ld2_counter      uint32           RW                [3]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the 200MHz clock:&lt;br /&gt;
* connect MiniSAS-eSATA splitter cable to MiniSAS output 6, connect eSATA end to CDM eSATA input&lt;br /&gt;
* in esper-tool, read cdm: esata_clk should report 200MHz clock&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
11    esata_clk        uint32           R                 [200000603]                     &lt;br /&gt;
12    ext_clk          uint32           R                 [62500188]                      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Master setup with external 10 MHz clock ===&lt;br /&gt;
&lt;br /&gt;
* setup master CDM as above (using internal clock)&lt;br /&gt;
* connect 10MHz external clock to LEMO1A&lt;br /&gt;
* esper-tool cdmNN&lt;br /&gt;
* cd /cdm&lt;br /&gt;
* write sel_nim 1 # if clock is NIM signal&lt;br /&gt;
* write sel_nim 0 # if clock is TTL signal (i.e. chronobox LEMO output)&lt;br /&gt;
* read ext_clk&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http://cdm00:/cdm]&amp;gt; read ext_clk&lt;br /&gt;
9999556&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if ext_clk reads 0 or does not read something close to 10MHz, stop here. debug the signal, try changing sel_nim, etc.&lt;br /&gt;
* cd /lmk&lt;br /&gt;
* write clkin_sel_mode 2 # select external clock&lt;br /&gt;
* read&lt;br /&gt;
* observe both PLL1 and PLL2 are locked: both values should be &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
150   clkin2_sel       bool             R                 [True]                          &lt;br /&gt;
144   pll1_ld          uint8            R                 [1]                             &lt;br /&gt;
147   pll2_ld          uint8            R                 [1]                             &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the MIDAS TRG page, observe that TRG measured external clock frequency is close to 62.5 MHz&lt;br /&gt;
&lt;br /&gt;
== clkin_sel_mode positions ==&lt;br /&gt;
&lt;br /&gt;
* 0 = 10MHz internal oscillator (use on master CDM in standalone mode)&lt;br /&gt;
* 1 = eSATA clock (use on slave CDM)&lt;br /&gt;
* 2 = external clock, should be 10MHz (use on master CDM to run from AD clock)&lt;br /&gt;
&lt;br /&gt;
== LEMO connections ==&lt;br /&gt;
&lt;br /&gt;
LEMO connectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|LEMO1A|LEMO1B&lt;br /&gt;
|LEMO2A|LEMO2B&lt;br /&gt;
|LEMO3A|LEMO3B&lt;br /&gt;
|eSATA&lt;br /&gt;
|RJ45 ETH&lt;br /&gt;
|minisas&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock loopback jumper: to read the frequency of the generated 62.5MHz clock, connect LEMO cable from LEMO2B to LEMO1A&lt;br /&gt;
* 10MHz internal clock jumper: to feed 10MHz internal oscillator to the external clock, connect LEMO cable from LEMO3A to the LEMO1A&lt;br /&gt;
* 10MHz external clock: to feed 10MHz external clock, connect LEMO cable to LEMO1A&lt;br /&gt;
&lt;br /&gt;
= MIDAS frontends =&lt;br /&gt;
&lt;br /&gt;
== UDP ==&lt;br /&gt;
&lt;br /&gt;
feudp receives udp packets from the ADC and PWB boards. For each udp packet 1 midas event is created,&lt;br /&gt;
with 1 data bank containing the udp data. Events are sent into the MIDAS event buffer BUFUDP. The names&lt;br /&gt;
of the data banks are assigned in ODB /eq/feudp/settings.&lt;br /&gt;
&lt;br /&gt;
{ADC,PWB} --&amp;gt; 1gige --&amp;gt; switch --&amp;gt; 10gige --&amp;gt; alphagdaq --&amp;gt; feudp -&amp;gt; BUFUDP&lt;br /&gt;
&lt;br /&gt;
== CTRL ==&lt;br /&gt;
&lt;br /&gt;
fectrl controls all the ADC, PWB and trigger boards. It provides run start and stop sequencing,&lt;br /&gt;
runs the event synchronization sequence at the begin of the run, and records slow controls data (temperatures,&lt;br /&gt;
voltages, etc).&lt;br /&gt;
&lt;br /&gt;
fectrl receives UDP data packets from the trigger board and sends them to the MIDAS event buffer BUFUDP.&lt;br /&gt;
&lt;br /&gt;
fectrl receives commands from the control web pages (for ADC, PWB and trigger) to reboot, initialize, etc the boards.&lt;br /&gt;
&lt;br /&gt;
fectrl configures the event builder via odb /eq/fectrl/evbconfig.&lt;br /&gt;
&lt;br /&gt;
ADC &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
PWB &amp;lt;-&amp;gt; http esper &amp;lt;-&amp;gt; fectrl -&amp;gt; slow control data into midas history&lt;br /&gt;
&lt;br /&gt;
TRG &amp;lt;-&amp;gt; udp comm &amp;lt;-&amp;gt; fectrl -&amp;gt; BUFUDP, slow control and counters into midas history&lt;br /&gt;
&lt;br /&gt;
fectrl &amp;lt;-&amp;gt; midas rpc &amp;lt;-&amp;gt; mhttpd &amp;lt;-&amp;gt; json rpc &amp;lt;-&amp;gt; control web pages for ADC, PWB and trigger&lt;br /&gt;
&lt;br /&gt;
== EVB ==&lt;br /&gt;
&lt;br /&gt;
feevb receives udp packet data from the MIDAS event buffer BUFUDP, inspects the packet timestamps&lt;br /&gt;
and collects the data with matching timestamps into physics events. feevb has provisions to do&lt;br /&gt;
data suppression, reduction and compression in addition to the data reduction done&lt;br /&gt;
in the ADC and PWB firmware.&lt;br /&gt;
&lt;br /&gt;
feevb event synchronization relies on the event synchronization sequence done by fectrl when a run is started.&lt;br /&gt;
&lt;br /&gt;
{ADC, PWB, TRG} -&amp;gt; BUFUDP -&amp;gt; feevb -&amp;gt; SYSTEM -&amp;gt; mlogger -&amp;gt; compression -&amp;gt; disk storage&lt;br /&gt;
&lt;br /&gt;
=== internal structure ===&lt;br /&gt;
&lt;br /&gt;
* event buffer readers, instances for BUFTRG, BUFTDC, BUFADC, BUFUDP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BufferReader class - reads one midas event buffer:&lt;br /&gt;
- BufferReaderThread()&lt;br /&gt;
-- in batches of 1000 events&lt;br /&gt;
--- lock&lt;br /&gt;
--- TickLocked()&lt;br /&gt;
----- ReadEvent() -&amp;gt; bm_receive_event_alloc()&lt;br /&gt;
----- fHandler-&amp;gt;HandleEvent()&lt;br /&gt;
-- fHandler-&amp;gt;XMaybeFlushBank()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event header decoder and intermediate buffer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handler class - accumulates events, sends them to the EVB in batches&lt;br /&gt;
&lt;br /&gt;
- HandleEvent() &amp;lt;- BufferReaderThread() - receive incoming events&lt;br /&gt;
-- loop over all banks, examine bank name&lt;br /&gt;
--- call AddAdcBank(), AddPwbBank(), AddTrgBank(), AddTdcBank() according to bank name&lt;br /&gt;
----  AddXxxBank() -&amp;gt; XAddBank()&lt;br /&gt;
--- unknown banks go directly to evb-&amp;gt;SendQueue&lt;br /&gt;
-- check if synchronization has completed&lt;br /&gt;
&lt;br /&gt;
- XAddBank() - save BankBuf objects in a buffer&lt;br /&gt;
&lt;br /&gt;
- XMaybeFlushBank(), XFlushBank() - send all accumulated data to the Evb class&lt;br /&gt;
-- evb-&amp;gt;lock()&lt;br /&gt;
-- for each buffered BankBuf objects,&lt;br /&gt;
--- call evb-&amp;gt;AddBankLocked()&lt;br /&gt;
-- buffer is now empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event builder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Evb class - assemble event fragments according to timestamps&lt;br /&gt;
&lt;br /&gt;
- fEvents fifo (deque) - time sorted list of partially assembled events&lt;br /&gt;
-- new entries are added by FindEvent()&lt;br /&gt;
-- entries are modified by MergeSlot()&lt;br /&gt;
-- old entries are removed by GetLocked()&lt;br /&gt;
&lt;br /&gt;
- AddBankLocked() &amp;lt;- XFlushBank() &amp;lt;- BufferReaderThread()&lt;br /&gt;
-- call fSync-&amp;gt;Add()&lt;br /&gt;
-- transform BankBuf to EvbEventBuf&lt;br /&gt;
-- push it into per-module buffer fBuf[imodule]&lt;br /&gt;
&lt;br /&gt;
- EvbThread()&lt;br /&gt;
-- EvbTickLocked()&lt;br /&gt;
--- BuildLocked()&lt;br /&gt;
---- in a loop, for no more than 1 sec&lt;br /&gt;
----- loop over all per-module buffers fBuf&lt;br /&gt;
------ pop first entry, pass it to BuildSlot()&lt;br /&gt;
------- call FindEvent()&lt;br /&gt;
------- call MergeSlot()&lt;br /&gt;
------- call CheckEvent()&lt;br /&gt;
--- in a loop&lt;br /&gt;
---- get all completed events via GetLocked() pass them to SendQueue-&amp;gt;PushEvent()&lt;br /&gt;
-- if done nothing, sleep 100 usec, otherwise nominal sleep to free the evb lock&lt;br /&gt;
&lt;br /&gt;
- GetNext() &amp;lt;- GetLocked() &amp;lt;- EvbThread() - get completed events&lt;br /&gt;
-- examine oldest EvbEvent entry in fEvents:&lt;br /&gt;
-- pop it if it is complete&lt;br /&gt;
-- pop it if it is too old (to prevent old incomplete events from stalling the evb) (&amp;quot;pop age&amp;quot; on the evb page)&lt;br /&gt;
-- pop it if a following event is complete (&amp;quot;pop following&amp;quot; on the evb page)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* send queue&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SendQueue class - prepare events for writing to midas SYSTEM event buffer&lt;br /&gt;
&lt;br /&gt;
- PushEvent() &amp;lt;- EvbThread()&lt;br /&gt;
-- push FragmentBuf into the queue&lt;br /&gt;
&lt;br /&gt;
- SendQueueThread()&lt;br /&gt;
-- in a batch of 1000 events, call Tick()&lt;br /&gt;
--- pop FragmentBuf from the queue, call SendEvent()&lt;br /&gt;
--- compose midas event (memcpy()!)&lt;br /&gt;
--- TMFE fEq-&amp;gt;SendEvent()&lt;br /&gt;
--- bm_send_event()&lt;br /&gt;
-- sleep 100 usec&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* equipment object&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EvbEq class - implements the midas equipment&lt;br /&gt;
- HandleBeginRun()&lt;br /&gt;
- HandleEndRun()&lt;br /&gt;
- HandlePeriodic()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== multithreading ===&lt;br /&gt;
&lt;br /&gt;
* BufferReaderThread() one per midas event buffer&lt;br /&gt;
** high CPU use: bm_receive_event(), AddXxxBank()&lt;br /&gt;
** lock contention: midas event buffer lock, evb lock into XFlushBank-&amp;gt;AddBankLocked()&lt;br /&gt;
* EvbThread()&lt;br /&gt;
** O(size of fEvents): FindEvent(), GetNext()&lt;br /&gt;
** lock contention: evb lock against XFlushBank(), SendQueue lock (1 per output event)&lt;br /&gt;
* SendQueueThread()&lt;br /&gt;
** high CPU use: memcpy() in SendEvent(), memcpy() in bm_send_event&lt;br /&gt;
** lock contention: event queue lock against EvbThread, midas event buffer lock&lt;br /&gt;
* main thread&lt;br /&gt;
** lock contention: evb lock in ReportEvb() and elsewhere&lt;br /&gt;
&lt;br /&gt;
= ODB entries =&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings ==&lt;br /&gt;
* TBW&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/Pulser ==&lt;br /&gt;
&lt;br /&gt;
* ClockFreqHz - unit of 1/sec (Hz), set to 62500000, the TRG 62.5 MHz clock frequency (16 ns)&lt;br /&gt;
* PulseWidthClk - unit of 16 ns clocks, set to 25. (400 ns). width of internal pulser signal (used to go to a TRG external output, absent on GRIF-C boards)&lt;br /&gt;
* PulsePeriodClk - unit of 16 ns clocks, pulser in clock periods (+1), set to zero.&lt;br /&gt;
* PulseFreqHz - unit of 1/sec (Hz), requested pulser frequency, actual frequency is rounded to 16 ns clock granularity, change this value to select desired clock frequency&lt;br /&gt;
* BurstCtrl - enable burst of pulses 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses&lt;br /&gt;
* OutputEnable - enable TRG pulser external output (absent on GRIF-C boards)&lt;br /&gt;
* Enable - allow the pulser to run (bit 3 in TRG conf_trig_enable register)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TrigSrc - trigger source selection ==&lt;br /&gt;
* TrigPulser                      - trigger on the pulser&lt;br /&gt;
* TrigEsataNimGrandOr             - trigger on external NIM inputs of GRIF-16 ADC modules&lt;br /&gt;
* TrigAdc16GrandOr                - trigger on any adc16 signals (see adc16_masks)&lt;br /&gt;
* TrigAdc32GrandOr                - trigger on any adc32 signals (see adc32_masks)&lt;br /&gt;
* Trig1ormore                     - trigger on adc16 multiplicity 1 or more&lt;br /&gt;
* Trig2ormore                     - ditto, 2 or more&lt;br /&gt;
* Trig3ormore                     - ditto, 3 or more&lt;br /&gt;
* Trig4ormore                     - ditto, 4 or more&lt;br /&gt;
* TrigAdcGrandOr                  - trigger on any ADC signal&lt;br /&gt;
* TrigAwCoincA                    - trigger on TPC AW coincidence (see [[TRG]] manual)&lt;br /&gt;
* TrigAwCoincB                    - ditto&lt;br /&gt;
* TrigAwCoincC                    - ditto&lt;br /&gt;
* TrigAwCoincD                    - ditto&lt;br /&gt;
* TrigAwCoinc                     - ditto&lt;br /&gt;
* TrigAw1ormore	- trigger on TPC AW per-preamp multiplicity 1 or more (see [[TRG]] manual)&lt;br /&gt;
* TrigAw2ormore	- ditto, 2 or more&lt;br /&gt;
* TrigAw3ormore	- ditto, 3 or more&lt;br /&gt;
* TrigAw4ormore - ditto, 4 or more&lt;br /&gt;
* TrigAwMLU                       - trigger on TPC AW MLU signal (see [[TRG]] manual)&lt;br /&gt;
* TrigBscGrandOr                  - trigger on any BSC signal&lt;br /&gt;
* TrigBscMult                     - trigger on predefined BSC multiplicity (see [[TRG]] manual)&lt;br /&gt;
* TrigCoinc                       - trigger on predefined coincidence of TPC AW, BSC and external signal (see [[TRG]] manual)&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TRG - trigger settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with the trigger board. Normal value &amp;quot;y&amp;quot;&lt;br /&gt;
* Modules - hostnames of the trigger board. Normal value &amp;quot;alphat01&amp;quot;&lt;br /&gt;
* NimMask - 32-bit mask for the 32x NIM inputs (see TRG manual). Normal value 0, unless external trigger is in use.&lt;br /&gt;
* EsataMask - 32-bit mask for the 32x eSATA signals (see TRG manual). Normal value 0.&lt;br /&gt;
* adc16_mask[16] - 16x 16-bit mask for the 100MHz GRIF-16 onboard ADCs (see TRG manual). Normal value 0xFFFF for all 16 data links.&lt;br /&gt;
* adc32_mask[16] - 16x 32-bit mask for the 62.5MHz FMC-ADC32 ADCs (see TRG manual). Normal value 0xFFFFFFFF for all 16 data links.&lt;br /&gt;
* PassThrough - if set to &amp;quot;y&amp;quot;, trigger is passed through the trigger module without generating any events and without causing deadtime.&lt;br /&gt;
* AwCoincA, B, C and D - 32-bit masks for the aw16 coincidence trigger (see TRG manual)&lt;br /&gt;
* Aw16FromAdc16 - route AW trigger (aw16) from adc16 (100MHz ADCs 0..15)&lt;br /&gt;
* Aw16FromAdc32a - route AW trigger (aw16) from adc32 group 15..0 (62.5MHz FMC-ADC32 in ADCs 0..7)&lt;br /&gt;
* Aw16FromAdc32b - route AW trigger (aw16) from adc32 group 31..16 (62.5MHz FMC-ADC32 in ADCs 8..15)&lt;br /&gt;
* MluDir, MluFiles - location of aw16 MLU bit patterns&lt;br /&gt;
* MluSelectedFile - currently selected/loaded MLU file. 0=&amp;quot;grand or&amp;quot;, 1=&amp;quot;2 or more hit clusters&amp;quot;, 2=&amp;quot;2 or more hit clusters, with gap 2 or more&amp;quot;, 3=&amp;quot;3 or more hit clusters&amp;quot;&lt;br /&gt;
* MluPrompt - length of aw16_prompt_run gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluWait - length of aw_prompt_wait gate in units of 8 ns clock, see [[TRG#aw16_mlu]]&lt;br /&gt;
* MluTrigDelayClk - &amp;quot;TrigDelay&amp;quot; when triggered of aw16 MLU, in units of 16 ns clock&lt;br /&gt;
* (BSC settings, TBW)&lt;br /&gt;
* CoincStart - set same as CoincRequire&lt;br /&gt;
* CoincRequire - 0x5: (BSC grand or)*(TPC aw16_1ormore), 0x6: (BSC grand or)*(AW16 MLU), see [[TRG#Coincidence_trigger]] and [[TRG#conf_coinc_control bits]]&lt;br /&gt;
* CoincWindow - length of coincidence window in 8ns clocks.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/PWB - PWB settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will not do anything with PWBs. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_boot_user_page - if set to &amp;quot;n&amp;quot;, fectrl will not try to reboot PWBs into the user page firmware. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger - if set to &amp;quot;n&amp;quot;, all PWBs will be set to ignore the trigger. Normal value &amp;quot;y&amp;quot;.&lt;br /&gt;
* enable_trigger_group_a - field wire pulser defeats the data suppression (every channel has a pulse) resulting in too much data overwhelming the DAQ (lost UDP packets). To permit correct data taking of field wire pulser data, PWBs are split into two groups (a and b), only one of the two groups should be enabled for field wire pulser runs. Both groups should be enabled for normal data taking. Normal value is &amp;quot;y&amp;quot;&lt;br /&gt;
* enable_trigger_group_b - see &amp;quot;enable_trigger_group_a&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* modules[64] - hostnames of PWB boards&lt;br /&gt;
* boot_user_page[64] - if set to &amp;quot;y&amp;quot; and enable_boot_user_page is &amp;quot;y&amp;quot;, fectrl will reboot the corresponding PWB to the user page firmware.&lt;br /&gt;
* trigger[64] - if set to &amp;quot;y&amp;quot; and enable_trigget is &amp;quot;y&amp;quot;, fectrl will set the PWB to accept the trigger.&lt;br /&gt;
* ch_enable - if set to &amp;quot;n&amp;quot; disables all PWB channels. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* ch_force - is set to &amp;quot;y&amp;quot; disables channel suppression (all PWB channels are read)&lt;br /&gt;
* suppress_reset - if set to &amp;quot;y&amp;quot; enables channel suppression for reset channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_fpn - if set to &amp;quot;y&amp;quot; enables channel suppression for fpn channels (threshold has to be set correctly)&lt;br /&gt;
* suppress_pads -  set to &amp;quot;y&amp;quot; enables channel suppression for TPC pad channels (threshold has to be set correctly)&lt;br /&gt;
* disable_reset1 - data suppression algorithm does not work for the channel &amp;quot;reset1&amp;quot; and it has to be suppressed explicitly by setting this value to &amp;quot;y&amp;quot;. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
* baseline_{reset,fpn,pads}[64] - waveform baseline for each PWB position&lt;br /&gt;
* threshold_{reset,fpn,pads} - waveform suppression threshold, see below:&lt;br /&gt;
* ch_threshold - PWB sca_N_ch_threshold, if set to 0, threshold is computed as &amp;quot;baseline_pads[seqpwb]-threshold_pads&amp;quot;. Normal value is 0.&lt;br /&gt;
* test_mode - enable PWB test mode, the ADC data is replaced with a test pattern, see PWB esper variable signalproc/test_mode&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Settings/TDC - TDC settings ==&lt;br /&gt;
* Enable - if set to &amp;quot;n&amp;quot;, fectrl will tell the event builder that the TDC is not running. Normal value is &amp;quot;y&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/Variables ==&lt;br /&gt;
&lt;br /&gt;
* Scalers  - TRG scalers and counters. from fectrl.cxx ReadTrgLocked()&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         // 0..15 read the 16 base scalers at 0x100&lt;br /&gt;
         // 16..31 read the adc16 scalers at 0x430&lt;br /&gt;
         // 32..63 read the adc32 scalers at 0x440&lt;br /&gt;
         // 64..79 read the 16 additional scalers at 0x110&lt;br /&gt;
         // 80..95 read the 16 counters_adc_selected scalers at 0x460&lt;br /&gt;
         // 96..159 read the 64 bar scalers at 0x470&lt;br /&gt;
         // additional scalers should be appended at the end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== /Equipment/CTRL/EvbConfig - EVB configuration ==&lt;br /&gt;
All arrays have the same size corresponding to the number of EVB slots.&lt;br /&gt;
* name[] - slot name for the web page (trg01, adc01, adc01/adc32, pwb31/0, tdc01, etc)&lt;br /&gt;
* type[] - slot type: 1=TRG, 2=ADC16 and ADC32, 3=obsolete PWB, 4=obsolete PWB, 5=PWB, 6=TDC&lt;br /&gt;
* module[] - module number (adcNN, adcNN+100, pwbNN, etc)&lt;br /&gt;
* nbanks[] - number of expected banks (16 for ADC16, 32 for ADC32, not used, set to 1 for all others)&lt;br /&gt;
* tsfreq[] - timestamp frequency in Hz.&lt;br /&gt;
&lt;br /&gt;
== /Equipment/ADC_UDP - ADC UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFADC&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50006 - UDP port number, also used by fectrl to configure the ADC modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200 - udp socket buffer size set by setsockopt(SOL_SOCKET, SO_RCVBUF). must have a corresponding command in /etc/rc.local to increase maximum system socket size: &amp;quot;/usr/sbin/sysctl -w net.core.rmem_max=200000000&amp;quot;&lt;br /&gt;
* Settings/packet_size - 1500 - non-jumbo-frame UDP packet maximum size&lt;br /&gt;
* Settings/max_buffered_packets - 40000 - maximum size of internal packet fifo. If it overflows, extra packets are discarded.&lt;br /&gt;
* Settings/max_packets_per_event - 8000 - how many UDP packets to pack into one midas event== &lt;br /&gt;
&lt;br /&gt;
== /Equipment/PWB_X_UDP - PWB UDP configuration ==&lt;br /&gt;
&lt;br /&gt;
For explanation see ADC_UDP above.&lt;br /&gt;
&lt;br /&gt;
* Common/Buffer - &amp;quot;BUFUDP&amp;quot; - event buffer to use, name is hardwired in feevb.cxx&lt;br /&gt;
* Settings/udp_port - 50007, 50008, 50009, 50010 - for A, B, C and D UDP receivers respectively, also used by fectrl to configure the PWB modules&lt;br /&gt;
* Settings/rcv_bufsize - 209715200&lt;br /&gt;
* Settings/packet_size - 1500&lt;br /&gt;
* Settings/max_buffered_packets - 10000&lt;br /&gt;
* Settings/max_packets_per_event - 8000&lt;br /&gt;
&lt;br /&gt;
= Trigger configuration =&lt;br /&gt;
&lt;br /&gt;
These trigger modes are implemented:&lt;br /&gt;
* (manual trigger from web page)&lt;br /&gt;
* software pulser trigger (from fectrl)&lt;br /&gt;
* hardware pulser trigger (from the trigger board)&lt;br /&gt;
* NIM and eSATA trigger from ADC front panel inputs&lt;br /&gt;
* adc16 and adc32 discriminator triggers:&lt;br /&gt;
** adc16 grand-or trigger&lt;br /&gt;
** adc32 grand-or trigger&lt;br /&gt;
** adc (adc16+adc32) grand-or trigger&lt;br /&gt;
** adc16 multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) for use with barrel scintillator&lt;br /&gt;
** anode wire multiplicity trigger (1ormore, 2ormore, 3ormore, 4ormore) (anode wire signals can be fed from adc16 or from adc32 signals)&lt;br /&gt;
** anode wire coincidence trigger&lt;br /&gt;
** anode wire MLU (memory lookup) trigger&lt;br /&gt;
&lt;br /&gt;
== NIM trigger from ADC front panel ==&lt;br /&gt;
&lt;br /&gt;
Trigger path:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NIM signal --&amp;gt; LEMO input on ADC front panel --&amp;gt; data encoder --&amp;gt; data link to trigger board --&amp;gt; data decoder --&amp;gt; mask --&amp;gt; nim-esata-grand-or --&amp;gt; trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable NIM trigger, do this:&lt;br /&gt;
* connect NIM signal to ADC front panel input&lt;br /&gt;
** Note1: NIM signal must be inverted&lt;br /&gt;
** Note2: LEMO connectors should be set to &amp;quot;NIM input&amp;quot; mode by ADC on-board jumpers (see ADC manual)&lt;br /&gt;
* observe correct bit goes to zero in the TRG web page: data link high work should change:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0xNF00&#039;0000 (N is the module id) to&lt;br /&gt;
0xN700&#039;0000 (left lemo) or&lt;br /&gt;
0xNB00&#039;0000 (right lemo)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note3: if data link bits do not change, most likely the LEMO connectors are set to &amp;quot;DAC output&amp;quot; mode. Try to use LEMO inputs of a different ADC.&lt;br /&gt;
* compute the NIM mask: there are 32 bits, 2 bits per ADC data link. Bit 0x1 is right LEMO, bit 0x2 is left LEMO&lt;br /&gt;
* for example, to use left LEMO of ADC data link 12, set nim mask to (0x2)&amp;lt;&amp;lt;(2*12) = 0x02000000&lt;br /&gt;
* development branch of the git repository contains &#039;&#039;scripts/nim_mask.py&#039;&#039;, which can compute forwards and backwards&lt;br /&gt;
* initialize the trigger board (on the TRG web page press button &amp;quot;initialize&amp;quot;), or start a new run&lt;br /&gt;
* on the history plot with &amp;quot;NIM grand or&amp;quot; counter, the rate should change from zero&lt;br /&gt;
* if a run is active, if one of the ADC LEMO outputs is set to output the trigger signal as a NIM pulse, one should see it fire use a scope. The delay or jitter between NIM trigger in and NIM trigger out should be around 100-200 ns (FIXME - measure this!)&lt;br /&gt;
* to set the DAQ to trigger on the NIM signal, on the run start page, check the box &amp;quot;TrigEsataNimGrandOr&amp;quot;.&lt;br /&gt;
** Note: remember to set the scaledown to 0 if so desired.&lt;br /&gt;
&lt;br /&gt;
= TPC field wire pulser =&lt;br /&gt;
&lt;br /&gt;
The TPC field wire pulser input should be connected directly to the DAC output of ADC[0] (right lemo connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing PWBs, baseline -1V, pulse height +2V (maximum possible pulse height in PWBs. Overdrives the AW ADC waveforms)&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 70&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
* for pulsing AW, baseline -0.25V, pulse height +0.7V (AW ADC waveforms are in range. PWB waveforms are too small for goor time resolution)&lt;br /&gt;
** dac_baseline: -2000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 20&lt;br /&gt;
** ramp_down_rate: 20&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= BSC pulser =&lt;br /&gt;
&lt;br /&gt;
The BSC pulser input on the BSC VME rear transition board (RTM) should be connected directly to the DAC output of ADC[4,5,6,7] (right lemo connector). (8 RTMs, but 4 ADCs, each signal is split using a LEMO &amp;quot;T&amp;quot; connector).&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for pulsing BSC, baseline -0.950V, pulse height +1.4V&lt;br /&gt;
** dac_baseline: -8000&lt;br /&gt;
** dac_amplitude: 4000&lt;br /&gt;
** ramp_up_rate: 64&lt;br /&gt;
** ramp_down_rate: 64&lt;br /&gt;
** ramp_top_len: 128&lt;br /&gt;
&lt;br /&gt;
= NIM output =&lt;br /&gt;
&lt;br /&gt;
To configure ADC analog output for NIM compatible pulse:&lt;br /&gt;
&lt;br /&gt;
DAC settings in ODB /Equipment/CTRL/Settings/ADC/DAC/&lt;br /&gt;
&lt;br /&gt;
* for output of NIM pulse: baseline 0V, pulse height -0.9V, pulse width 100 ns&lt;br /&gt;
** dac_baseline: 0&lt;br /&gt;
** dac_amplitude: 8000&lt;br /&gt;
** ramp_up_rate: 128&lt;br /&gt;
** ramp_down_rate: 128&lt;br /&gt;
** ramp_top_len: 4&lt;br /&gt;
** dac_xor: 1 (invert the signal)&lt;br /&gt;
&lt;br /&gt;
= TDC connections =&lt;br /&gt;
&lt;br /&gt;
* SFP8 - fiber SFP to Juniper switch&lt;br /&gt;
* right RJ45 - 200MHz clock&lt;br /&gt;
* left RJ45 - external trigger&lt;br /&gt;
&lt;br /&gt;
= MIDAS Data banks =&lt;br /&gt;
&lt;br /&gt;
* ATAT - fectrl - UDP packets from GRIF-C/TRG trigger board&lt;br /&gt;
* TRBA - fetdc - TDC data&lt;br /&gt;
* TRTM - fetdc - TDC FPGA temperatures, TID_FLOAT[5].&lt;br /&gt;
* AAnn - feudp - UDP packets from GRIF-16 ADC (before the event builder), &amp;quot;nn&amp;quot; is the ADC module number: adc01 is AA01 through adc20 is AA20.&lt;br /&gt;
* BBxx - feudp - UDP packets from PWB, obsolete&lt;br /&gt;
* Bnnm, Cnnm - feevb - EVB output banks: ADC data, &amp;quot;nn&amp;quot; is the ADC module number (1..20), &amp;quot;m&amp;quot; is the channel number (0..9,A..F), format is same as AAnn banks.&lt;br /&gt;
* PAnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), obsolete&lt;br /&gt;
* PBnn - feudp - UDP packets from PWB, &amp;quot;nn&amp;quot; is the PWB module number (00..99), PB01 is pwb01, PB78 is pwb78&lt;br /&gt;
* PCnn - feevb - EVB output banks: PWB data, &amp;quot;nn&amp;quot; is the PWB module number (00..99), same as above, format is same as PBnn banks&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=940</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=940"/>
		<updated>2022-07-15T19:49:30Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Register addresses */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || conf_pulser_burst_ctrl || RW || 0x62d1bb19 || Generate bursts of pulses: 0xNNTTTTTT, NN=number of pulses, TTTTTT=period between pulses, 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=939</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=939"/>
		<updated>2022-07-15T19:47:11Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* DONE July 2022. add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=938</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=938"/>
		<updated>2022-07-15T19:06:13Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* TODO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* DONE Nov 2021. add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* DONE. test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=937</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=937"/>
		<updated>2022-07-15T19:05:12Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* firmware 0x618b790b */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b (Nov 2021) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=936</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=936"/>
		<updated>2022-07-15T18:56:33Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Register addresses */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11E || counter_coinc_start || ROL || 0x62d1b152 || counter of coincidence windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11F || counter_aw16_mlu_start || ROL || 0x62d1b152 || counter of TPC AW MLU windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=935</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=935"/>
		<updated>2022-07-15T18:44:56Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* bsc64 multiplicity trigger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* conf_bsc64_mult_window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 80 (640 ns).&lt;br /&gt;
* conf_bsc64_mult_min (8 bits): 2&lt;br /&gt;
* conf_bsc64_empty_window (8 bits): 80 (640 ns)&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=934</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=934"/>
		<updated>2022-07-15T18:35:42Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* aw16_mlu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* after the trigger decision is made, we wait for the TPC to become quiet:&lt;br /&gt;
* we wait until all aw16 signals are empty (no timeout)&lt;br /&gt;
* 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.&lt;br /&gt;
* now, after TPC aw16 have been empty for conf_mlu_wait clocks (8ns clock), MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
Good settings are:&lt;br /&gt;
* conf_mlu_prompt: 64 (512 ns)&lt;br /&gt;
* conf_mlu_wait: 128 (1024 ns)&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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). After the window finishes, number of bars with hits is counted and if it satisfies the minimum and maximum multiplicity, bsc64_mult_trig fires.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 60 (480 ns).&lt;br /&gt;
* multiplicity min (8 bits): 2&lt;br /&gt;
* multiplicity max (8 bits): 255&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=933</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=933"/>
		<updated>2022-07-15T18:13:59Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* trigger bitmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* 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.&lt;br /&gt;
* after the TPC has been quiet for conf_mlu_wait time (125MHz/8ns clock), the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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). After the window finishes, number of bars with hits is counted and if it satisfies the minimum and maximum multiplicity, bsc64_mult_trig fires.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 60 (480 ns).&lt;br /&gt;
* multiplicity min (8 bits): 2&lt;br /&gt;
* multiplicity max (8 bits): 255&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&lt;br /&gt;
Firmware ??? (one of the very early revisions)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=932</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=932"/>
		<updated>2022-07-15T18:10:36Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* UDP data format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* 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.&lt;br /&gt;
* after the TPC has been quiet for conf_mlu_wait time (125MHz/8ns clock), the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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). After the window finishes, number of bars with hits is counted and if it satisfies the minimum and maximum multiplicity, bsc64_mult_trig fires.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 60 (480 ns).&lt;br /&gt;
* multiplicity min (8 bits): 2&lt;br /&gt;
* multiplicity max (8 bits): 255&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
== firmware 0x5bc8f90f ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== firmware 0x618b790b ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
1	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
2	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
3	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
4	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
5	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
6	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
7	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
8	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
9	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
10	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
11	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
12	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
13	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
14	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
15	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
16	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
17	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=931</id>
		<title>TRG</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/AgWiki/index.php?title=TRG&amp;diff=931"/>
		<updated>2022-07-11T03:51:26Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Coincidence trigger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TRG, the trigger control board for the ALPHA-g detector =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* xxx&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware - firmware sources on bitbucket&lt;br /&gt;
&lt;br /&gt;
= General characteristics =&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
== Board schematics ==&lt;br /&gt;
&lt;br /&gt;
* https://bitbucket.org/expalpha/trg_firmware/src/master/3xFMC_VME_Motherboard.pdf&lt;br /&gt;
&lt;br /&gt;
== Available hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera Stratix IV - main FPGA&lt;br /&gt;
* Altera Max V - boot FPGA&lt;br /&gt;
* boot flash: PC28F512M29EW - 512 Mbit parallel NOR flash.&lt;br /&gt;
&lt;br /&gt;
= TRG front panel connections =&lt;br /&gt;
&lt;br /&gt;
From top to bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| minisas-C - links 8-11&lt;br /&gt;
| minisas-D - links 12-15&lt;br /&gt;
|&lt;br /&gt;
| ethernet sfp - use copper sfp only&lt;br /&gt;
| minisas - not used, do not connect&lt;br /&gt;
| esata - clock in, trigger out&lt;br /&gt;
|&lt;br /&gt;
| minisas-A - links 0-3&lt;br /&gt;
| minisas-B - links 4-7&lt;br /&gt;
|&lt;br /&gt;
| LEDs&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MiniSAS and SATA flail cable connections:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 &amp;lt;--&amp;gt; link 3&lt;br /&gt;
P2 &amp;lt;--&amp;gt; link 2&lt;br /&gt;
P3 &amp;lt;--&amp;gt; link 1&lt;br /&gt;
P4 &amp;lt;--&amp;gt; link 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEDs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--PCB-- (left)&lt;br /&gt;
LED[0] - trigger out - ag_trig_out&lt;br /&gt;
LED[1] - network packet received - sfp_rx_data_valid&lt;br /&gt;
LED[2] - Xilinx FPGA boot ok - FMC1_CFG_DONE&lt;br /&gt;
LED[3] - not used&lt;br /&gt;
(right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG onboard jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
* rotary switches: select IP address: 00=192.168.1.50, 11=.51, 22=.52, 33=.53, 44=.54, otherwire=.251&lt;br /&gt;
&lt;br /&gt;
= Firmware update procedure =&lt;br /&gt;
&lt;br /&gt;
* use quartus to generate the grifc.pof file (use grifc.cof)&lt;br /&gt;
* open quartus programmer&lt;br /&gt;
* attach grifc.pof to the 1st CFI_512 flash&lt;br /&gt;
* mark program/configure for the same flash (3 marks: pof, page_0 and OPTION_BITS&lt;br /&gt;
* check that &amp;quot;initiate configuration after programming&amp;quot; is set in tools-&amp;gt;options&lt;br /&gt;
* say &amp;quot;start&amp;quot;&lt;br /&gt;
* should take about 5 minutes&lt;br /&gt;
* grifc should reboot into the new firmware&lt;br /&gt;
&lt;br /&gt;
If CFI_512 flash is not visible to the quartus programmer, load correct&lt;br /&gt;
code into the MaxV CPLD:&lt;br /&gt;
&lt;br /&gt;
* open quartus programmer,&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* change file for the 5M2210 device&lt;br /&gt;
* use .../boot/maxv_3xfmc_normal.pof from the firmware git repository&lt;br /&gt;
* say &amp;quot;program&amp;quot;, it should finish in 10-15 seconds&lt;br /&gt;
* say &amp;quot;auto detect&amp;quot;&lt;br /&gt;
* CFI_512 flash should be visible now.&lt;br /&gt;
&lt;br /&gt;
= Firmware revisions =&lt;br /&gt;
&lt;br /&gt;
* 0x5bc8f90f - original firmware used for all data&lt;br /&gt;
* 0x6147c0f9 - added cbtrg, etc. installed at CERN on 20 Sep 2021.&lt;br /&gt;
* 0x618376ae - bigger cbtrg fifo, data rate tested up to 30 Mbytes/sec&lt;br /&gt;
* 0x6189c7f3 - fix loss of trigger packets. (missing fifo between alphag block and ethernet mux)&lt;br /&gt;
* 0x618b790b - fix loss of timestamps. (cbtrg inputs stretched to 100 ns long). installed at CERN 10 Nov 2021.&lt;br /&gt;
&lt;br /&gt;
= Firmware build =&lt;br /&gt;
&lt;br /&gt;
* use quartus 20.1&lt;br /&gt;
* see Makefile in the trg_firmware project&lt;br /&gt;
&lt;br /&gt;
= Jtag remote connection =&lt;br /&gt;
&lt;br /&gt;
* ssh agmini@daq16&lt;br /&gt;
* /opt/intelFPGA/16.1/quartus/bin/jtagd --config /home/agmini/.jtagd.conf&lt;br /&gt;
* netstat -an | grep 1309 ### note listen address is &amp;quot;0.0.0.0&amp;quot;, NOT &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1309            0.0.0.0:*               LISTEN     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* opt/intelFPGA/16.1/quartus/bin/jtagconfig ### should work&lt;br /&gt;
* ssh olchansk@daq01&lt;br /&gt;
* cd git/trg_firmware&lt;br /&gt;
* /opt/intelFPGA/20.1/nios2eds/nios2_command_shell.sh&lt;br /&gt;
* jtagconfig ### should work&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq01:trg_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC on daq16 [2-1.2.3]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) USB-Blaster on daq16 [2-1.3]&lt;br /&gt;
  024090DD   EP4SGX230(.|ES)&lt;br /&gt;
  020A40DD   5M(1270ZF324|2210Z)/EPM2210&lt;br /&gt;
&lt;br /&gt;
daq01:trg_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ALPHA-g trigger functions =&lt;br /&gt;
&lt;br /&gt;
Trigger options:&lt;br /&gt;
* software trigger&lt;br /&gt;
* pulser trigger&lt;br /&gt;
* trigger on GRIF16 ADC NIM and ESATA inputs (&amp;quot;external trigger&amp;quot;)&lt;br /&gt;
* adc16 grand-or&lt;br /&gt;
* adc32 grand-or&lt;br /&gt;
* adc16 wire multiplicity&lt;br /&gt;
* TPC anode wire per-preamp trigger (aw16 section)&lt;br /&gt;
** trigger on coincidences of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on multiplicity of preamps (removed fw 0x62c77f0b)&lt;br /&gt;
** trigger on specific topology of preamps (multiplicity of preamp clusters, etc) via the aw16_mlu trigger&lt;br /&gt;
* BSC trigger&lt;br /&gt;
** BSC grand_or&lt;br /&gt;
** BSC bar multiplicity&lt;br /&gt;
* coincidence trigger - select coincidence of external trigger, TPC AW grand-or, TPC AW MLU, BSC grand-or and BSC bar multiplicity triggers&lt;br /&gt;
&lt;br /&gt;
== software trigger ==&lt;br /&gt;
&lt;br /&gt;
to programmatically fire the trigger, one should:&lt;br /&gt;
* set the conf_enable_sw_trigger bit in conf_trig_enable, this will permit the software trigger to fire the trigger&lt;br /&gt;
* write value 0x4 to register 0x2B, this will cause the software trigger to fire&lt;br /&gt;
&lt;br /&gt;
== pulser trigger ==&lt;br /&gt;
&lt;br /&gt;
To use the pulser trigger, one should program:&lt;br /&gt;
* pulser period (in clocks)&lt;br /&gt;
* 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)&lt;br /&gt;
* set the run_pulser bit in conf_trig_enable, this will cause the pulser to run&lt;br /&gt;
* set the enable_pulser bit in conf_trig_enable, this will cause the pulser to fire the trigger&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== timeout trigger ==&lt;br /&gt;
&lt;br /&gt;
The event builder uses event timestamps to assemble physics events. The timestamps&lt;br /&gt;
are usually 32 bit wide and run at 125 MHz (8 ns) or 62.5 MHz (16 ns). If&lt;br /&gt;
triggers are generated often (1 per second or more), timestamp wrap around&lt;br /&gt;
is easily detected by the event builder. If triggers come infrequently,&lt;br /&gt;
timestamp wrap around may occur while there are no triggers, not be seen&lt;br /&gt;
by the event builder causing loss of event synchronization.&lt;br /&gt;
&lt;br /&gt;
To avoid this problem in the event builder, a timeout trigger should be generated&lt;br /&gt;
if no triggers were generated inside a 10 second interval.&lt;br /&gt;
&lt;br /&gt;
The guaranties that even if all physics triggers temporarily stop for any reason,&lt;br /&gt;
the event builder will stay synchronized. (0.1 Hz timeout trigger frequency).&lt;br /&gt;
&lt;br /&gt;
To enable the timeout trigger:&lt;br /&gt;
* program timeout trigger timeout in reg 0x43 in units of 8 ns clock&lt;br /&gt;
* enable it in bit 23 of [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
== adc16 multiplicity trigger ==&lt;br /&gt;
&lt;br /&gt;
This trigger is intended for use with the barrel scintillator signals connected to adc16 digitizers. It does not work well with TPC AW signals.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Four threshold signals are computed: adc16_mult_1ormore = adc16_mult&amp;gt;=1, 2ormore, 3ormore, 4ormore.&lt;br /&gt;
&lt;br /&gt;
There is a counter for each of these four signals.&lt;br /&gt;
&lt;br /&gt;
Each of these four signals can fire the trigger, see [[#conf_trig_enable bits]].&lt;br /&gt;
&lt;br /&gt;
== TPC anode wire triggers ==&lt;br /&gt;
&lt;br /&gt;
=== aw16 bus ===&lt;br /&gt;
&lt;br /&gt;
TPC Anode Wire trigger is based on the aw16[15:0] (xaw16) bus.&lt;br /&gt;
&lt;br /&gt;
Each bit corresponds to one AW preamp. 16 preamps, 16 bits.&lt;br /&gt;
&lt;br /&gt;
The aw16[15:0] bus can be fed by&lt;br /&gt;
* adc16_or16[15:0] - or16 of 100 MHz ADCs, 16 ADC sas links&lt;br /&gt;
* 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&lt;br /&gt;
* adc32_or16[31:16] - or16 of 62.5 MHz ADCs, ditto, sas links 15..8&lt;br /&gt;
as selected by conf_enable_aw_adc16, conf_enable_aw_adc32a, conf_enable_aw_adc32b in [[#conf_control bits]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
   //           TPC Anode Wire trigger logic (aw16)&lt;br /&gt;
   ///////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
   // map adc signals into aw16&lt;br /&gt;
&lt;br /&gt;
   wire [15:0] 		   aw16 = ({16{conf_enable_aw_adc16}} &amp;amp; adc16_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32a}} &amp;amp; adc32_or16[15:0]) |&lt;br /&gt;
			   ({16{conf_enable_aw_adc32b}} &amp;amp; adc32_or16[31:16]);&lt;br /&gt;
   ...&lt;br /&gt;
   ag_conditioner cond_adc16_or16_0(.clk(clk), .in(aw16[0]), .out(xxaw16[0]));&lt;br /&gt;
   ...&lt;br /&gt;
   xaw16 &amp;lt;= xxaw16;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aw16_grand_or ===&lt;br /&gt;
&lt;br /&gt;
TPC AW &amp;quot;grand or&amp;quot; trigger: use aw16_mult_1ormore (before fw 0x62c77f0b)&lt;br /&gt;
&lt;br /&gt;
(256 anode wires, 16 wires per preamp, 16 preamps, 16 aw16 signals)&lt;br /&gt;
&lt;br /&gt;
=== aw16_mlu ===&lt;br /&gt;
&lt;br /&gt;
TPC AW preamp MLU trigger: the MLU (memory lookup&lt;br /&gt;
table) implements an arbitrary logical function&lt;br /&gt;
to map the 16 aw16 preamp signals into 1 aw16_mlu_trig trigger output.&lt;br /&gt;
&lt;br /&gt;
Description of the aw16 mlu trigger.&lt;br /&gt;
&lt;br /&gt;
In words:&lt;br /&gt;
&lt;br /&gt;
* any aw16 signal starts the aw16_prompt_run gate&lt;br /&gt;
* aw16 signals are collected for the duration of conf_mlu_prompt (125MHz/8ns clock)&lt;br /&gt;
* 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).&lt;br /&gt;
* when this prompt time expires, the MLU looks at the accumulated aw16_prompt bit pattern and makes the &amp;quot;yes/no&amp;quot; trigger decision&lt;br /&gt;
* 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.&lt;br /&gt;
* after the TPC has been quiet for conf_mlu_wait time (125MHz/8ns clock), the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
In logic: (see alphag.v)&lt;br /&gt;
&lt;br /&gt;
* aw16_or &amp;lt;= grand-or of 16 aw16 signals&lt;br /&gt;
* &amp;quot;aw16_or&amp;quot; starts the &amp;quot;aw16_prompt_cnt&amp;quot; counter, opens the aw16_prompt_run gate&lt;br /&gt;
* during the aw16_prompt_run gate, aw16_prompt collects (latches) the aw16 bits (aw16_prompt &amp;lt;= aw16_prompt | aw16)&lt;br /&gt;
* this is the time when we wait for all &amp;quot;prompt&amp;quot; signals from the TPC to arrive into the trigger&lt;br /&gt;
* 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&lt;br /&gt;
* this is the MLU trigger &amp;quot;yes/no&amp;quot; trigger decision.&lt;br /&gt;
* after the MLU trigger decision is made, we wait for the arrival and passing of all TPC drift signals&lt;br /&gt;
* the aw16_prompt_wait_cnt and aw_prompt_wait gate opens&lt;br /&gt;
* if any new aw16 signals arrive (they are TPC drift signals at this time), the aw16_prompt_wait gate is restarted&lt;br /&gt;
* if no aw16 signals arrive during the full run of the aw16_prompt_wait gate (&amp;quot;TPC quiet time&amp;quot;)&lt;br /&gt;
* the aw16_prompt_wait and aw16_prompt gates are cleared and the MLU trigger is ready for the next event.&lt;br /&gt;
&lt;br /&gt;
== BSC trigger ==&lt;br /&gt;
&lt;br /&gt;
=== bsc_adc16 bus ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
bsc_adc16 can be fed only from GRIF-16 100 MHz ADC trigger discriminators.&lt;br /&gt;
&lt;br /&gt;
=== bsc64_top and bsc64_bot buses ===&lt;br /&gt;
&lt;br /&gt;
* firmware 0x5bc8f90f: bsc_adc16 is remapped into 64 bits of top (bsc64_top) and bottom (bsc64_bot):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ag_bsc_remap bsc_remap_a(.adc(bsc_adc16[0]), .bsc_bot(bsc64_bot[7:0]), .bsc_top(bsc64_top[7:0]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
   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]));&lt;br /&gt;
&lt;br /&gt;
module ag_bsc_remap&lt;br /&gt;
  (&lt;br /&gt;
   input wire [15:0]  adc,&lt;br /&gt;
   output wire [7:0]  bsc_bot,&lt;br /&gt;
   output wire [7:0]  bsc_top&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[3] = adc[0];&lt;br /&gt;
   assign bsc_top[2] = adc[1];&lt;br /&gt;
   assign bsc_top[1] = adc[2];&lt;br /&gt;
   assign bsc_top[0] = adc[3];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_top[7] = adc[4];&lt;br /&gt;
   assign bsc_top[6] = adc[5];&lt;br /&gt;
   assign bsc_top[5] = adc[6];&lt;br /&gt;
   assign bsc_top[4] = adc[7];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[0] = adc[8];&lt;br /&gt;
   assign bsc_bot[1] = adc[9];&lt;br /&gt;
   assign bsc_bot[2] = adc[10];&lt;br /&gt;
   assign bsc_bot[3] = adc[11];&lt;br /&gt;
&lt;br /&gt;
   assign bsc_bot[4] = adc[12];&lt;br /&gt;
   assign bsc_bot[5] = adc[13];&lt;br /&gt;
   assign bsc_bot[6] = adc[14];&lt;br /&gt;
   assign bsc_bot[7] = adc[15];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc64 bus ===&lt;br /&gt;
&lt;br /&gt;
the bsc64 bus is the 64 bars used by the trigger, formed from bsc64_top and bsc64_bot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (conf_bsc64_bot_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot;&lt;br /&gt;
      end else if (conf_bsc64_top_only) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_or) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot | bsc64_top;&lt;br /&gt;
      end else if (conf_bsc64_bot_top_and) begin&lt;br /&gt;
	 bsc64 &amp;lt;= bsc64_bot &amp;amp; bsc64_top;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc64 &amp;lt;= 64&#039;b0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== bsc_grand_or_trig ===&lt;br /&gt;
&lt;br /&gt;
bsc_grand_or_trig is the grand-or of 64 bits of the bsc64 bus&lt;br /&gt;
&lt;br /&gt;
to enable triggering on bsc_grand_or_trig, set corresponding bit in [[#conf_trig_enable bits]]&lt;br /&gt;
&lt;br /&gt;
=== old bsc_mult_trig ===&lt;br /&gt;
&lt;br /&gt;
(from fw 0x62c77f0b, old bsc_mult_trig was replaced by new bsc64 multiplicity trigger)&lt;br /&gt;
&lt;br /&gt;
* bsc64_mult is computed as multiplicity of the bsc64 bus (number of 64 bsc64 bits that fired)&lt;br /&gt;
* bsc_mult_trig is computed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      if (bsc64_mult &amp;gt;= conf_bsc64_mult) begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 1;&lt;br /&gt;
      end else begin&lt;br /&gt;
	 bsc_mult_trig &amp;lt;= 0;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=== bsc64 multiplicity trigger ===&lt;br /&gt;
&lt;br /&gt;
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). After the window finishes, number of bars with hits is counted and if it satisfies the minimum and maximum multiplicity, bsc64_mult_trig fires.&lt;br /&gt;
&lt;br /&gt;
recommended values:&lt;br /&gt;
* window (8 bits): slightly longer than 3 cycles of SAS link: 3*18 = 54 clocks, good value is 60 (480 ns).&lt;br /&gt;
* multiplicity min (8 bits): 2&lt;br /&gt;
* multiplicity max (8 bits): 255&lt;br /&gt;
&lt;br /&gt;
== Coincidence trigger ==&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger provides a combination of TPC, BSC and external scintillator (esata_nim_grand_or) signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign coinc_input[0] = aw16_grand_or; // was aw16_mult_1ormore;&lt;br /&gt;
   assign coinc_input[1] = aw16_mlu_trig;&lt;br /&gt;
   assign coinc_input[2] = bsc_grand_or_trig;&lt;br /&gt;
   assign coinc_input[3] = bsc_mult_trig;&lt;br /&gt;
   assign coinc_input[4] = esata_nim_grand_or;&lt;br /&gt;
   assign coinc_input[5] = 0;&lt;br /&gt;
   assign coinc_input[6] = 0;&lt;br /&gt;
   assign coinc_input[7] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;start&amp;quot; mask selects which of the inputs can start the coincidence window.&lt;br /&gt;
&lt;br /&gt;
Coincidence trigger &amp;quot;require&amp;quot; mask selects which inputs must have a hits for the coincidence ot be satisfied.&lt;br /&gt;
&lt;br /&gt;
Input hits are collected for the duration of the coincidence window, if all required inputs have hits, coinc_trig is fired.&lt;br /&gt;
&lt;br /&gt;
Example settings:&lt;br /&gt;
&lt;br /&gt;
* coincidence of external scintillator, BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x10, required 0x15&lt;br /&gt;
* coincidence of BSC and TPC AW &amp;quot;grand or&amp;quot; signals: start 0x4, required 0x5&lt;br /&gt;
* coincidence of BSC and TPC AW MLU triggers: start 0x4, required 0x6&lt;br /&gt;
* coincidence of BSC multiplicity and TPC AW MLU triggers: start 0x8, required 0xA&lt;br /&gt;
&lt;br /&gt;
= Control registers =&lt;br /&gt;
&lt;br /&gt;
== Register addresses ==&lt;br /&gt;
&lt;br /&gt;
Note: all registers are 32 bits unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
Note: RW means read-write register, RO means read-only, ROL means read-only, contents is latched by the &amp;quot;latch_out&amp;quot; bit&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Address || Quartus Name || Access || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || num_sample || RW || GRIF-C || magic 16-bit register to control UDP packet size&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || scratch_reg || RW || 0x618b790b || 32-bit scratch register&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || compilation_time || RO || || Firmware revision&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || conf_trig_width || RW || || Trigger signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || conf_busy_width || RW || || Busy signal width, 16 ns clock (not used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || conf_pulser_width || RW || || Pulser signal width, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || conf_pulser_period || RW || || Pulser signal period, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || conf_trig_enable || RW || || see [[#conf_trig_enable bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || || || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || conf_nim_mask || RW || || enable bits for ADC NIM inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || conf_esata_mask || RW || || enable bits for ADC eSATA inputs, 2 bits per ADC sas link, 16 links&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || reset_out, latch_out, trigger_out || W || || see [[#reg 0x2B bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x5bc8f90f || configure AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || conf_aw16_coinc_a || RW || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || conf_aw16_coinc_b || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || conf_aw16_coinc_c || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || conf_aw16_coinc_d || RW || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || sas_sd[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect for each link&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || clk_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the system 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || clk_625_counter || ROL || 0x5b2057f5 (12Jun18_16:32) || frequency counter of the currently selected 62.5 MHz clock (my_clk_625)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || conf_control || RW || 0x5b398983 (01Jul18_19:10) || see [[#conf_control bits]] below&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || conf_drift_width || RW || 0x5b398983 (01Jul18_19:10) || width of drift time blank-out in 16 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || conf_scaledown || RW || 0x5b398983 (01Jul18_19:10) || trigger scaledown, 0=no scaledown, 1=divide-by-2, 2=divide-by-3, etc&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || conf_mlu || RW || 0x5b398983 (01Jul18_19:10) || AW MLU control bits, see [[#conf_mlu bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || conf_trig_delay || RW || 0x5baedfca (28Sep18_19:13) || delay the trigger pulse, 16 ns clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || esata_clk_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the TRG 125 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || esata_clk_esata_counter || ROL || 0x5baedfca (28Sep18_19:13) || frequency counter of the external clock (eSATA 62.5 MHz clock)&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || sysreset_ts || RO || 0x5bb7f6ae (05Oct18_16:41) || 125MHz counter of VME-SYSRESET&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr &amp;amp; ~par_value; // Selective clear&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || GRIF-C csr || RW || GRIF-C || &amp;lt;= csr |  par_value; // Selective set&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F || GRIF-C csr || RW || GRIF-C || &amp;lt;= par_value; // write&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F ||  ||  || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || conf_bsc_control || RW || 0x5bc13541 (12Oct18_16:58) || Barrel Scintillator trigger control, see [[#conf_bsc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || conf_coinc_control || RW || 0x5bc13541 (12Oct18_16:58) || Coincidence trigger control, see [[#conf_coinc_control bits]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || reconfig_out || WO || 0x5bc13541 (12Oct18_16:58) || reserved for rebooting the FPGA (does not work)&lt;br /&gt;
|-&lt;br /&gt;
| 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]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || eth_clk_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || eth_clk_eth_counter || ROL || 0x618b790b ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || ts_625 || ROL || || latched timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || counter_trig_out || ROL || || counter of issued triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || counter_trig_in || ROL || || counter of triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || counter_pulser || ROL || || counter of pulser&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || counter_adc16_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x105 || counter_adc32_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || counter_adc_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x107 || counter_esata_nim_grand_or || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || counter_adc16_mult_1ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || counter_adc16_mult_2ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10A || counter_adc16_mult_3ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10B || counter_adc16_mult_4ormore || ROL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x5bc8f90f || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x10C || counter_aw16_coinc_a || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10D || counter_aw16_coinc_b || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10E || counter_aw16_coinc_c || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10F || counter_aw16_coinc_d || ROL || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || counter_drift || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the drift time blank-out&lt;br /&gt;
|-&lt;br /&gt;
| 0x111 || counter_scaledown || ROL || 0x5b398983 (01Jul18_19:10) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| 0x112 || counter_aw16_coinc || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x113 || counter_aw16_mlu || ROL || 0x5b398983 (01Jul18_19:10) || counter of AW MLU triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_grand_or || ROL || 0x62c77f0b || counter of AW grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x114 || counter_aw16_mult_1ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 1ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 2ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x115 || counter_aw16_mult_2ormore || ROL || 0x62c77f0b || removed&lt;br /&gt;
|-&lt;br /&gt;
| 0x116 || counter_aw16_mult_3ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 3ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x117 || counter_aw16_mult_4ormore || ROL || 0x5bb7f6ae (05Oct18_16:41) || counter of AW 4ormore triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || counter_bsc_grand_or || ROL || 0x5bc13541 (12Oct18_16:58) || counter of BSC grand-or triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x119 || counter_bsc_mult || ROL || 0x5bc13541 (12Oct18_16:58) || counter of old BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A || counter_coinc || ROL || 0x5bc13541 (12Oct18_16:58) || counter of coincidence triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11B || counter_timeout || ROL || 0x618b790b || counter of timeout triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x11C || counter_bsc_mult_start || ROL || 0x62c77f0b || counter of BSC multiplicity windows&lt;br /&gt;
|-&lt;br /&gt;
| 0x11D || counter_bsc_mult_trig || ROL || 0x62c77f0b || counter of BSC multiplicity triggers&lt;br /&gt;
|-&lt;br /&gt;
| 0x200..0x207 || conf_adc16_masks || RW || all || adc16 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x300..0x30F || conf_adc32_masks || RW || all || adc32 enable bits&lt;br /&gt;
|-&lt;br /&gt;
| 0x400..0x41F || sas_bits[15:0][63:0] || ROL || all || sas data bits for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x420..0x42F || sas_sd_counters[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || sas signal detect counter for each link&lt;br /&gt;
|-&lt;br /&gt;
| 0x430..0x43F || counters_adc16_or16[15:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 16 counters of adc16 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x440..0x45F || counters_adc32_or16[31:0] || ROL || 0x5b120c9f (01Jun18_20:18) || 32 counters of adc32 ORes&lt;br /&gt;
|-&lt;br /&gt;
| 0x460..0x46F || counters_adc_selected[15:0] || ROL || 0x5bb7f6ae (05Oct18_16:41) || 16 counters for selected group of adcs, see conf_counter_adc_select&lt;br /&gt;
|-&lt;br /&gt;
| 0x470..0x4AF || counters_bsc64[63:0] || ROL || 0x5bc13541 (12Oct18_16:58) || 64 counters for the BSC bars&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== additional registers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | rw/ro | quartus name | firmware | description&lt;br /&gt;
0x60:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_control_out&lt;br /&gt;
0x61:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_status&lt;br /&gt;
0x62:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_a_out };&lt;br /&gt;
0x63:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_invert_b_out };&lt;br /&gt;
0x64:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_a_out };&lt;br /&gt;
0x65:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_le_b_out };&lt;br /&gt;
0x66:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_a_out };&lt;br /&gt;
0x67:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_enable_te_b_out };&lt;br /&gt;
0x6A | ro | cb_input_num | 0x618b790b | chronobox number of inputs&lt;br /&gt;
0x6B:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_a_out };&lt;br /&gt;
0x6C:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_mask_b_out };&lt;br /&gt;
0x6D:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_reg_out };&lt;br /&gt;
0x6E:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_sync_status };&lt;br /&gt;
0x6F:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_latch_period_out };&lt;br /&gt;
0x70:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_status };&lt;br /&gt;
0x71:  begin param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_fifo_data }; cb_fifo_rdack_out &amp;lt;= 1; end&lt;br /&gt;
0x72:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_period_out };&lt;br /&gt;
0x73:  param_out &amp;lt;= {2&#039;h3, par_id, chan,     cb_udp_threshold_out };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== conf_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_clock_select || 0x5b3aa19f (02Jul18_15:05) || select 0=internal 62.5 MHz clock or 1=esata 62.5 MHz clock&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_aw_adc16 || 0x5baedfca (28Sep18_19:13) || select source of TPC AW aw16 bus, see [[#aw16 bus]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_enable_aw_adc32a || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|- &lt;br /&gt;
| 3 || conf_enable_aw_adc32b || 0x5baedfca (28Sep18_19:13) ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..4 || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_mlu_prompt || 0x5b3aa19f (02Jul18_15:05) || MLU trigger prompt window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_mlu_wait || 0x5b3aa19f (02Jul18_15:05) || MLU trigger wait window, see [[#aw16_mlu]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_mlu bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || mlu_reset || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 30 || mlu_write || 0x5b3aa19f (02Jul18_15:05) || 1=write data bit into given address&lt;br /&gt;
|-&lt;br /&gt;
| 16 || mlu_data || 0x5b3aa19f (02Jul18_15:05) || data bit for writing to MLU RAM&lt;br /&gt;
|-&lt;br /&gt;
| 15..0 || mlu_write_addr || 0x5b3aa19f (02Jul18_15:05) || MLU RAM write address for writing the data bit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_bsc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_bsc_adc_a || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 0..7&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_bsc_adc_b || 0x5bc13541 (12Oct18_16:58) || enable mapping of BSC ADCs to ADC links 8..15&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_bsc64_bot_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses bottom channels only&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_bsc64_top_only || 0x5bc13541 (12Oct18_16:58) || bsc64 uses top channels only&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_bsc64_bot_top_or || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;or&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_bsc64_bot_top_and || 0x5bc13541 (12Oct18_16:58) || bsc64 uses &amp;quot;and&amp;quot; of top and bottom&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_bsc64_mult_min || 0x5bc13541 (12Oct18_16:58) || minimum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_bsc64_mult_max || 0x62c77f0b || maximum bsc64 multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 || conf_bsc64_mult_window || 0x62c77f0b || bsc64 multiplicity window length, 8 ns clocks&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_coinc_control bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mult_1ormore&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_coinc_required[0] || 0x62c77f0b || enable aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_coinc_required[1] || 0x5bc13541 (12Oct18_16:58) || enable aw16_mlu_trig&lt;br /&gt;
|-&lt;br /&gt;
| 2 || conf_coinc_required[2] || 0x5bc13541 (12Oct18_16:58) || enable bsc_grand_or_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x5bc13541 (12Oct18_16:58) || enable bsc_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_coinc_required[3] || 0x62c77f0b || enable bsc64_mult_trig&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_coinc_required[4] || 0x5bc13541 (12Oct18_16:58) || enable esata_nim_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15..8 || conf_coinc_window[7:0] || 0x5bc13541 (12Oct18_16:58) || coincidence window length in units of 125MHz clock (8 ns)&lt;br /&gt;
|-&lt;br /&gt;
| 23..16 || conf_coinc_start[7:0] || 0x5bc13541 (12Oct18_16:58) || start the coincidence window, same bits as &amp;quot;required&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 31..24 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== conf_trig_enable bits ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || conf_enable_sw_trigger || || trigger on software trigger (how generated???)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || conf_enable_pulser || || trigger on pulser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || - || 0x5b120c9f (01Jun18_20:18) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 3 || conf_pulser_run || || allow the pulser to run (frequency has to be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || conf_output_pulser || 0x5bc8f90f || does nothing (top level ag_pulser_out is disconnected)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || || 0x618b790b || not used&lt;br /&gt;
|-&lt;br /&gt;
| 5 || conf_enable_esata_nim || || trigger on ESATA and NIM grand-or (esata and nim masks should be set beforehand)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || conf_enable_adc16 || || trigger on adc16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 7 || conf_enable_adc32 || || trigger on adc32_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 8 || conf_enable_adc16_1ormore || || trigger on adc16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 9 || conf_enable_adc16_2ormore || || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 10 || conf_enable_adc16_3ormore || || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 11 || conf_enable_adc16_4ormore || || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || 0x5b08938c (25May18_15:51) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 13 || conf_enable_udp || 0x5a7a3fbd (06Feb18_15:52) || enable sending UDP packets&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || 0x5bc8f90f || not used&lt;br /&gt;
|-&lt;br /&gt;
| 15 || conf_enable_adc || 0x5b120c9f (01Jun18_20:18) || trigger on adc_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 16 || conf_enable_aw16_coinc_a || 0x5bc8f90f || enable AW coincidence trigger, see [[#aw16_coinc]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || - || 0x62c77f0b || aw16_coinc_x removed&lt;br /&gt;
|-&lt;br /&gt;
| 17 || conf_enable_aw16_coinc_b || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || conf_enable_aw16_coinc_c || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || conf_enable_aw16_coinc_d || 0x5bc8f90f ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || - || 0x5b3aa19f (02Jul18_15:05) || not used&lt;br /&gt;
|-&lt;br /&gt;
| 20 || conf_enable_aw16_grand_or || 0x618b790b || enable trigger on aw16_grand_or&lt;br /&gt;
|-&lt;br /&gt;
| 21 || conf_enable_aw16_coinc || 0x5b3aa19f (02Jul18_15:05) || enable trigger on aw16_coinc_trig&lt;br /&gt;
|-&lt;br /&gt;
| 22 || conf_enable_aw16_mlu || 0x5b3aa19f (02Jul18_15:05) || enable AW MLU trigger&lt;br /&gt;
|-&lt;br /&gt;
| 23 || conf_enable_timeout_trig || 0x5bc8f90f (18Oct18_14:20) || enable trigger timeout trigger&lt;br /&gt;
|-&lt;br /&gt;
| 24 || conf_enable_aw16_1ormore || 0x5b3aa19f (02Jul18_15:05) || trigger on aw16_mult_1ormore &amp;quot;1 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 24 || - || 0x62c77f0b || aw16_mult_xxx removed&lt;br /&gt;
|-&lt;br /&gt;
| 25 || conf_enable_aw16_2ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;2 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 26 || conf_enable_aw16_3ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;3 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 27 || conf_enable_aw16_4ormore || 0x5b3aa19f (02Jul18_15:05) || same, &amp;quot;4 or more&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 28 || conf_enable_bsc_grand_or || 0x5bc13541 (12Oct18_16:58) || trigger on BSC grand-or&lt;br /&gt;
|-&lt;br /&gt;
| 29 || conf_enable_bsc_mult || 0x5bc13541 (12Oct18_16:58) || trigger on BSC multiplicity&lt;br /&gt;
|-&lt;br /&gt;
| 30 || conf_enable_coinc || 0x5bc13541 (12Oct18_16:58) || trigger on TPC/BSC/ext coincidence trigger&lt;br /&gt;
|-&lt;br /&gt;
| 31 || - || || not used&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== reg 0x2B bits ==&lt;br /&gt;
&lt;br /&gt;
Write to this register will pulse corresponding fpga signals:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit || Quartus Name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || reset_out || 0x5b120c9f (01Jun18_20:18) || reset counters, etc&lt;br /&gt;
|-&lt;br /&gt;
| 1 || latch_out || 0x5b120c9f (01Jun18_20:18) || latch counters, sas bits, etc&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger_out || 0x5b120c9f (01Jun18_20:18) || generate a software trigger&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= UDP data format =&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Offset || Name || Quartus name || FwRev || Description&lt;br /&gt;
|-&lt;br /&gt;
| 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&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8 packet header || || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
| 2 || trigger timestamp || trig_ts || all || 62.5MHz trigger timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 3 || accepted triggers || counter_trig_out || all || counter of accepted triggers&lt;br /&gt;
|-&lt;br /&gt;
| 4 || input triggers || counter_trig_in || all || counter of trigger input&lt;br /&gt;
|-&lt;br /&gt;
| 5 || pulser triggers || counter_pulser || all || counter of pulser triggers&lt;br /&gt;
|-&lt;br /&gt;
| 6 || trigger bitmap || udp_trig_bits || 0x5a48448d (30Dec17_17:59) || bitmap of trigger information, see below&lt;br /&gt;
|-&lt;br /&gt;
| 7 || nim bits || udp_nim_bits_masked || ??? || 32 bits of ADC NIM inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || esata bits || udp_esata_bits_masked || ??? || 32 bits of ADC ESATA inputs (2 bits per ADC)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || mlu bits || aw16_prompt || 0x5b398983 (01Jul18_19:10) || 16 bits of MLU input, 1 bit per preamp&lt;br /&gt;
|-&lt;br /&gt;
| 10 || drift-blank-off counter || udp_drift_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the drift blank-off&lt;br /&gt;
|-&lt;br /&gt;
| 11 || scaledown counter || udp_scaledown_counter || 0x5b3aa19f (02Jul18_15:05) || counter of triggers that passed the scaledown&lt;br /&gt;
|-&lt;br /&gt;
| X ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 12 || 0xE packet footer ||  || all || 28 bits of counter_trig_out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	   udp_data_out  &amp;lt;= {4&#039;h8,udp_counter_trig_out[27:0]};&lt;br /&gt;
	   udp_data_out &amp;lt;= udp_trig_ts_625;&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_counter_trig_out;&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_counter_trig_in;&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_counter_pulser;&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_trig_bits;&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_nim_bits;&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_esata_bits;&lt;br /&gt;
	   udp_data_out  &amp;lt;= { udp_aw16_mlu_out, 7&#039;h00, 8&#039;h00, udp_aw16_prompt[15:0]};&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_counter_drift;&lt;br /&gt;
	   udp_data_out  &amp;lt;= udp_counter_scaledown;&lt;br /&gt;
	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_adc16_mult[7:0], 16&#039;h0000 };&lt;br /&gt;
	   udp_data_out  &amp;lt;= { 8&#039;h00, udp_aw16_mult[7:0], udp_aw16_bus[15:0]};&lt;br /&gt;
	   udp_data_out  &amp;lt;= { udp_bsc64_bus[31:0]};&lt;br /&gt;
	   udp_data_out  &amp;lt;= { udp_bsc64_bus[63:32]};&lt;br /&gt;
	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_bsc64_mult[7:0] };&lt;br /&gt;
	   udp_data_out  &amp;lt;= { 8&#039;h00, 8&#039;h00, 8&#039;h00, udp_coinc_latch[7:0] };&lt;br /&gt;
	   udp_data_out  &amp;lt;= {4&#039;hE,udp_counter_trig_out[27:0]};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== trigger bitmap ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= adc16_coinc_top;&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= adc16_coinc_bot;&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= adc16_coinc;&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= adc16_coinc_dff[15:0];&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b08938c (25May18_15:51)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= mult16[7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b217dc4 (13Jun18_13:25)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= 0;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5b3aa19f (02Jul18_15:05)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              udp_trig_bits[0] &amp;lt;= adc16_grand_or;&lt;br /&gt;
              udp_trig_bits[1] &amp;lt;= adc32_grand_or;&lt;br /&gt;
              udp_trig_bits[2] &amp;lt;= adc_grand_or;&lt;br /&gt;
              udp_trig_bits[3] &amp;lt;= esata_nim_grand_or;&lt;br /&gt;
              udp_trig_bits[4] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[5] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[6] &amp;lt;= 0; // not used&lt;br /&gt;
              udp_trig_bits[7] &amp;lt;= udp_mlu_out;&lt;br /&gt;
              udp_trig_bits[23:8] &amp;lt;= xadc16_or16[15:0]; // 16x AW preamps hits&lt;br /&gt;
              udp_trig_bits[31:24] &amp;lt;= xadc16_or16_mult[7:0]; // 16x AW preamp multiplicity (sum of xadc16_or16 bits)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x5bc8f90f (18Oct18_14:20)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_run_pulser&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = 0; // not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x618b790b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firmware 0x62c77f0b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   udp_trig_bits  &amp;lt;= trig32_in;&lt;br /&gt;
   assign trig32_in[0]  = sw_trigger; // software trigger&lt;br /&gt;
   assign trig32_in[1]  = 0; // not used pulser trigger&lt;br /&gt;
   assign trig32_in[2]  = 0; // not used conf_enable_sas_or&lt;br /&gt;
   assign trig32_in[3]  = 0; // not used conf_pulser_run&lt;br /&gt;
   assign trig32_in[4]  = 0; // not used conf_output_pulser&lt;br /&gt;
   assign trig32_in[5]  = esata_nim_grand_or;&lt;br /&gt;
   assign trig32_in[6]  = adc16_grand_or;&lt;br /&gt;
   assign trig32_in[7]  = adc32_grand_or;&lt;br /&gt;
   assign trig32_in[8]  = adc16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[9]  = adc16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[10] = adc16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[11] = adc16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[12] = 0; // not used conf_enable_adc16_coinc&lt;br /&gt;
   assign trig32_in[13] = 0; // not used conf_enable_udp&lt;br /&gt;
   assign trig32_in[14] = 0; // not used conf_enable_busy&lt;br /&gt;
   assign trig32_in[15] = adc_grand_or;&lt;br /&gt;
   assign trig32_in[16] = 0; // aw16_coinc_a;&lt;br /&gt;
   assign trig32_in[17] = 0; // aw16_coinc_b;&lt;br /&gt;
   assign trig32_in[18] = 0; // aw16_coinc_c;&lt;br /&gt;
   assign trig32_in[19] = 0; // aw16_coinc_d;&lt;br /&gt;
   assign trig32_in[20] = aw16_grand_or; // was not used conf_clock_select&lt;br /&gt;
   assign trig32_in[21] = aw16_coinc_trig;&lt;br /&gt;
   assign trig32_in[22] = aw16_mlu_trig;&lt;br /&gt;
   assign trig32_in[23] = timeout_trig;&lt;br /&gt;
   assign trig32_in[24] = 0; // aw16_mult_1ormore;&lt;br /&gt;
   assign trig32_in[25] = 0; // aw16_mult_2ormore;&lt;br /&gt;
   assign trig32_in[26] = 0; // aw16_mult_3ormore;&lt;br /&gt;
   assign trig32_in[27] = 0; // aw16_mult_4ormore;&lt;br /&gt;
   assign trig32_in[28] = bsc_grand_or_trig;&lt;br /&gt;
   assign trig32_in[29] = bsc64_mult_trig;&lt;br /&gt;
   assign trig32_in[30] = coinc_trig;&lt;br /&gt;
   assign trig32_in[31] = 0; // not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TRG chronobox inputs =&lt;br /&gt;
&lt;br /&gt;
from trg_firmware/toplevel/grifc.v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   localparam CB_N = 23;&lt;br /&gt;
   localparam CB_N1 = CB_N-1;&lt;br /&gt;
&lt;br /&gt;
   wire [CB_N1:0]    cb_xinputs_async;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[0] = ag_trig_out;&lt;br /&gt;
   assign cb_xinputs_async[1] = ag_trig_scaledown_out;&lt;br /&gt;
   assign cb_xinputs_async[2] = ag_trig_drift_out;&lt;br /&gt;
   assign cb_xinputs_async[3] = ag_trig_received_out;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[4] = ag_cb_sw_trig;&lt;br /&gt;
   assign cb_xinputs_async[5] = ag_cb_pulser_trig;&lt;br /&gt;
   assign cb_xinputs_async[6] = ag_cb_esata_nim_trig;&lt;br /&gt;
   assign cb_xinputs_async[7] = ag_cb_adc16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[8] = ag_cb_adc32_grand_or_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[9] = ag_cb_aw16_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[10] = ag_cb_aw16_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[11] = ag_cb_aw16_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[12] = ag_cb_aw16_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[13] = ag_cb_aw16_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[14] = ag_cb_aw16_mlu_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[15] = ag_cb_bsc64_grand_or_trig;&lt;br /&gt;
   assign cb_xinputs_async[16] = ag_cb_bsc64_mult_1ormore;&lt;br /&gt;
   assign cb_xinputs_async[17] = ag_cb_bsc64_mult_2ormore;&lt;br /&gt;
   assign cb_xinputs_async[18] = ag_cb_bsc64_mult_3ormore;&lt;br /&gt;
   assign cb_xinputs_async[19] = ag_cb_bsc64_mult_4ormore;&lt;br /&gt;
   assign cb_xinputs_async[20] = ag_cb_bsc64_mult_trig;&lt;br /&gt;
   &lt;br /&gt;
   assign cb_xinputs_async[21] = ag_cb_coinc_trig;&lt;br /&gt;
&lt;br /&gt;
   assign cb_xinputs_async[22] = ag_cb_timeout_trig;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example UDP packets =&lt;br /&gt;
&lt;br /&gt;
* trigger data, marker words 0x8&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 76&lt;br /&gt;
  0: 0x003666ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0x80000bf8 -- 0x8 is trigger data packet, 0xbf8 is the trigger counter from alphag.v&lt;br /&gt;
  2: 0x2edf8b41 -- trigger data&lt;br /&gt;
  3: 0x00000bf8&lt;br /&gt;
  4: 0x00000bf8&lt;br /&gt;
  5: 0x00000bee&lt;br /&gt;
  6: 0x00000001&lt;br /&gt;
  7: 0x00000000&lt;br /&gt;
  8: 0x00000000&lt;br /&gt;
  9: 0x00000003&lt;br /&gt;
 10: 0x00000bf8&lt;br /&gt;
 11: 0x00000bf8&lt;br /&gt;
 12: 0x00000000&lt;br /&gt;
 13: 0x00000000&lt;br /&gt;
 14: 0x00000000&lt;br /&gt;
 15: 0x00000000&lt;br /&gt;
 16: 0x00000000&lt;br /&gt;
 17: 0x00000000&lt;br /&gt;
 18: 0xe0000bf8 -- 0xE is end of trigger data, counter 0xbf8 must match the counter in the 0x8 word.&lt;br /&gt;
ReadDataThread read 76 -- next packet&lt;br /&gt;
  0: 0x003666ee -- UDP packet counter from UDP transmitter&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* chronobox fifo data, marker word 0xC, see [[Chronobox#FIFO_data_format]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReadDataThread read 404&lt;br /&gt;
  0: 0x003658ed -- UDP packet counter from UDP transmitter&lt;br /&gt;
  1: 0xc000eacc -- 0xC is FIFO data, fifo packet counter 0xeacc from fifo_to_udp.v&lt;br /&gt;
  2: 0x00000061 -- FIFO status, low bits the the word counter, so up to 0x61 fifo words are to follow&lt;br /&gt;
  3: 0x87fb3d72 -- tsc hits&lt;br /&gt;
  4: 0x8ffb3d74&lt;br /&gt;
  5: 0x90fb3d74&lt;br /&gt;
  6: 0x91fb3d74&lt;br /&gt;
  7: 0x92fb3d74&lt;br /&gt;
  8: 0x93fb3d74&lt;br /&gt;
  9: 0x93fb3d75&lt;br /&gt;
 10: 0x94fb3d74&lt;br /&gt;
 11: 0x94fb3d77&lt;br /&gt;
 12: 0x87fb3d77&lt;br /&gt;
 13: 0x8ffb3d77&lt;br /&gt;
 14: 0x90fb3d77&lt;br /&gt;
 15: 0x91fb3d77&lt;br /&gt;
 16: 0x92fb3d77&lt;br /&gt;
 17: 0xfe000018 -- 0xFE scaler data starts, 0x18 words to follow&lt;br /&gt;
 18: 0x00000000&lt;br /&gt;
 19: 0x00000000&lt;br /&gt;
 20: 0x00000000&lt;br /&gt;
 21: 0x00000000&lt;br /&gt;
 22: 0x00000000&lt;br /&gt;
 23: 0x00000000&lt;br /&gt;
 24: 0x00000000&lt;br /&gt;
 25: 0x00000108&lt;br /&gt;
 26: 0x00000000&lt;br /&gt;
 27: 0x00000000&lt;br /&gt;
 28: 0x00000000&lt;br /&gt;
 29: 0x00000000&lt;br /&gt;
 30: 0x00000000&lt;br /&gt;
 31: 0x00000000&lt;br /&gt;
 32: 0x00000000&lt;br /&gt;
 33: 0x00000108&lt;br /&gt;
 34: 0x00000108&lt;br /&gt;
 35: 0x00000108&lt;br /&gt;
 36: 0x00000108&lt;br /&gt;
 37: 0x00000108&lt;br /&gt;
 38: 0x00000108&lt;br /&gt;
 39: 0x00000000&lt;br /&gt;
 40: 0x00000000&lt;br /&gt;
 41: 0xce56fa93 -- last word of scaler data is the sysclock counter (125 MHz)&lt;br /&gt;
 42: 0xff800048 -- timestamp wraparound&lt;br /&gt;
 43: 0x8f1f36e4 -- tsc hits&lt;br /&gt;
 44: 0x901f36e4&lt;br /&gt;
 45: 0x911f36e4&lt;br /&gt;
 46: 0x921f36e4&lt;br /&gt;
 47: 0x931f36e4&lt;br /&gt;
 48: 0x941f36e4&lt;br /&gt;
 49: 0x871f36e4&lt;br /&gt;
 50: 0x871f36e7&lt;br /&gt;
 51: 0x8f1f36e7&lt;br /&gt;
 52: 0x901f36e9&lt;br /&gt;
 53: 0x911f36e7&lt;br /&gt;
 54: 0x921f36e9&lt;br /&gt;
 55: 0x931f36e7&lt;br /&gt;
 56: 0x941f36e9&lt;br /&gt;
 57: 0x904330ac&lt;br /&gt;
 58: 0x914330ac&lt;br /&gt;
 59: 0x924330ac&lt;br /&gt;
 60: 0x934330ac&lt;br /&gt;
 61: 0x934330ad&lt;br /&gt;
 62: 0x944330ac&lt;br /&gt;
 63: 0x944330ad&lt;br /&gt;
 64: 0x874330ac&lt;br /&gt;
 65: 0x874330ad&lt;br /&gt;
 66: 0x8f4330ac&lt;br /&gt;
 67: 0x8f4330ad&lt;br /&gt;
 68: 0x904330ad&lt;br /&gt;
 69: 0x914330ad&lt;br /&gt;
 70: 0x924330ad&lt;br /&gt;
 71: 0x8f672a62&lt;br /&gt;
 72: 0x90672a62&lt;br /&gt;
 73: 0x91672a62&lt;br /&gt;
 74: 0x92672a62&lt;br /&gt;
 75: 0x93672a62&lt;br /&gt;
 76: 0x94672a62&lt;br /&gt;
 77: 0x87672a62&lt;br /&gt;
 78: 0x87672a65&lt;br /&gt;
 79: 0x8f672a65&lt;br /&gt;
 80: 0x90672a65&lt;br /&gt;
 81: 0x91672a65&lt;br /&gt;
 82: 0x92672a65&lt;br /&gt;
 83: 0x93672a65&lt;br /&gt;
 84: 0x94672a65&lt;br /&gt;
 85: 0xff000049&lt;br /&gt;
 86: 0x878b2422&lt;br /&gt;
 87: 0x8f8b2424&lt;br /&gt;
 88: 0x908b2424&lt;br /&gt;
 89: 0x918b2424&lt;br /&gt;
 90: 0x928b2424&lt;br /&gt;
 91: 0x938b2424&lt;br /&gt;
 92: 0x938b2425&lt;br /&gt;
 93: 0x948b2424&lt;br /&gt;
 94: 0x948b2427&lt;br /&gt;
 95: 0x878b2427&lt;br /&gt;
 96: 0x8f8b2427&lt;br /&gt;
 97: 0x908b2427&lt;br /&gt;
 98: 0x918b2427&lt;br /&gt;
 99: 0x928b2427&lt;br /&gt;
100: 0xe000eacc -- 0xE is end of fifo data, counter 0xeacc must match the counter in the 0xC word.&lt;br /&gt;
ReadDataThread read 344 -- next packet&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
&lt;br /&gt;
* add FwRev to the UDP data output&lt;br /&gt;
* RJ45 SFP: PROBLEM, D.A. CABLE: GOOD, Fiber SFP: ???. fix &amp;quot;write did not happen&amp;quot; (send udp write command, there is no reply, read returns old data as if write never happened). suspect udp &amp;quot;write&amp;quot; packet is lost?&lt;br /&gt;
* 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.&lt;br /&gt;
* DONE 2021jul30. add fixes from Chris P. for the auto-negotiation and dhcp (see email from him).&lt;br /&gt;
* DONE flash chip connected to FPGA. Aug 2021. implement ethernet flash programmer&lt;br /&gt;
* DONE Aug 2021. updated maxv firmware. implement FPGA reboot&lt;br /&gt;
* speed up programming the MLU by writing more than 1 bit at a time&lt;br /&gt;
* add 64-bit bitmap of BSC trigger bits&lt;br /&gt;
* DONE. add chronobox code&lt;br /&gt;
* DONE. add avalon mux for alphag and chronobox packets&lt;br /&gt;
* DONE. add chronobox fifo to udp packet sequencer&lt;br /&gt;
* check that TxReadyOut is correct and it is safe to send an avalon packet while previous packet is still transmitting.&lt;br /&gt;
* test fiber SFP is working&lt;br /&gt;
* complete the UDP flash programmer (parallel flash erase and write)&lt;br /&gt;
&lt;br /&gt;
= End =&lt;br /&gt;
&lt;br /&gt;
//KO&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
</feed>