This version (14 Feb 2024 18:35) was approved by Brandon Lopez.The Previously approved version (28 Nov 2023 15:27) is available.Diff

X-Band Platform Software

Software Needed


PuTTY helps to provide a view into the Linux and give additional controls and debug abilities. Putty can be downloaded from here Putty Download Page. Ensure that the proper version for the computer is downloaded (64 bit for a 64 bit PC). Once downloaded the COM port to the FPGA can be opened. This COM port can be identified through the device manager as the standard COM port:

In PuTTY, this should be opened with a baudrate of 115200.

MATLAB 2021b or 2022a

MATLAB 2021b is the primary version that all the code is tested with.

MATLAB is used to exercise the board through LibIIO objects and provide higher level application functionality. In order to work with the platform, a number of toolboxes and support packages are required: Required toolboxes:

  1. MATLAB Communications Toolbox
  2. DSP System Toolbox
  3. Signal Processing Toolbox
  4. Curve Fitting Toolbox
  5. Instrument Control Toolbox
  6. Communications Toolbox Support Package for Xilinx Zynq-Based Radio. Installed through MATLAB Add-On Explorer.
  7. Analog Devices High Speed Converter Toolbox. Can be installed through MATLAB Add-On Explorer or latest version here:
  1. Analog Devices RF Microwave Toolbox. Can be installed through MATLAB Add-On Explorer or latest version here:

Customers can request a free trial via the Communications Toolbox product page, or they can request a Software-Defined Radio Design trial “package”, which includes MATLAB, Simulink, DSP System Toolbox, Signal Processing Toolbox, and Communications Toolbox.


ZCU102 Set Up

This guide will walk you through setting up the ZCU102 FPGA platform to work with the X-Band Developer's Kit.

SD Card Setup

Click to display ⇲

Click to hide ⇱

  1. Follow the instructions on one of the below pages to install the 2021_r2 Linux kernel on the SD card.
  2. Determine which version of the MxFE board you have. The version is printed in copper on the bottom right corner of the board with the RF connectors facing North. The writing is covered in soldermask and can be somewhat difficult to read. The board version should either be “B”, “C”, or “D”.
  3. There are three pertinent files to copy to the root of the SD card's /BOOT/ section:
    1. Image, located in “zynqmp-common” folder
    2. BOOT.BIN, located in “zynqmp-zcu102-rev10-stingray” folder
    3. system.dtb, located in subfolders of “zynqmp-zcu102-rev10-stingray” folder
There are 3 folders in the “zynqmp-zcu102-rev10-stingray” folder. Be sure to take the “system.dtb” that corresponds with the clocking architecture of your setup.
Be sure to rename the correct *.dtb file for your version of the AD9081 board to “system.dtb”.
If your computer encrypts removable media for security purposes, it's easiest to use a personal computer to do this step. If encryption issues persist, use the file below which has AES disabled. This is version 2021_R1.

ZCU102 Configuration Files, 100MHz VCXO, AES Disabled

ZCU102 Configurations

Boot from SD Card

Click to display ⇲

Click to hide ⇱

To configure the ZCU102 to boot from the SD card, set SW6 as shown below. SW6 is halfway between the SD card input and the vertical SMA connectors on the ZCU102. SW6 Configuration for SD Card Boot

USB Host Mode

Click to display ⇲

Click to hide ⇱

Setting up the ZCU102 in USB Host Mode allows the use of USB peripherals such as a keyboard and mouse. This can be useful for operating the board directly rather than having to use the UART connection or some other form of indirect control. Configure the jumpers as indicated below:

  • Shunt J7
  • J109 → Shunt pins 2-3
  • J110 → Shunt pins 2-3
  • J112 → Shunt pins 1-2
  • J113 → Shunt pins 1-2

Jumper Configuration for USB Host Mode

DisplayPort Not Working

Once you have the board up and running (and control using the UART connection through PuTTy), try this procedure at the bottom of the page.

USB to UART Bridge

The ZCU102 uses a mini-B USB cable to connect the USB UART port on the board to a host PC. If the USB to UART bridge is not installed or automatically recognized, then a drive must be installed. This will allow control using the UART connection through PuTTy or other SSH/Telnet Client, select Downloads tab for Driver download.

