3. Zynq视频输入通路设计
在Zynq视频处理系统中,输入通路决定了整条流水线的“源头质量”。无论后续是图像增强、编码压缩还是AI推理,一旦输入采集阶段出现丢帧、撕裂、色彩错位或时序违例,后级算法再强也难以恢复。Zynq的可编程逻辑(PL)与处理系统(PS)协同架构,为多类型视频输入提供了灵活的实现基础:PL负责高速串行接收、像素重组与缓冲,PS负责寄存器配置、状态监控与上层调度。本节围绕MIPI CSI-2、HDMI、SDI三类主流输入,以及视频解码芯片的I2C/SPI控制、输入时序约束与采集实现展开。
三类输入通路的物理层与协议层差异
MIPI CSI-2常见于图像传感器和嵌入式摄像头模组,采用D-PHY或C-PHY差分对传输,典型配置为1~4条数据lane加1条时钟lane,单lane速率可达1.5~2.5 Gbps。CSI-2协议层包含短包(帧同步、行同步)和长包(有效像素数据),像素格式以RAW10、RAW12、YUV422、RGB888为主。在Zynq-7000上通常借助SelectIO或专用MIPI IP实现D-PHY接收,再经CSI-2 RX Controller解包为AXI4-Stream像素流。
HDMI输入面向消费级摄像机、机顶盒和PC显卡,电气层为TMDS差分信号,包含3条数据通道和1条时钟通道。HDMI 1.4支持最高1080p60,HDMI 2.0提升至4K60但需要更高线速率。接收端需完成TMDS解码、通道对齐、视频时序提取和音频分离。Zynq上常用HDMI RX Subsystem IP,其内部集成TMDS接收器、视频时序控制器和AXI4-Stream输出接口。
SDI输入主要用于广播级和专业视频设备,采用75Ω同轴电缆传输,常见标准包括SD-SDI(270 Mbps)、HD-SDI(1.485 Gbps)、3G-SDI(2.97 Gbps)乃至12G-SDI。SDI信号经过电缆均衡、时钟恢复和串并转换后,由SDI解码器提取视频、嵌入音频和辅助数据。Zynq PL中可通过GT收发器或专用SDI IP实现接收,输出BT.1120或AXI4-Stream格式。
视频解码芯片配置与I2C/SPI控制
对于模拟视频输入(如CVBS、YPbPr)或需要格式转换的场景,通常在前端接入视频解码芯片,例如TVP5150、ADV7180、ADV7611等。这类芯片通过I2C或SPI接口接受寄存器配置,输出BT.656、BT.1120或MIPI CSI-2格式的数字视频流。以ADV7611为例,其I2C从地址为0x98(7位地址0x4C),上电后需依次配置输入通道选择、EDID、HDMI接收使能、色彩空间转换等寄存器。典型初始化序列如下:
// ADV7611 简化初始化示例(I2C 7位地址 0x4C)
i2c_write(0x4C, 0x00, 0x00); // 选择 HDMI 端口 A
i2c_write(0x4C, 0x01, 0x80); // 使能 HDMI 接收
i2c_write(0x4C, 0x02, 0x03); // 设置输出格式为 RGB888
i2c_write(0x4C, 0x03, 0x1E); // 配置色彩空间转换矩阵
i2c_write(0x4C, 0x04, 0x01); // 启动视频输出
// 回读状态寄存器确认锁定
status = i2c_read(0x4C, 0x10);
if (status & 0x01) { /* HDMI 已锁定 */ }
在Zynq中,I2C控制器可由PS端的I2C外设实现,也可在PL中通过AXI IIC IP实现。PS端I2C的优势是软件成熟、中断处理方便,适合配置频率较低(100~400 kHz)的寄存器写入;PL端I2C则更适合需要精确时序控制或多路复用的场景。SPI控制通常用于需要更高配置带宽的解码芯片或FPGA配置,Zynq PS端提供SPI控制器,PL端也可通过AXI Quad SPI IP扩展。
输入时序约束与采集实现
视频输入时序约束是保证采集稳定性的关键。以1080p60为例,像素时钟为148.5 MHz,行总周期为2200像素时钟,其中有效像素1920,行消隐280;场总周期为1125行,其中有效行1080,场消隐45。在Zynq PL中,需要为像素时钟创建时序约束,确保建立时间和保持时间满足要求。典型XDC约束如下:
# 1080p60 像素时钟约束
create_clock -period 6.734 -name pix_clk [get_ports pix_clk_in]
# 输入数据相对于像素时钟的建立/保持约束
set_input_delay -clock pix_clk -max 2.0 [get_ports {vid_data[*]}]
set_input_delay -clock pix_clk -min 1.0 [get_ports {vid_data[*]}]
# 行同步与场同步约束
set_input_delay -clock pix_clk -max 2.0 [get_ports {vid_hsync vid_vsync vid_de}]
set_input_delay -clock pix_clk -min 1.0 [get_ports {vid_hsync vid_vsync vid_de}]
采集实现通常采用“异步FIFO + 跨时钟域同步”的结构。输入像素流在像素时钟域下写入FIFO,AXI4-Stream接口在PL系统时钟域下读出,FIFO深度需覆盖至少一行像素加消隐余量。对于1080p60,一行有效像素1920个,若像素格式为RGB888(24位),则一行数据量为1920×3=5760字节。FIFO深度建议设置为8192字节以上,以吸收时钟抖动和突发传输延迟。
采集状态机一般包含以下状态:等待帧同步(VSYNC上升沿或FS短包)、等待行有效(DE拉高或LS短包)、像素写入FIFO、行结束处理、帧结束处理。在帧结束时可产生中断通知PS端读取帧缓冲。若使用VDMA,则需配置S2MM通道,设置帧缓冲地址、帧长度和循环模式,并通过AXI4-Stream接口接收像素数据。
多路输入的选择与切换策略
实际系统常需支持多路输入切换,例如同时接入MIPI摄像头和HDMI信号源。此时可在PL中设计一个输入多路复用器(MUX),根据PS端下发的控制寄存器选择当前活跃输入通道。切换时需注意:先停止当前通道的采集,清空FIFO,再配置新通道的接收参数,最后重新使能采集。对于HDMI和SDI这类需要锁定时间的接口,切换后应等待锁定状态寄存器确认稳定后再开始采集,避免输出花屏或撕裂。
若多路输入需要同时采集,则应为每路分配独立的FIFO和VDMA通道,并在PS端通过中断或轮询方式分别读取。此时DDR带宽成为关键约束:以两路1080p60 RGB888为例,每路像素率为148.5 Mpixel/s,每像素3字节,合计约891 MB/s的写入带宽,加上读取和显示带宽,需确保DDR控制器配置和AXI互联带宽满足需求。
采集结果验证与常见问题判断
采集是否成功可通过以下方式判断:读取VDMA状态寄存器确认帧计数递增;通过ILA抓取AXI4-Stream的TUSER(帧起始)和TLAST(行结束)信号,确认时序符合预期;将采集到的帧缓冲通过SDK或Linux应用读出,检查图像是否完整、色彩是否正确。常见问题包括:I2C配置失败导致无数据输出、像素时钟约束不足导致间歇性花屏、FIFO溢出导致丢行、VDMA帧缓冲地址未对齐导致传输错误。排查时建议先确认I2C通信正常,再用ILA观察像素时钟和数据有效信号,最后检查DDR带宽和VDMA配置。
输入通路设计是Zynq视频系统的第一道关口。理解三类接口的物理层差异、掌握解码芯片的寄存器配置方法、建立正确的时序约束、设计可靠的跨时钟域采集结构,才能为后续的图像处理和编码提供稳定、高质量的像素流。