4. Zynq视频输出通路设计

视频输出通路是Zynq视频系统中从帧缓冲到物理显示接口的完整链路。与输入通路不同,输出通路的核心矛盾在于:显示控制器必须按照显示器要求的严格时序,持续、稳定地从帧缓冲中读取像素数据,并通过HDMI、DisplayPort或VGA/DVI等接口送出。任何时序偏差或带宽不足都会直接表现为花屏、闪烁或黑屏。本章围绕输出接口选型、视频时序生成、帧缓冲组织与显示控制器配置四个关键环节展开。

一、三种输出接口的定位与选择

Zynq平台上常见的视频输出接口有三类,它们在信号形式、带宽和适用场景上差异明显。

HDMI输出是消费级显示器和电视的主流接口,采用TMDS差分信号传输,一根线缆同时承载视频、音频和辅助信息。在Zynq-7000上,通常使用外部HDMI发送芯片(如ADV7511)通过I2C配置,PL侧输出并行RGB与同步信号,芯片完成TMDS编码。HDMI 1.4在1080p60下像素时钟约148.5MHz,需要PL逻辑和DDR带宽都能支撑。

DisplayPort输出采用微包架构,将视频数据打包成传输单元,支持更高的分辨率和多流传输。DP接口在ZynqMP上更为常见,可通过PS端的DP控制器或PL侧的DP发送IP实现。DP的链路训练(Link Training)是配置难点,需要根据线缆质量协商链路速率和通道数。

VGA/DVI输出适合工业显示器和调试场景。VGA是模拟信号,需要视频DAC将数字像素转为模拟电平,对PCB布线和滤波要求较高;DVI是数字接口,与HDMI在电气层兼容,只是不承载音频。在原型验证阶段,VGA/DVI往往是最容易点亮的接口,便于快速确认时序是否正确。

选型建议:产品化优先HDMI或DP;调试阶段可先用VGA/DVI验证时序,再切换到目标接口。

二、视频时序生成

所有显示接口的底层都依赖同一套视频时序。以1920×1080@60Hz为例,一帧包含垂直同步、垂直后沿、有效行、垂直前沿四个阶段,每一行又包含水平同步、水平后沿、有效像素、水平前沿。这些参数必须与显示器EDID中声明的时序匹配。

典型1080p60的时序参数为:像素时钟148.5MHz,水平总周期2200像素(有效1920 + 前沿88 + 同步44 + 后沿148),垂直总周期1125行(有效1080 + 前沿4 + 同步5 + 后沿36)。同步极性通常为负极性,即同步脉冲期间为低电平。

在Zynq中,时序生成有两种实现方式。一是使用PL逻辑编写时序发生器,用计数器产生hsync、vsync、data_enable和像素坐标;二是使用Xilinx的Video Timing Controller(VTC)IP核,通过AXI-Lite配置寄存器即可输出标准时序。VTC的优势在于参数可动态修改,适合需要切换分辨率的场景。

// 简化的1080p60时序参数(示例)
H_ACTIVE  = 1920;  H_FP = 88;  H_SYNC = 44;  H_BP = 148;
V_ACTIVE  = 1080;  V_FP = 4;   V_SYNC = 5;   V_BP = 36;
H_TOTAL   = 2200;  V_TOTAL = 1125;
PIXEL_CLK = 148.5 MHz;  // 2200 × 1125 × 60 ≈ 148.5M

三、帧缓冲的组织与带宽

帧缓冲是显示控制器读取像素的来源。在Zynq中,帧缓冲通常放在DDR中,由PS端的DDR控制器统一管理。对于1080p60、RGB888格式,单帧大小为1920×1080×3 ≈ 5.93MB。若采用双缓冲(前台显示、后台渲染),需要约11.9MB;三缓冲则约17.8MB。

带宽是更关键的约束。1080p60的像素率为148.5M像素/秒,RGB888每像素3字节,读取带宽需求约445MB/s。如果同时有视频输入写入、CPU访问和图形渲染,DDR带宽很容易成为瓶颈。实践中需要关注:显示控制器是否支持突发读取、是否启用缓存、AXI接口位宽是否足够(建议64位或128位)。