Network Configuration

The ZCU102 uses a RJ45 ethernet cable to connect the ethernet port on the board a host PC or network port to enable network access. Modifications to the network settings can be made following the guidance detailed on the Network Configuration wiki.

ADAR1000EVAL1Z Power Sequence

The proper power on sequencing for the ADAR1000EVAL1Z is embedded within the firmware of the ZCU102. The embedded script pulses the proper signal nets in the correct order (POWER_UP_DOWN and 5V_CTRL) automatically upon booting the FPGA. The power down sequence is not enabled in software. The ADAR1000EVAL1Z board can be powered down manually by pressing the RESET button on the primary side of the ADAR1000EVAL1Z board. The following steps need to be completed by the user to implement the ADAR1000EVAL1Z power up sequencing script.

  1. Open a UART terminal connecting to the FGPA Setting up ZCU102 UART
  2. Download WinSCP
  1. Connect to the ZCU102 via WinSCP
    • Host: FPGA IP Address
    • Username: root
    • Password: analog
  2. Navigate to the /etc/ folder
  3. Copy the power sequencing script to the /etc/ folder
  4. Open the rc.local file in the /etc/ directory
    • Replace contents of rc.local file with the code below
  5. Save files, exit WinSCP, and reboot FGPA

#!/bin/sh -e
# rc.local
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
# In order to enable or disable this script just change the execution
# bits.
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"

python3 /etc/ up

service iiod restart

exit 0

Due to the hardware design of the ADAR1000EVAL1Z, the user needs to keep in mind the power up and power down execution. If the power sequence is not followed in the correct order from, then the power sequence state will be indeterminate and a hard reset is required to revert to a known power state.

For example the proper sequence is as follows: Power Up → Power Down → Power Up → Power Down

ADXUD1AEBZ Interposer FMC EEPROM Progamming

The ADXUD1AEBZ Interposer Board FMC EEPROM is not factory programmed. The following commands in a UART Terminal (e.g. PuTTY) can be executed to program the FMC EEPROM.

root@analog:~# find /sys -name eeprom
root@analog:~# fru-dump -i /usr/local/src/fru_tools/masterfiles/AD-FMCOMMS2-EBZ-FRU.bin -o /sys/bus/i2c/devices/15-0050/eeprom
read 251 bytes from /usr/local/src/fru_tools/masterfiles/AD-FMCOMMS2-EBZ-FRU.bin
wrote 251 bytes to /sys/bus/i2c/devices/15-0050/eeprom
root@analog:~# fru-dump -i /sys/bus/i2c/devices/15-0050/eeprom -b
read 256 bytes from /sys/bus/i2c/devices/15-0050/eeprom
Date of Man     : Mon Jul 22 20:23:00 2013
Manufacturer    : Analog Devices
Product Name    : AD9361 RF Hardware Development Kit
Serial Number   : 00045
Part Number     : AD-FMCOMMS2-EBZ
FRU File ID     : Empty Field
PCB Rev         : C
PCB ID          : 9361FMC01A
BOM Rev         : 1
Uses LVDS       : Y
root@analog:~# poweroff

Software Architecture

All programmable devices on the X-Band platform are abstracted by IIO devices.
IIO Device Device Name Driver Documentation
iio:device2 adar1000_csb_1_1 ADAR1000 X/Ku Band Linux Driver
iio:device3 adar1000_csb_1_2 ADAR1000 X/Ku Band Linux Driver
iio:device4 adar1000_csb_1_3 ADAR1000 X/Ku Band Linux Driver
iio:device5 adar1000_csb_1_4 ADAR1000 X/Ku Band Linux Driver
iio:device6 adar1000_csb_2_1 ADAR1000 X/Ku Band Linux Driver
iio:device7 adar1000_csb_2_2 ADAR1000 X/Ku Band Linux Driver
iio:device8 adar1000_csb_2_3 ADAR1000 X/Ku Band Linux Driver
iio:device9 adar1000_csb_2_4 ADAR1000 X/Ku Band Linux Driver
iio:device18 adf4371-0 ADF4371 IIO Wideband Synthesizer Linux Driver
iio:device19 hmc7044 HMC7044 Clock Jitter Attenuator with JESD204B Linux Driver
iio:device20 axi-ad9081-rx-hpc
iio:device21 TDD Core Generic TDD Core
iio:device22 one-bit-adc-dac TBD
iio:device23 one-bit-adc-dac TBD
iio:device24 one-bit-adc-dac TBD
iio:device25 axi-ad9081-tx-hpc

