VDMA interrupt problem

  • Ubuntu 22.04
  • Board: KR260
  • pynq 3.0.1
  • IP AXI VDMA

Hi I am trying to use AXI-VDMA in pynq. I am facing a problem when I try to use the axi_vdma I got the next error:

overlay.axi_vdma_0
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [59], in <cell line: 1>()
----> 1 overlay.axi_vdma_0

File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/overlay.py:363, in Overlay.__getattr__(self, key)
    358 """Overload of __getattr__ to return a driver for an IP or
    359 hierarchy. Throws an `RuntimeError` if the overlay is not loaded.
    360 
    361 """
    362 if self.is_loaded():
--> 363     return getattr(self._ip_map, key)
    364 else:
    365     raise RuntimeError("Overlay not currently loaded")

File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/overlay.py:904, in _IPMap.__getattr__(self, key)
    902 ipdescription = self._description["ip"][key]
    903 try:
--> 904     driver = ipdescription["driver"](ipdescription)
    905 except UnsupportedConfiguration as e:
    906     warnings.warn(
    907         "Configuration if IP {} not supported: {}".format(key, str(e.args)),
    908         UserWarning,
    909     )

File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/lib/video/dma.py:580, in AxiVDMA.__init__(self, description, framecount)
    578 memory = description["device"].default_memory
    579 if has_s2mm:
--> 580     self.readchannel = AxiVDMA.S2MMChannel(self, self.s2mm_introut, memory)
    581 if has_mm2s:
    582     self.writechannel = AxiVDMA.MM2SChannel(self, self.mm2s_introut, memory)

AttributeError: 'AxiVDMA' object has no attribute 's2mm_introut'

Regarding, the block design I have used two block desgins:

  • First did not have the interrupts connected.
  • Second with the interrupts. I post an image here.

Is there something I am missing?
Thanks in advance,
Ricardo Tapiador

This error shows up only when the interrupt pin is not connected.
The second problem could be, after the first time you have tried with the bitstream without interrupt, you have a straight way tried to load the bitstream with interrupt without restarting the program, but because of a bug in pynq 3.0.1, the temporary hwh file in the buffer doesn’t change so you have not seen any effect (the solution is to start with PL.reset() before loading the overlay). Or Another reason could be, you have copied only the bitstream file, not the updated hwh file.

Mizan

Hi @mizan , thanks for the reply.
If you see the block design the interrupts are connected.
Also, I am concerned about the cache problem when loading an overlay, I reseted the board, in order to test.
I am starting to think if this is an error of the last version of pynq.

Kind regards,

Ricardo

Hi Ricardo,
I currently don’t have kr260 in my hand. But I can confirm that almost similar design with more vdmas running on the zcu104 board with pynq 3.0.1 has no problem so far.

Have you tried replacing HWH file with updated one? also PL.reset() before loading overlay?

Mizan

@Ricardo_Tapiador

Try add AXI-interrupt above the US-ZYNQ interrupt pin (IRQ 0).
The structure of the device-tree of PYNQ depends on the version you using. (Old version is more subject to this structure).
Try and see if it resolve the issue.

ENJOY~

Thanks for your answers, I managed to solve the issue. However, when I am sending the image over the VDMA is getting stucked reading the output from the readchannel, possibly I am doing something wrong.

input_w = 1440 # cols
input_h = 1080 # rows

vdma_in = vdma.writechannel
vdma_out =vdma.readchannel
vdma_in.mode = VideoMode(input_w, input_h, 8)
vdma_out.mode = VideoMode(input_w, input_h,8)

in_buffer = allocate(shape=(1080, 1440), 
                           dtype=np.uint8, cacheable=1)
out_buffer = allocate(shape=(1080, 1440), 
                            dtype=np.uint8, cacheable=1)
# Configure VDMA
in_buffer[:] = np.array(original_image)
# Start IPs
vdma_in.start()
vdma_out.start()

vdma_in.setframe(in_buffer)
out_buffer = vdma_out.readframe()

Is there a close loop example for the VDMA, I know there is for DMA but I have not seen any for VDMA.
All help is more than welcome.
Thanks in advance,
Ricardo.

I moved to IRQ1 now seems that pynq recognize the IP as AXI VDMA