pyadi-iio, on zedboard+fmcomms4 eval

I wanted to integrate Xilinx PYNQ framework on a Zedboard with an Fmcomms4 (ad9364) radio.  Starting point was as follows:

Ubuntu 16.04 in a Vmware VM (per Petalinux 2018.3 dev docs)

ADI hdl repo, hdl_2019_r1 branch, project/fmcomms2/zed build for zedboard

ADI meta-adi repo, 2019_R1

Vivado 2018.3.1, Petalinux 2018.3

PYNQ v2.6 arm rootfs

Everything boots up fine and behaves like a normal PYNQ environment.

To verify the ad9364(), I loaded ADI libiio and pyadi_iio (both version 0.0.7, 0.0.8) and

wrote a simple script (below).

When I run the script, I get the follow error out of the module, i.e. it seems to attempt to modify some radio attributes that don't exist:

pynq.567> sudo python3
TX 500.000 mhz
TX enabled channels [0]
Traceback (most recent call last):
File "", line 25, in <module>
File "/usr/local/lib/python3.6/dist-packages/adi/", line 394, in tx
File "/usr/local/lib/python3.6/dist-packages/adi/", line 82, in disable_dds
self.dds_enabled = np.zeros(self._num_tx_channels * 2, dtype=bool)
File "/usr/local/lib/python3.6/dist-packages/adi/", line 122, in dds_enabled
self.__update_dds("raw", value)
File "/usr/local/lib/python3.6/dist-packages/adi/", line 58, in __update_dds
chan.attrs[attr].value = str(int(value[indx]))
IndexError: index 4 is out of bounds for axis 0 with size 4

If I instance the radio as sdr.ad9361("local:"), then the script runs as intended, ie I see RF output where it should be on the spectrum analyzer.

My question is if anyone has encountered this issue before, or if I'm missing something in my script.  Of course, could easily be related to

some OS/driver integration with Pyadi.  


import adi, time
import numpy as np


sample_rate = 10e6
freq = 500e6
tx_gain = 50

sdr.sample_rate = int(sample_rate)
sdr.tx_lo = int(freq)
sdr.tx_hardware_gain_chan0 = tx_gain
sdr.tx_enabled_channels = [0]

print("TX {:.3f} mhz".format(sdr.tx_lo/1e6))
print("TX enabled channels {}".format(sdr.tx_enabled_channels))

N = 10000
t = np.arange(N)/sample_rate
samples = 0.5*np.exp(2.0j*np.pi*1000e3*t)
samples *= 2**14
samples = np.round(np.real(samples), 0) + 1j*np.round(np.imag(samples), 0)

sdr.tx_cyclic_buffer = True