All these drivers feature a runtime API which can be controlled using IIO Oscilloscope, libiio, etc. However some configuration is static and done inside the device tree. Please see instructions on Building custom kernel and devicetree images here:

MATLAB Support

MATLAB support is provided through the High Speed Converter Toolbox and RFMicrowave Toolbox, with unique classes for transmit and receive functionality. Currently you must grab a development build but installers are provided for convenience.

MATLAB Control Overview

The X-Band Platform can be controlled via MATLAB using example scripts which are available as part of the Analog Devices, Inc. RF Microwave Toolbox add-on. This add-on can either be manually downloaded from the Releases section of the GitHub page or downloaded and installed via MATLAB Add-On Explorer. Please ensure you have installed both the Analog Devices, Inc. High Speed Converter Toolbox as well as the RF Microwave Toolbox.

It's recommended to install via the download from GitHub as this is generally more up to date than the MATLAB Add-On Explorer page
MATLAB Toolboxes
Toolbox Purpose Notes
Support Package for ADALM-Pluto LibIIO Matlab Bindings
High Speed Converter AD9081 Control
RF Microwave ADAR1000EVAL1Z & ADXUD1A Control
Genalyzer DSP of RF Signals
MinGW-w64 C/C++ Compiler Genalyzer Compiler

Example scripts are located within the add-on install directory, which is usually located in the directory:

C:\Users\<username>\AppData\Roaming\MathWorks\MATLAB Add-Ons\Toolboxes

The example scripts are specifically located in the following folder:

Analog Devices, Inc. RFMicrowave Toolbox\rfm_examples

Controlling X-Band Platform With MATLAB

The control interface for the X-Band Platform is implemented using standard system objects in MATLAB. Basic information for instantiating the objects is provided in the toolbox documentation within MATLAB and on this page and this page. Here is an example instantiation of the objects:

>> tx = adi.AD9081.Tx;

tx = 

  adi.AD9081.Tx with properties:

    ChannelNCOFrequencies: [0 0 0 0]
       MainNCOFrequencies: [0 0 0 0]
         ChannelNCOPhases: [0 0 0 0]
            MainNCOPhases: [0 0 0 0]
     ChannelNCOGainScales: [0 0 0 0]
               NCOEnables: [0 0 0 0]
          EnabledChannels: 1
                      uri: 'ip:analog'
               DataSource: 'DMA'
      EnableCyclicBuffers: false
>> rx = adi.AD9081.Rx;

rx = 

  adi.AD9081.Rx with properties:

             SamplingRate: NaN
    ChannelNCOFrequencies: [0 0 0 0]
       MainNCOFrequencies: [0 0 0 0]
         ChannelNCOPhases: [0 0 0 0]
            MainNCOPhases: [0 0 0 0]
                 TestMode: 'off'
              EnablePFIRs: false
            PFIRFilenames: ''
          SamplesPerFrame: 32768
          EnabledChannels: 1
                      uri: 'ip:analog'

>> sray = adi.Stingray;

