FMCOMMS5 HDL Project
Overview
The FMCOMMS5 is a high-speed analog module designed to showcase the AD9361 in multiple-input, multiple-output (MIMO) applications. The AD9361 is a high performance, highly integrated RF transceiver that operates from 70 MHz to 6 GHz, and supports bandwidths from less than 200 kHz to 56 MHz. The FMCOMMS5 supports dual AD9361 devices, allowing for the creation of a 4x4 MIMO system. This platform is intended to enable the prototyping and development of many software defined radio applications.
The AD9361 consists of 2 receive and 2 transmit paths (2 Rx, 2 Tx).
The only difference between AD9361 and AD9364 (1 Rx, 1 Tx) is the number of channels. Software, HDL, pinout, etc - is all the same.
The digital interface consists of 12 bits of DDR data and supports full duplex operation in all configurations up to 4x4. The transmit and receive data paths share a single clock. The data is sent or received based on the configuration (programmable) from separate transmit and to separate receive chains.
Supported boards
Supported devices
Supported carriers
Block design
In the receive direction, each component of the delineated data is passed to a PN monitor. The monitors validates the digital interface signal capture and timing. The data then optionally DC-filtered, corrected for I/Q offset and phase mismatches and is written to the external DDR memory via DMA. An optional off-line FFT core may be used to generate a spectrum plot.
In the transmit direction, complex I and Q signals are generated for each RF. The digital source could either be an internal DDS or from the external DDR via VDMA. The internal DDS phase and frequency are programmable.
Multi-cores operation
The core supports multiple instances of the same synchronized to a common clock. The FMCOMMS5 uses two instances of this core synchronized to a common clock. The data is recovered in each individual clock domain and transfers the data to a single clock domain. The multiple cores must all be using the same clock.
Block diagram
The data path and clock domains are depicted in the below diagram.
Clock scheme
The clocks are managed by the device and are software programmable. Please refer to the device data sheet for the various clocks within the device.
The board provides a 40MHz crystal for the AD9361.
The clock divider module will divide the input frequency by 2 when in 1R1T mode, and by 4 in 2R2T mode, to obtain the desired maximum frequency per channel: 61.44MHz.
The DMA clock frequency depends on the carrier:
when on ZC702: 150MHz
when on ZC706: 200MHz
when on ZCU102: 250MHz
Configuration modes
The AD9361 IP in this HDL project is configured to work only in LVDS interface; it supports two configuration modes:
2R2T - 2x receive and 2x transmit RF channels
1R1T - 1x receive and 1x transmit RF channel
Both support only the dual port half duplex operating mode. The maximum data rate (for combined I and Q words) is 61.44MSPS in DDR. For more details about these modes, check the AD9361 Reference Manual, Table 48 “Maximum Data Rates and Signal Bandwidths”.
CPU/Memory interconnects addresses
The addresses are dependent on the architecture of the FPGA, having an offset added to the base address from HDL (see more at CPU/Memory interconnects addresses).
Instance |
Zynq/Microblaze |
ZynqMP |
---|---|---|
axi_ad9361_adc_dma |
0x7C40_0000 |
0x9C40_0000 |
axi_ad9361_dac_dma |
0x7C42_0000 |
0x9C42_0000 |
axi_ad9361_0 |
0x7902_0000 |
0x9902_0000 |
axi_ad9361_1 |
0x7904_0000 |
0x9904_0000 |
SPI connections
The SPI signals are controlled by a separate AXI based SPI core.
SPI type |
SPI manager instance |
SPI subordinate |
CS |
---|---|---|---|
PS |
SPI 0 |
first AD9361 instance |
0 |
PS |
SPI 0 |
second AD9361 instance |
1 |
PS |
SPI 0 |
AD5355 |
2 |
GPIOs
The device control and monitor signals are interfaced to a GPIO module.
ZC706
GPIO signal |
Direction |
HDL GPIO EMIO |
Zynq-700 GPIO |
---|---|---|---|
gpio_resetb_1 |
INOUT |
59 |
113 |
gpio_ad5355_lock |
INOUT |
58 |
112 |
gpio_ad5355_rfen |
INOUT |
57 |
111 |
gpio_calsw_4_1 |
INOUT |
56 |
110 |
gpio_calsw_3_1 |
INOUT |
55 |
109 |
gpio_calsw_2_1 |
INOUT |
54 |
108 |
gpio_calsw_1_1 |
INOUT |
53 |
107 |
gpio_txnrx_1 |
OUT |
52 |
106 |
gpio_enable_1 |
OUT |
51 |
105 |
gpio_en_agc_1 |
INOUT |
50 |
104 |
gpio_txnrx_0 |
INOUT |
49 |
103 |
gpio_enable_0 |
INOUT |
48 |
102 |
gpio_en_agc_0 |
INOUT |
47 |
101 |
gpio_resetb_0 |
OUT |
46 |
100 |
gpio_debug_4_1 |
INOUT |
43 |
97 |
gpio_debug_3_1 |
INOUT |
42 |
96 |
gpio_debug_2_1 |
INOUT |
41 |
95 |
gpio_debug_1_1 |
INOUT |
40 |
94 |
gpio_ctl_0[3:0] |
INOUT |
39:36 |
93:90 |
gpio_ctl_1[3:0] |
INOUT |
35:32 |
89:86 |
ZCU102
GPIO signal |
Direction |
HDL GPIO EMIO |
Zynq MP GPIO |
---|---|---|---|
gpio_resetb_1 |
OUT |
65 |
143 |
gpio_ad5355_lock |
IN |
64 |
142 |
gpio_ad5355_rfen |
OUT |
63 |
141 |
gpio_calsw_4_1 |
OUT |
62 |
140 |
gpio_calsw_3_1 |
OUT |
61 |
139 |
gpio_calsw_2_0 |
OUT |
60 |
138 |
gpio_calsw_1_0 |
OUT |
59 |
137 |
gpio_txnrx_1 |
OUT |
58 |
136 |
gpio_enable_1 |
OUT |
57 |
135 |
gpio_en_agc_1 |
OUT |
56 |
134 |
gpio_txnrx_0 |
OUT |
55 |
133 |
gpio_enable_0 |
OUT |
54 |
132 |
gpio_en_agc_0 |
OUT |
53 |
131 |
gpio_resetb_0 |
OUT |
52 |
130 |
gpio_sync |
OUT |
51 |
129 |
gpio_debug_4_0 |
OUT |
49 |
127 |
gpio_debug_3_0 |
OUT |
48 |
126 |
gpio_debug_2_0 |
OUT |
47 |
125 |
gpio_debug_1_0 |
OUT |
46 |
124 |
gpio_ctl_1 |
OUT |
45:42 |
123:120 |
gpio_ctl_0 |
OUT |
41:38 |
119:116 |
gpio_status_1 |
IN |
37:30 |
115:108 |
Interrupts
Below are the Programmable Logic interrupts used in the project.
Instance name |
HDL |
Linux Zynq |
Actual Zynq |
Linux ZynqMP |
Actual ZynqMP |
---|---|---|---|---|---|
axi_ad9361_adc_dma |
13 |
57 |
89 |
109 |
141 |
axi_ad9361_dac_dma |
12 |
56 |
88 |
108 |
140 |
Building the HDL project
The design is built upon ADI’s generic HDL reference design framework. ADI distributes the bit/elf files of these projects as part of the ADI Kuiper Linux. If you want to build the sources, ADI makes them available on the HDL repository. To get the source you must clone the HDL repository.
Go to the hdl/projects/fmcomms5/$carrier location and run the make command.
Linux/Cygwin/WSL
~$
cd hdl/projects/fmcomms5/zc706
~/hdl/projects/fmcomms5/zc706$
make
A more comprehensive build guide can be found in the Build an HDL project user guide.
Resources
More information
Support
Analog Devices, Inc. will provide limited online support for anyone using the reference design with ADI components via the EngineerZone FPGA reference designs forum.
For questions regarding the ADI Linux device drivers, device trees, etc. from our Linux GitHub repository, the team will offer support on the EngineerZone Linux software drivers forum.
For questions concerning the ADI No-OS drivers, from our No-OS GitHub repository, the team will offer support on the EngineerZone microcontroller No-OS drivers forum.
It should be noted, that the older the tools’ versions and release branches are, the lower the chances to receive support from ADI engineers.