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往往是最容易点亮的接口,便于快速确认时序是否正确。
二、视频时序生成
所有显示接口的底层都依赖同一套视频时序。以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将流数据与同步信号合并成并行视频。配置流程如下:
- 通过AXI-Lite配置VDMA的源地址(帧缓冲基地址)、跨度(stride,通常等于一行字节数)、帧延迟和循环模式。
- 配置VTC为1080p60,使能生成器模式,输出hsync/vsync/data_enable。
- 启动VDMA的S2MM通道(若同时有输入)和MM2S通道,MM2S负责从DDR读数据送往显示。
- 检查VDMA状态寄存器中的halted位和错误位,确认没有欠载(underflow)。
ZynqMP则更多使用PS端的DisplayPort控制器或PL的DP IP,配置通过DRM/KMS框架完成。在Linux中,显示控制器表现为一个DRM设备,帧缓冲通过drmModeAddFB注册,时序通过drmModeSetCrtc设置。
五、输出通路整体数据流
下图展示了从帧缓冲到物理接口的完整信号链,以及各环节的关键配置对象。
从图中可以看出,输出通路的每个环节都有明确的配置对象:帧缓冲关注地址与对齐,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中断触发,驱动需要在中断处理中完成地址切换。