帧缓冲的地址对齐也很重要。多数显示控制器要求帧起始地址按64字节或更大边界对齐,否则会降低DDR访问效率。在Linux下,可通过drm框架的dumb buffer或CMA分配来保证对齐。

四、显示控制器配置

Zynq-7000通常使用PL侧的AXI VDMA + VTC + AXI4-Stream to Video Out组合。VDMA负责在DDR帧缓冲和流接口之间搬运数据,VTC提供时序,Video Out将流数据与同步信号合并成并行视频。配置流程如下:

  1. 通过AXI-Lite配置VDMA的源地址(帧缓冲基地址)、跨度(stride,通常等于一行字节数)、帧延迟和循环模式。
  2. 配置VTC为1080p60,使能生成器模式,输出hsync/vsync/data_enable。
  3. 启动VDMA的S2MM通道(若同时有输入)和MM2S通道,MM2S负责从DDR读数据送往显示。
  4. 检查VDMA状态寄存器中的halted位和错误位,确认没有欠载(underflow)。

ZynqMP则更多使用PS端的DisplayPort控制器或PL的DP IP,配置通过DRM/KMS框架完成。在Linux中,显示控制器表现为一个DRM设备,帧缓冲通过drmModeAddFB注册,时序通过drmModeSetCrtc设置。

欠载(underflow)是输出通路最常见的故障:显示控制器读取速度跟不上像素消耗速度,表现为画面撕裂或闪烁。排查时先确认DDR带宽是否被其他主设备抢占,再检查VDMA的突发长度和AXI位宽。

五、输出通路整体数据流

下图展示了从帧缓冲到物理接口的完整信号链,以及各环节的关键配置对象。

Zynq视频输出通路数据流与配置对象 DDR 帧缓冲 1920×1080×3 ≈ 5.93MB 双缓冲 ≈ 11.9MB 基地址 / stride / 对齐 AXI VDMA MM2S 读通道 突发长度 / AXI位宽 循环模式 / 帧延迟 VTC 时序控制器 H: 2200 / V: 1125 同步极性 / 前沿后沿 像素时钟 148.5MHz Video Out 合并 像素 + 同步信号 并行 RGB 输出 data_enable 门控 物理接口层 HDMI:TMDS 差分 + I2C 配置 DisplayPort:微包 + 链路训练 VGA/DVI:DAC 或 TMDS 并行视频 关键约束与检查点 带宽 445MB/s @1080p60 对齐 帧地址 64B 边界 欠载 VDMA halted / error 时序匹配 EDID 参数一致

从图中可以看出,输出通路的每个环节都有明确的配置对象:帧缓冲关注地址与对齐,VDMA关注突发与位宽,VTC关注时序参数,物理接口关注电气与协议配置。调试时按信号链逐级排查,先确认VTC输出的时序正确,再确认VDMA没有欠载,最后检查接口芯片的配置寄存器,可以快速定位问题所在。

六、实践中的配置要点

在Vivado中搭建输出通路时,建议先用VTC的示例时序生成测试图案,通过ILA观察hsync、vsync和data_enable的波形,确认时序参数与目标分辨率一致。然后接入VDMA,用固定的测试帧缓冲(例如全红或彩条)验证数据通路。最后再接入实际视频源或图形渲染结果。

在Linux环境下,若使用DRM框架,可通过modetest工具列出显示控制器支持的时序模式,并用modetest -s设置CRTC和帧缓冲。对于自定义PL显示控制器,需要编写对应的DRM驱动,实现crtc、encoder、connector和plane四个核心对象。

帧缓冲的更新策略也影响显示效果。单缓冲在更新时会出现撕裂,双缓冲通过page flip在垂直消隐期切换,三缓冲则进一步降低延迟。在Zynq上,page flip的时机由显示控制器的vsync中断触发,驱动需要在中断处理中完成地址切换。

输出通路的设计本质是“时序约束下的数据供给”:显示控制器以固定节奏消耗像素,帧缓冲和DDR必须在这个节奏下持续供给。理解这一点,就能把带宽、对齐、欠载、时序匹配等问题统一到同一个分析框架中。