sray = 

  adi.Stingray with properties:

              ArrayMap: [8×4 double]
          NumADAR1000s: 2
                  Mode: {'Rx'  'Rx'  'Rx'  'Rx'  'Rx'  'Rx'  'Rx'  'Rx'}
           StateTxOrRx: {'Rx'  'Rx'  'Rx'  'Rx'  'Rx'  'Rx'  'Rx'  'Rx'}
              RxEnable: [1 1 1 1 1 1 1 1]
              TxEnable: [0 0 0 0 0 0 0 0]
      LNABiasOutEnable: [1 1 1 1 1 1 1 1]
             LNABiasOn: [1×8 double]
         BeamMemEnable: [1 1 1 1 1 1 1 1]
         BiasDACEnable: [1 1 1 1 1 1 1 1]
           BiasDACMode: {'On'  'On'  'On'  'On'  'On'  'On'  'On'  'On'}
         BiasMemEnable: [1 1 1 1 1 1 1 1]
       CommonMemEnable: [1 1 1 1 1 1 1 1]
     CommonRxBeamState: [0 0 0 0 0 0 0 0]
     CommonTxBeamState: [0 0 0 0 0 0 0 0]
         ExternalTRPin: {'Pos'  'Pos'  'Pos'  'Pos'  'Pos'  'Pos'  'Pos'  'Pos'}
    ExternalTRPolarity: [0 0 0 0 0 0 0 0]
            LNABiasOff: [1×8 double]
              PolState: [0 0 0 0 0 0 0 0]
       PolSwitchEnable: [0 0 0 0 0 0 0 0]
      RxLNABiasCurrent: [0 0 0 0 0 0 0 0]
           RxLNAEnable: [0 0 0 0 0 0 0 0]
          RxToTxDelay1: [0 0 0 0 0 0 0 0]
          RxToTxDelay2: [0 0 0 0 0 0 0 0]
           RxVGAEnable: [0 0 0 0 0 0 0 0]
    RxVGABiasCurrentVM: [0 0 0 0 0 0 0 0]
            RxVMEnable: [0 0 0 0 0 0 0 0]
       SequencerEnable: [0 0 0 0 0 0 0 0]
        TRSwitchEnable: [0 0 0 0 0 0 0 0]
       TxPABiasCurrent: [0 0 0 0 0 0 0 0]
            TxPAEnable: [0 0 0 0 0 0 0 0]
          TxToRxDelay1: [0 0 0 0 0 0 0 0]
          TxToRxDelay2: [0 0 0 0 0 0 0 0]
           TxVGAEnable: [0 0 0 0 0 0 0 0]
    TxVGABiasCurrentVM: [0 0 0 0 0 0 0 0]
            TxVMEnable: [0 0 0 0 0 0 0 0]
        DetectorEnable: [8×4 logical]
         DetectorPower: [8×4 double]
             PABiasOff: [8×4 double]
              PABiasOn: [8×4 double]
                RxAttn: [8×4 logical]
           RxBeamState: [8×4 double]
           RxPowerDown: [8×4 logical]
                RxGain: [8×4 double]
               RxPhase: [8×4 double]
                TxAttn: [8×4 logical]
           TxBeamState: [8×4 double]
           TxPowerDown: [8×4 logical]
                TxGain: [8×4 double]
               TxPhase: [8×4 double]
      RxSequencerStart: [8×4 logical]
       RxSequencerStop: [8×4 logical]
      TxSequencerStart: [8×4 logical]
       TxSequencerStop: [8×4 logical]
                  Temp: [8×1 double]
             Frequency: 1.0000e+10
        ElementSpacing: 0.0150
                   uri: 'ip:'
       EnabledChannels: 1
           PowerUpDown: 0
                Ctrl5V: 0
                  PAOn: 0
                 TXRX0: 0
                 TXRX1: 0
                 TXRX2: 0
                 TXRX3: 0
          PllOutputSel: 0
            RxGainMode: 0
          MUXOutEnable: 0
                  Name: []
      ADF4371Frequency: []
                 Phase: []
             PowerDown: []
           ADF4371Temp: []
            BurstCount: 0
            CounterInt: 0
        DMAGateingMode: 0
                Enable: 0
            EnableMode: 3
           FrameLength: 0
             Secondary: 0
      SyncTerminalType: 0
               TxDPoff: [0 0]
                TxDPon: [0 0]
                 TxOff: [0 0]
                  TxOn: [0 0]
              TxVCOoff: [0 0]
               TxVCOon: [0 0]
               RxDPoff: [0 0]
                RxDPon: [0 0]
                 RxOff: [0 0]
                  RxOn: [0 0]
              RxVCOoff: [0 0]
               RxVCOon: [0 0]            


