/
Bringing up MBF

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:

HardwareVendorPart NumberDescription
VT814VadatechVT814-200-000-0002U μTCA.4 chassis with 6 AMC slots
UTC002UTC002-210-801-100 μTCA MCH (MicroTCA Carrier Hub) with support for 8 lanes of PCIe gen 3.
AMC720AMC720-122-010-000 Intel Xeon general purpose AMC processor card with 16GB RAM, 30GB SSD.
AMC525AMC525-012-023-000AMC FPGA carrier for dual HPC FMC with Virtex-7 690.
FMC-500MInnovative Integration80281-2-L0 FMC-500FMC 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

CardPortDescription
UTC002SERSerial console to MCH.  Not normally used.

AMC720

(CPU)

IPMI RS-232CPU IPMI port.  Use for ekey configuration only.
PCH RS-232CPI serial console port.  Use for BIOS and basic system administration.
AMC525MGT RS-232Carrier card IPMI port.  Use for ekey configuration only.
CPU RS-232P2040 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:


TitlePurpose
*1Gigabit Ethernet - Port 0Administration interface to AMC cards and MCH
*3PCIe Root - Ports 4-118 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:


TitlePurpose
*1Gigabit Ethernet - Port 0Administration interface from CPU
*12PCIe Node - Ports 4-118 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).

PortDirDescription
1InGeneral purpose trigger.  Designed for general event triggering, connected to machine synchronous 5Hz source at DLS.
2InPostmortem trigger.  Alternative trigger source, connected to Machine Protection System loss event trigger for postmortem capture.
3InBlanking trigger.  Used for suppressing measurement of beam disturbance during injection transients.
4, 5OutProgrammable 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.

PortDirSignalDescription

DAC 1 OUT-

DAC 1 OUT+

Out±1V into 50Ω, DC to 500 MHzChannel 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+

OutChannel 0 differential output.
CLK INIn±0.3 to 3.3V into 50Ω, 250 to 500 MHz.Machine RF clock.
CLK OUTUnused (except for development and debugging)
EXT TRGIn0 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 0In±1V into 50Ω, DC to 250 MHzChannel 0 single ended input.
ADC 1InChannel 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:

PortNameDescription
MTCA port 0enp1s0f1Internal administration network.  Configure as 192.168.40.0/24 network, see below for existing nodes on this network.
Front panel ETH0enpls0f3External 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:

AddressDevice
192.168.40.250

MCH.  Connect to this as root with password root, or use ipmitool, for example:

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 /etc/network/interfaces.  Note that this CPU sees 4 network ports, but only eth0 is used (eth1 connects to MTCA port 1 which we're not using, and eth2 and eth3 connect to the FPGA where they will be ignored).

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:

TargetDescription
driverBuilds kernel module amc525_mbf.ko in build/kbuild-$(uname -r).  Needs to be run on target system for module to be usable.
insmodEnsures kernel module is built and runs insmod to add to the current kernel.  Needs to be run on target system.
driver-rpmBuilds 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 NodeDescription
amc525_mbf.0.regRegister interface device node.  Used for control of MBF system.
amc525_mbf.0.ddr0Access to fast memory buffer for bunch by bunch capture readout.
amc525_mbf.0.ddr1Access 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:

KeyDescription
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:

Mode NameDescription
499_682
PLL is locked to 499.682 MHz RF input.
352_202

PLL is locked to 352.202 MHz RF input.

352_372
PLL is locked to 352.372 MHz RF input.
Passthrough
RF clock is passed through without locking and regeneration.

Alternatively this key can be set to sequence of six numbers defining the PLL configuration, for example the following is equivalent to 499_682:

13 0 5 2 381 61

See the documentation for PLL_ratios in python/mbf/driver/setup_pll.py for more detail.

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:

  1. Power on crate, wait for PC to boot
  2. Reload FPGA with ./load_fpga script run on PC
  3. Reboot PC (without power cycling) to pick up full PCIe functionality
  4. Start IOC
  5. Renable DAC outputs, rearm triggers

Related content

Guide to MBF Signal Processing
Guide to MBF Signal Processing
More like this
Help Pages for Multi-Bunch Feedback
Help Pages for Multi-Bunch Feedback
More like this
Help Pages for Multi-Bunch Feedback (version 1.3)
Help Pages for Multi-Bunch Feedback (version 1.3)
More like this
Published MBF and TMBF Talks and Papers
Published MBF and TMBF Talks and Papers
More like this
Bunch Bank Control
More like this