Hello everyone,I am a university student from Japan studying FPGAs, and I would be very grateful for your help with a PYNQ project. Please excuse any mistakes in my English.I am currently working on a custom HDMI passthrough design using the AXI VDMA on a PYNQ-Z1 board. I have successfully built the block design in Vivado and generated the bitstream.When I load the overlay in a Jupyter Notebook using the Python script below, the code runs to completion without any errors. However, my external monitor connected to the HDMI output port shows “No Signal” and remains blank.
System Environment:
-
Board: PYNQ-Z1
-
Vivado Version: 2025.1
Block Design Overview:
hdmi_pass_ps.pdf (106.8 KB)
Python Script:
from pynq import Overlay
from pynq import allocate
import numpy as npLoad the bitstream
ol = Overlay(“hdmi_pass_ps_3.bit”)
=======================================================
1. Configure the TPG (Test Pattern Generator)
=======================================================
Assuming the TPG instance in Vivado is named ‘v_tpg_0’
tpg = ol.v_tpg_0
TPG register offsets
AP_CTRL = 0x00
WIDTH_REG = 0x10
HEIGHT_REG = 0x18
ENABLE_INPUT_REG = 0x28print(“Configuring TPG…”)
Stop and reset the TPG
tpg.write(AP_CTRL, 0x80)
Set resolution
tpg.write(HEIGHT_REG, 1080)
tpg.write(WIDTH_REG, 1920)Enable passthrough mode (1)
tpg.write(ENABLE_INPUT_REG, 1)
Start TPG with auto-restart enabled
tpg.write(AP_CTRL, 0x81) print(“TPG started in passthrough mode.”)
=======================================================
2. Configure the VDMA
=======================================================
vdma = ol.axi_vdma_0
dma_send = vdma.writechannel
dma_recv = vdma.readchannelDefine video resolution and format
width = 1920
height = 1080
pixel_bytes = 3
frame_count = 3 # Using 3 frame buffersAllocate frame buffers in DDR memory
frame_buffer = allocate(shape=(frame_count, height, width, pixel_bytes), dtype=np.uint8)
Set the frame buffers for each VDMA channel
dma_send.frame_buffer(frame_buffer)
dma_recv.frame_buffer(frame_buffer)Start the VDMA channels
print(“Starting VDMA…”)
dma_send.start()
dma_recv.start()print(“VDMA passthrough started.”)
What I’ve Tried:
- I have confirmed that both the HDMI input source (my PC) and the external monitor are set to 1920x1080 resolution.
Could anyone suggest what I might be missing, or what I should check next? For example, are there common issues with clocking or the Video Timing Controller (V_TC) that could cause this?
Any help or advice would be greatly appreciated.
Thank you!