This script is to be used with the Analog Devices X-Band Platform to demonstrate relatively simple MATLAB control of the system. It allows the user to configure the Rx aspects of the system by using the and rx = adi.AD9081.Rx and sray = adi.Stingray system objects.

Using this script as a basis, the user can modify the script for their own use case such that they can:

  1. View Analog Array Channel Mapping Using, For Example, sray.ArrayMap
  2. Change Rx NCO Frequencies Using, For Example, rx.MainNCOFrequencies or rx.ChannelNCOFrequencies
  3. Change Rx NCO Phases Using, For Example, rx.MainNCOPhases or rx.ChannelNCOPhases
  4. Change Rx Analog per Channel Gain Using, For Example, sray.RxGain
  5. Change Rx Analog per Channel Phases Using, For Example, sray.RxPhase
  6. Change Rx Analog per Channel Attenuation Using, For Example, sray.RxAttn
  7. Latch Rx Analog Settings Using, For Example, sray.LatchRxSettings
  8. Capture Simultaneous Complex-Valued Rx Data for All Enabled Channels: data=rx()
  9. - Beam steer using sray.SteerRx(azimuth,elevation,arrayPhaseOffsets)
  10. Beam taper using sray.TaperRx(window,gain,arrayGainOffsets)
  11. Analyze and Post-Process Captured Waveforms


This script is to be used with the Analog Devices X-Band Platform to demonstrate relatively simple MATLAB control of the system. It allows the user to configure the Tx aspects of the system by using the and tx = adi.AD9081.Tx and sray = adi.Stingray system objects.

Using this script as a basis, the user can modify the script for their own use case such that they can:

  1. View Analog Array Channel Mapping Using, For Example, sray.ArrayMap
  2. Change Tx NCO Frequencies Using, For Example, tx.MainNCOFrequencies or tx.ChannelNCOFrequencies
  3. Change Tx NCO Phases Using, For Example, tx.MainNCOPhases or tx.ChannelNCOPhases
  4. Change Tx Analog per Channel Gain Using, For Example, sray.TxGain
  5. Change Tx Analog per Channel Phases Using, For Example, sray.TxPhase
  6. Change Tx Analog per Channel Attenuation Using, For Example, sray.TxAttn
  7. Latch Tx Analog Settings Using, For Example, sray.LatchTxSettings
  8. Transmit Complex-Valued Tx waveforms for All Enabled Channels: release(tx)
  9. Beam steer using sray.SteerTx(azimuth,elevation,arrayPhaseOffsets)
  10. Beam taper using sray.TaperTx(window,gain,arrayGainOffsets)


Useful PuTTY Commands

The use of the UART terminal to debug and understand device attribute and channel attribute settings can be insightful. There are a variety of libiio command sets that can be utilized such as iio_info and iio_attr. Additional libiio tips and tricks can be found here.

Devices Attributes

root@analog:~# iio_attr -d
IIO context has 19 devices:
        iio:device0, ltc2314-14: found 1 device attributes
        iio:device1, ams: found 1 device attributes
        iio:device18, adf4371-0: found 2 device attributes
        iio:device19, hmc7044: found 7 device attributes
        iio:device2, adar1000_csb_1_1: found 40 device attributes
        iio:device20, axi-ad9081-rx-hpc: found 13 device attributes
        iio:device21, axi-core-tdd: found 11 device attributes
        iio:device22, one-bit-adc-dac: found 1 device attributes
        iio:device23, one-bit-adc-dac: found 1 device attributes
        iio:device24, one-bit-adc-dac: found 1 device attributes
        iio:device25, axi-ad9081-tx-hpc: found 2 device attributes
        iio:device3, adar1000_csb_1_2: found 40 device attributes
        iio:device4, adar1000_csb_1_3: found 40 device attributes
        iio:device5, adar1000_csb_1_4: found 40 device attributes
        iio:device6, adar1000_csb_2_1: found 40 device attributes
        iio:device7, adar1000_csb_2_2: found 40 device attributes
        iio:device8, adar1000_csb_2_3: found 40 device attributes
        iio:device9, adar1000_csb_2_4: found 40 device attributes
        iio_sysfs_trigger: found 2 device attributes

Channel Attributes

