Bringing up MBF
The procedure for bringing up the Multi-Bunch Feedback processor system for the first time in a new environment is a little involved and is documented below.
Preparing Hardware
Hardware
Here we focus entirely on the control system. A complete multi-bunch feedback system consists of a Beam Position Monitor button block, typically an RF hybrid assembly to convert button signals to scaled position and intensity, an RF front end to down-convert button signals at an intermediate frequency (1.5GHz at Diamond) before the signal is sampled and processed by the control system. The output from the control system is then up-converted if necessary, amplified, and driven onto the beam, either through strip-lines (for transverse operation) or through a dedicated RF cavity for longitudinal operation.
The MBF control system at Diamond consists of the following hardware:
Hardware | Vendor | Part Number | Description |
---|---|---|---|
VT814 | Vadatech | VT814-200-000-000 | 2U μTCA.4 chassis with 6 AMC slots |
UTC002 | UTC002-210-801-100 | μTCA MCH (MicroTCA Carrier Hub) with support for 8 lanes of PCIe gen 3. | |
AMC720 | AMC720-122-010-000 | Intel Xeon general purpose AMC processor card with 16GB RAM, 30GB SSD. | |
AMC525 | AMC525-012-023-000 | AMC FPGA carrier for dual HPC FMC with Virtex-7 690. | |
FMC-500M | Innovative Integration | 80281-2-L0 FMC-500 | FMC module with dual 500 Ms/s 14-bit ADC, dual 1200 Ms/s 16-bit DAC. |
FMC-DIO-5chttl | Open Hardware (Creotech, Sevensols) | FMC module with five channels of TTL I/O. |
Populating the crate
- The two FMC cards must be placed in the AMC 525 carrier in the correct slots, with the Digital I/O card in slot 0 and the FMC 500 in slot 1 (more details and pictures in this section). See the image below to verify the correct configuration:
Note that because of an address conflict on the shared IPMI I2C bus between the programmable input threshold DAC on the CTI-FMC-DIO and a temperature sensor on the AMC525 (and thus a MTCA IPMI alert which won't go away), it is necessary to make a modification to the DIO card to reassign the address to an unused address. This done by cutting the track to ADDR1: - When placing the AMC cards in the crate it seems that it is necessary to be careful about which cards are (logically) adjacent to the processor card. To avoid problems, at DLS we installed the processor card in slot 6 and the carrier cards in slots 2 and 3 (note that these slot numbers don't correspond to the PCIe addresses which we'll encounter later). Specifically, it seems that with the processor card in slot 6 we need to avoid placing a carrier card in slot 5, as otherwise the processor card tries to boot from non-existent mass storage in this slot!
- At this point its a good idea to ensure that all serial ports are configured with the same data rate. The default line speed is 115200 8N1 for all ports except for the CPU console which defaults to 9600 8N1.
- Now e-keying must be configured.
Table of relevant serial ports
Card | Port | Description |
---|---|---|
UTC002 | SER | Serial console to MCH. Not normally used. |
AMC720 (CPU) | IPMI RS-232 | CPU IPMI port. Use for ekey configuration only. |
PCH RS-232 | CPI serial console port. Use for BIOS and basic system administration. | |
AMC525 | MGT RS-232 | Carrier card IPMI port. Use for ekey configuration only. |
CPU RS-232 | P2040 CPU serial console. Not normally used. |
E-key configuration
Once the hardware has been configured as above the crate can be powered on and the e-keying for the CPU and AMC525 must be set up. This will be particularly important to ensure that the PCIe link works properly.
CPU e-key
Payload SOL Port : Serial1 Gbe Management Port: back0 Shutdown delay : 30s Commands: ekey - Configure Electronic Keying lan - Configure LAN Parameters plser - Configure Payload Serial Port mgtport - Configure Gbe Management Port wdcfg - Configure Watchdog Parameters shutdowndelay - Configure shut down delay > ekey E-Keying configuration * 1) Gigabit Ethernet - Port 0 * 2) Gigabit Ethernet - Port 1 * 3) PCIe Root - Ports 4-11 4) PCIe Root - Ports 4-7 5) PCIe Root - Ports 8-11 6) SATA Client - Port 2 7) SATA Client - Port 3 Commands: 1-7 to toggle option. save, cancel
Ensure that the following are configured:
Title | Purpose | |
---|---|---|
*1 | Gigabit Ethernet - Port 0 | Administration interface to AMC cards and MCH |
*3 | PCIe Root - Ports 4-11 | 8 lane PCIe connection to AMC carrier cards |
Note: Port 1 is enabled but not used.
AMC e-key
Connect to the MGT-RS232 port on the AMC525 front panel, and type ekey
at the prompt. Adjust for the following settings:
AMC525 > ekey E-Keying configuration * 1) Gigabit Ethernet - Port 0 * 2) Gigabit Ethernet - Port 1 3) SATA Server - Port 2 4) SATA Client - Port 2 5) SATA Server - Port 3 6) SATA Client - Port 3 7) SAS - Port 2 8) SAS - Port 3 9) PCIe Root - Ports 4-11 10) PCIe Root - Ports 4-7 11) PCIe Root - Ports 8-11 * 12) PCIe Node - Ports 4-11 13) PCIe Node - Ports 4-7 14) PCIe Node - Ports 8-11 15) SRIO 3.125 Gbaud - Ports 4-7 16) SRIO 2.5 Gbaud - Ports 4-7 17) SRIO 1.25 Gbaud - Ports 4-7 18) SRIO 3.125 Gbaud - Ports 8-11 19) SRIO 2.5 Gbaud - Ports 8-11 20) SRIO 1.25 Gbaud - Ports 8-11 21) XAUI - Port 4-7 22) XAUI - Port 8-11 Commands: 1-22 to toggle option. save, cancel
Ensure that the following are configured:
Title | Purpose | |
---|---|---|
*1 | Gigabit Ethernet - Port 0 | Administration interface from CPU |
*12 | PCIe Node - Ports 4-11 | 8 lane PCIe connection to CPU carrier cards |
Also the vadj
setting must be configured as otherwise the FMC cards will not be powered on.
FMC0 EEPROM is invalid / missing FMC1 VADJ range is 0.00V - 0.00V VADJ setting is 1.80V AMC525 > vadj 0: 1.80V c: Cancel Select Voltage (0-0, c):
If VADJ
is not already set to 1.80V select 0 above to configure.
Cabling
Connections to Digital I/O card.
These are Lemo ERA.00.250 sockets taking FFS.00.250 connectors. All inputs are configured as 3.3V TTL high impedance (though 50Ω termination can be configured in software if desired), all outputs are driven as 3.3V TTL. All inputs are acted on once per machine revolution in response to a rising edge, but are continuously sampled (at machine RF frequency).
Port | Dir | Description |
---|---|---|
1 | In | General purpose trigger. Designed for general event triggering, connected to machine synchronous 5Hz source at DLS. |
2 | In | Postmortem trigger. Alternative trigger source, connected to Machine Protection System loss event trigger for postmortem capture. |
3 | In | Blanking trigger. Used for suppressing measurement of beam disturbance during injection transients. |
4, 5 | Out | Programmable sequencer events. These are pulsed (pulse width is 62 machine clock ticks) when the sequencer enters the selected state. Each sequencer has its own pulsed output. These are designed to be interface to external equipment if required. Channel 0 drives port 4, channel 1 drives port 5. |
Connections to FMC500 card
These are all SSMC sockets. The connectors should not be tighter than finger tight, our experience is that over-tightening can use the inner conductor to lose contact. The official documentation (see page 26) recommends 0.2 Nm coupling torque.
Port | Dir | Signal | Description |
---|---|---|---|
DAC 1 OUT- DAC 1 OUT+ | Out | ±1V into 50Ω, DC to 500 MHz | Channel 1 differential output. Outputs are driven directly by a LMH6554 amplifier. Unused outputs should probably be terminated into 50Ω. |
DAC 0 OUT- DAC 0 OUT+ | Out | Channel 0 differential output. | |
CLK IN | In | ±0.3 to 3.3V into 50Ω, 250 to 500 MHz. | Machine RF clock. |
CLK OUT | Unused (except for development and debugging) | ||
EXT TRG | In | 0 to 3.3V into 50Ω, threshold at 1.2V. | To ensure synchronisation with the machine revolution a fast rising edge is expected at machine revolution frequency. This signal is synchronised to once during startup, and is sampled continuously thereafter. |
ADC 0 | In | ±1V into 50Ω, DC to 250 MHz | Channel 0 single ended input. |
ADC 1 | In | Channel 1 single ended input. |
System Software Setup
At this point the MTCA crate and all cards should be in a position to power up. Now tangle with the BIOS and install your choice of Linux (RHEL 7 for DLS, Debian 9 at the ESRF (see installation notes here)). No special drivers (except for the MBF driver, we'll get onto that) need to be installed, but you'll probably want IPMI administration configured.
Networking
Two out of the four available network ports need to be configured:
Port | Name | Description |
---|---|---|
MTCA port 0 | enp1s0f1 | Internal administration network. Configure as 192.168.40.0/24 network, see below for existing nodes on this network. |
Front panel ETH0 | enpls0f3 | External network. I suggest not configuring any routing to the internal network. |
The administration network connects to the MCH and the P2040 CPU on the AMC card. By default the following addresses are assigned:
Address | Device |
---|---|
192.168.40.250 | MCH. Connect to this as root with password root, or use ipmitool -I lan -H 192.168.40.250 -U '' -P '' shell |
192.168.40.200 | AMC525. If more than one AMC525 is installed the network address will need to be changed by logging on through the serial console (user root, no password) and editing This interface will be used for programming the FPGA. |
We can now validate the system by logging on to the MCH and AMC525 cards through the internal network.
MBF Kernel Driver
At some point before running the software the MBF kernel driver will need to be installed on the AMC720 processor. The following top level makefile targets may be helpful:
Target | Description |
---|---|
driver | Builds kernel module amc525_mbf.ko in build/kbuild-$(uname -r) . Needs to be run on target system for module to be usable. |
insmod | Ensures kernel module is built and runs insmod to add to the current kernel. Needs to be run on target system. |
driver-rpm | Builds DKMS based RPM for driver. Can be run on any system, resulting RPM can be permanently installed on target system. |
The details of how to manage driver installation are somewhat distribution specific. Once the module has been installed it should be automatically picked up when the FPGA is loaded.
Bringing up the FPGA
First of all the FPGA must be loaded onto the AMC card. The ./load_fpga
script does the work: this must be run on the AMC720 processor card:
./load_fpga -f path/to/amc525_mbf.bit
(The -f bit-file
argument can be omitted if the bit file is in the working directory.)
At this point run lspci -v
, and you should see something like the following:
04:00.0 Signal processing controller: Xilinx Corporation FPGA Card XC7VX690T Subsystem: Xilinx Corporation Device 0007 Physical Slot: 0 Flags: fast devsel Memory at <unassigned> (64-bit, non-prefetchable) [disabled] Memory at <unassigned> (64-bit, non-prefetchable) [disabled] Capabilities: <access denied>
If we see this then the FPGA has been successfully loaded and the PCIe link is working correctly. Note however that the PCIe IO memory cannot be mapped at this stage because it is too late for the BIOS to identify it: hence the Memory at <unassigned>
lines (we see Capabilities: <access denied>
merely because we're not running lspci
as root). Now reboot the processor card and re-run lspci -v
and we should now see:
04:00.0 Signal processing controller: Xilinx Corporation FPGA Card XC7VX690T Subsystem: Xilinx Corporation Device 0007 Physical Slot: 0 Flags: bus master, fast devsel, latency 0, IRQ 70 Memory at fe300000 (64-bit, non-prefetchable) [size=1M] Memory at fe400000 (64-bit, non-prefetchable) [size=64K] Capabilities: <access denied> Kernel driver in use: amc525_mbf
If the kernel driver has not yet been installed, now install it and run ls /dev
. The following files should be present:
Device Node | Description |
---|---|
amc525_mbf.0.reg | Register interface device node. Used for control of MBF system. |
amc525_mbf.0.ddr0 | Access to fast memory buffer for bunch by bunch capture readout. |
amc525_mbf.0.ddr1 | Access to slow memory buffer for detector readout. |
amc525_mbf/ | Directory containing physical address links to device nodes. |
The system is now ready to run the software. Note that once the processor has been booted with a loaded FPGA present it won't need to be rebooted again if a fresh FPGA image is loaded until the whole system is power-cycled.
Note also that reloading the FPGA while the software is running is likely to trigger a kernel panic on the main processor (interrupted PCIe transactions don't seem to be handled well!), and hot-swapping the AMC is equally likely to do this.
Bringing up Software
Preparing IOC Configuration
To prepare to run a new IOC a new configuration and startup file in the iocs/
directory:
ioc_name=new-ioc-name cd iocs ln -s start-ioc $ioc_name cp TS-DI-TMBF-02.config $ioc_name
Now edit the .config
file. The options are as follows:
Key | Description | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
procserv_port | If the IOC is started using the ./start_ioc script this defines the telnet port that procServ will use. Otherwise this key is ignored. | ||||||||||
device_address | This is of the form pci-0000:nn:00.0 where nn identifies the slot where the appropriate AMC525 card is inserted (though the slot numbers and PCIe numbers don't match). Inspect /dev/amc525_mbf/ for currently recognised cards. | ||||||||||
dio_termination | If 50Ω termination is wanted for the three digital I/O trigger inputs then set this to 7, otherwise set to 0 for high impedance termination. | ||||||||||
clock_mode | This determines how the PLL is initialised. The following timing modes are supported:
Alternatively this key can be set to sequence of six numbers defining the PLL configuration, for example the following is equivalent to 13 0 5 2 381 61 See the documentation for | ||||||||||
epics_name | This determines the top level device name and generally should match $ioc_name determined above. | ||||||||||
axis0_name | Name of channel 0. Typically X for transverse mode, I for longitudinal mode. | ||||||||||
axis1_name | Name of channel 1. Typically Y for transverse mode, Q for longitudinal mode. | ||||||||||
lmbf_mode | Set to 0 if operating in transverse mode, set to 1 if longitudinal mode. This will determine how the FPGA is configured and some details of the behaviour of the IOC. | ||||||||||
bunches_per_turn | Set to the number of RF buckets per machine revolution. Must be no more than 1024 (with the current FPGA build), and there may be problems with particularly small values. | ||||||||||
revolution_frequency | Set to machine revolution frequency in Hz. Only used for time estimates in display. | ||||||||||
lmbf_fir_offset | Adjustment of FIR coupling between I and Q axes in LMBF mode. | ||||||||||
mms_poll_interval | Used to control polling frequency for MMS readout. If MMS overrun is reported this number needs to be reduced, but check CPU usage with top. Reading MMS data is time consuming. | ||||||||||
persistence_file | This should be an absolute path to a writeable location where the IOC can save the persistent state of all of its PVs. It is wise to keep this file backed up and archived as the configuration of MBF can be quite complex and potentially difficult to recreate. | ||||||||||
persistence_interval | This determines the interval (in seconds) between checks for writing the persistent state. Too small a value will generate a lot of writes, too large a value can result in lost configuration state if the IOC is forcibly restarted. | ||||||||||
pv_log_array_length | Determines how many points of changed waveforms are logged. | ||||||||||
memory_readout_length | Determines the length of the memory readout waveform PV. | ||||||||||
detector_length | Determines the length of the detector readout waveform PV. | ||||||||||
data_port | Determines socket number for fast data readout. |
Now the IOC can be started, either by running iocs/$ioc_name
or preferably ./start_ioc $ioc_name
to run the IOC under procServ
.
Note: If the environmental variable EPICS_CA_MAX_ARRAY_BYTES is not defined in your environment, it is advised to set it to a higher value than the default one (16384 bytes) for both the client and the server. At DLS, it is set to 6000000 in all profiles.
Initial State
When MBF is started for the first time, or when the state file is deleted, the initial state of nearly all PVs is set to zero. Before trying to use the system the input and output compensation filters should be reset to passthrough and the control gains should be set to 1. The tools/initial-state
script will perform this operation:
tools/initial-state $ioc_name
Also note that every time MBF is restarted, the DAC output is disabled. This is deliberate to avoid accidentally driving onto the beam after a restart, but means that after every restart the :DAC:ENABLE_S
pvs must be manually set.
Helper Tools
A number of Helper Tools are documented on the linked page.
Restarting the IOC
The IOC can be restarted at any time. If however the crate is power-cycled then the procedure is slightly more involved:
- Power on crate, wait for PC to boot
- Reload FPGA with
./load_fpga
script run on PC - Reboot PC (without power cycling) to pick up full PCIe functionality
- Start IOC
- Renable DAC outputs, rearm triggers