Stuck at dma.recvchannel.wait() in DMA → DAC → ADC → DMA Loop

Hi everyone,

I’m currently trying to implement a simple DMA → DAC → ADC → DMA loopback on my ZCU111 board using PYNQ. My goal is to send a waveform from the PS via DMA to the DAC, loop it back to the ADC through the analog path, and then retrieve the sampled data back into DDR using the DMA receive channel.

My Block Design and configuration details are provided as follows:

block design
system.pdf (117.2 KB)

Settings:








PYNQ Code:



However, I’m currently stuck at the following line in my Python code:

dma.recvchannel.wait()  # program hangs here

The program hangs at wait(), and no data is ever received.


Suspected Issues:

  1. TLAST not being generated on the ADC → DMA (S2MM) path, causing the DMA to never detect end-of-frame.
  2. The RF-ADC might not be outputting any data, due to incorrect configuration (e.g., Mixer, Decimation, Tile Clock, etc.).
  3. If the number of samples I want to transfer is large e.g., 2048, it will get stuck at dma.sendchannel.wait(). If the number is small, e.g. 256, it will get stuck at dma.recvchannel.wait().

Could someone please help me identify what might be wrong? Are there any critical settings in the RFDC IP or Tile Clocking tab or Subset Converter that I might have misconfigured?

Any suggestions or advice are greatly appreciated.

Thank you in advance!

Best regards,
Steven

Hi @StevenG,

Welcome to the PYNQ community.

I wrote a series of blogs to add ILA in the design to debug this type of issues.
I would suggest you add ILAs at different points in the data path and check if data is flowing.

Mario