root@analog:~# iio_attr -c
IIO context has 19 devices:
        iio:device0, ltc2314-14: found 2 channels
        iio:device1, ams: found 30 channels
        iio:device18, adf4371-0: found 5 channels
        iio:device19, hmc7044: found 8 channels
        iio:device2, adar1000_csb_1_1: found 9 channels
        iio:device20, axi-ad9081-rx-hpc: found 17 channels
        iio:device21, axi-core-tdd: found 4 channels
        iio:device22, one-bit-adc-dac: found 6 channels
        iio:device23, one-bit-adc-dac: found 6 channels
        iio:device24, one-bit-adc-dac: found 5 channels
        iio:device25, axi-ad9081-tx-hpc: found 24 channels
        iio:device3, adar1000_csb_1_2: found 9 channels
        iio:device4, adar1000_csb_1_3: found 9 channels
        iio:device5, adar1000_csb_1_4: found 9 channels
        iio:device6, adar1000_csb_2_1: found 9 channels
        iio:device7, adar1000_csb_2_2: found 9 channels
        iio:device8, adar1000_csb_2_3: found 9 channels
        iio:device9, adar1000_csb_2_4: found 9 channels
        iio_sysfs_trigger: found 0 channels

HMC7044 PLL Lock

root@analog:~# cat /sys/kernel/debug/iio/iio:device19/status
--- PLL1 ---
Status: Locked
Using:  CLKIN1 @ 100000000 Hz
PFD:    10000 kHz
--- PLL2 ---
Status: Locked (Synchronized)
Frequency:      3000000000 Hz (Autocal cap bank value: 12)
SYSREF Status:  Valid & Locked
SYNC Status:    Synchronized
Lock Status:    PLL1 & PLL2 Locked

The HMC7044 reference clock priority is: [CLKIN1 → CLKIN0 → CLKIN2 → CLKIN3]. In this example, an external reference clock of 100MHz is applied and is selected as the reference clock source. If no external clock is detected, then the clock priority will be sequenced and the next available source will be chosen. See the Hardware Clocking Architecture for additional information.

JESD Status

root@analog:~# jesd_status
xl(DEVICES) Found 2 JESD204 Link Layer peripheralsqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx
xx                                                                            xx
xx(0): axi-jesd204-rx/84a90000.axi-jesd204-rx  [*]                            xx
xx(1): axi-jesd204-tx/84b90000.axi-jesd204-tx                                 xx
xxLink is                      enabled                                        xx
xxLink Status                  DATA                                           xx
xxMeasured Link Clock (MHz)    250.026                                        xx
xxReported Link Clock (MHz)    250.000                                        xx
xxMeasured Device Clock (MHz)  250.026                                        xx
xxReported Device Clock (MHz)  250.000                                        xx
xxDesired Device Clock (MHz)   250.000                                        xx
xxLane rate (MHz)              10000.000                                      xx
xxLane rate / 40 (MHz)         250.000                                        xx
xxLMFC rate (MHz)              7.812                                          xx
xxSYSREF captured              Yes                                            xx
xxSYSREF alignment error       No                                             xx
xxSYNC~                                                                       xx
xl(LANE STATUS)qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx
xxLane#                             0      1      2      3                    xt
xxErrors                            0      0      0      0                    xj

Firmware Identifiers

A unique identifier will be returned for the Image, system.dtb, and BOOT.BIN files installed on the SD card using the md5 command.

root@analog:~# md5sum /boot/Image
3c1ac2b114bbde82b38fc0463bf03dbd  /boot/Image

root@analog:~# md5sum /boot/system.dtb
bfc14855246807f4e62a2f71ce65deec  /boot/system.dtb

root@analog:~# md5sum /boot/BOOT.BIN
a77ca8194b457c2d020a44d83568cc52  /boot/BOOT.BIN

The returned identifiers in the example may not match the most recent firmware file versions. This is an example to show the use of the md5 command.


For additional questions or support, please visit the Engineering Zone forum at ADEF.

X Band Development Platform Main Page

resources/eval/user-guides/x-band-platform/software.txt · Last modified: 14 Feb 2024 18:35 by Brandon Lopez