No Video Output on Monitor with Custom HDMI Passthrough Design on PYNQ-Z1

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 np

Load 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 = 0x28

print(“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.readchannel

Define video resolution and format

width = 1920
height = 1080
pixel_bytes = 3
frame_count = 3 # Using 3 frame buffers

Allocate 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!

Hi @koya1208,

Welcome to the PYNQ community.

A screenshot of your block diagram would be useful. Also note that this issue can be caused if the AXI4-Stream channel does not have all the necessary signals, tuser, tlast.

Mario