1. 项目背景与需求解析
在视频采集与处理领域,专业级设备通常采用SDI接口,而消费级设备则普遍使用HDMI接口。如何将这两种不同标准的视频信号统一采集到计算机系统中,一直是广电制作、医疗影像、工业检测等场景下的刚需。传统方案往往需要分别购置SDI采集卡和HDMI采集卡,不仅成本高昂,还会占用多个PCIe插槽或USB接口。
这个FPGA方案的核心价值在于:
- 通过单设备实现双协议兼容
- 利用USB3.0的5Gbps带宽传输1080p60的无损视频流
- 基于FPGA的可编程特性支持后期功能扩展
- 相比商业采集卡可降低50%以上的硬件成本
2. 硬件架构设计
2.1 信号输入处理模块
SDI接口采用DS90CR287芯片完成LVDS转换,支持3G-SDI标准(最高1080p60)。HDMI输入则通过TFP401芯片解码TMDS信号,提取视频时序和像素数据。两种信号经过电平转换后,统一接入FPGA的Bank1和Bank2专用I/O组。
关键设计要点:SDI的BNC接口需要75Ω端接电阻,HDMI的ESD保护电路要选用TPD4S014这类专用芯片
2.2 FPGA选型与配置
选用Xilinx Artix-7 XC7A35T主要考虑:
- 内置的GTP收发器可直接处理SDI串行信号
- 逻辑单元足够实现双通道色彩空间转换
- 功耗控制在5W以内适合USB供电
- 成本约$25具有商业可行性
配置流程示例:
verilog复制// SDI RX初始化
sdi_rx #(
.DATA_WIDTH(20),
.CLOCKING_MODE("independent_clock")
) sdi_rx_inst (
.rx_serial_p(sdi_rx_p),
.rx_serial_n(sdi_rx_n),
.rx_rst(reset),
.rx_clk(sdi_clk)
);
2.3 USB3.0接口实现
采用CYUSB3014作为USB3.0控制器,通过32位FIFO接口与FPGA连接。需要特别注意:
- 固件需配置为GPIF II模式
- 批量传输端点设置为1024字节包大小
- 同步信号要满足USB3.0的8b/10b编码要求
实测传输性能:
| 分辨率 | 帧率 | 色彩深度 | 实际带宽 |
|---|---|---|---|
| 1080p | 30 | YUV422 | 1.2Gbps |
| 720p | 60 | RGB24 | 796Mbps |
3. FPGA逻辑设计详解
3.1 视频处理流水线
信号处理流程分为五个阶段:
- 输入检测:自动识别SDI/HDMI信号存在
- 时钟恢复:使用Xilinx MMCM生成像素时钟
- 色彩转换:YUV422转RGB24或NV12
- 帧缓冲:DDR3控制器管理图像存储
- 数据打包:添加UVC协议头部
3.2 关键IP核配置
- SDI RX核:启用SMPTE 292M兼容模式
- 色彩空间转换核:
- 系数矩阵按BT.709标准配置
- 启用双边滤波减少色度亚采样失真
- DDR3控制器:
- 时钟频率400MHz
- 突发长度设置为8
- 使用AXI4接口协议
4. 软件栈实现
4.1 固件开发
使用EZ-USB FX3 SDK开发固件,核心功能包括:
- UVC 1.5协议实现
- 同步传输等时端点配置
- 错误恢复机制(CRC校验重传)
4.2 驱动程序
基于Windows UVC 1.5类驱动扩展:
cpp复制// 自定义控制接口示例
#define IOCTL_GET_SDI_STATUS CTL_CODE(
FILE_DEVICE_UNKNOWN,
0x800,
METHOD_BUFFERED,
FILE_ANY_ACCESS)
4.3 上位机软件
使用DirectShow框架开发,功能模块:
- 视频预览(EVRCustomSink)
- 格式设置(IAMStreamConfig)
- 信号状态监测(自定义Filter)
5. 实测问题与解决方案
5.1 信号切换延迟
现象:切换输入源时出现3-5秒黑屏
解决方法:
- 在FPGA中实现输入信号预检测
- 提前初始化视频处理流水线
- 优化后延迟降至200ms以内
5.2 USB带宽不足
当传输1080p60 RGB24时出现丢帧:
- 改用YUY2色彩格式(带宽降低33%)
- 启用USB3.0 UASP协议(提升10%效率)
- 增加FPGA端压缩(基于DPCM的无损压缩)
5.3 发热问题
连续工作1小时后芯片温度达85℃:
- 更换为热阻更低的0.8mm间距BGA封装
- 在PCB背面增加散热焊盘
- 限制最高分辨率到1080p30
6. 性能优化技巧
-
FPGA时序收敛:
- 对跨时钟域信号使用XPM CDC宏
- 对视频数据总线设置set_max_delay约束
- 关键路径采用register retiming优化
-
USB传输优化:
c复制// 使用分散-聚集DMA传输
CyU3PDmaMultiChannelConfig_t dmaCfg = {
.size = 1024,
.count = 32,
.prodSckId = CY_U3P_PIB_SOCKET_0,
.consSckId = CY_U3P_UIB_SOCKET_CONS_3,
.dmaMode = CY_U3P_DMA_MODE_BYTE
};
- 电源管理:
- 对FPGA的Bank1/2使用独立的1.2V电源
- USB3.0 PHY的1.0V供电要加π型滤波
- 总电流需求需控制在900mA以内
这个方案经过三个版本迭代,目前已经可以稳定支持双路1080p30采集。在实际部署中发现,使用优质的同轴电缆和规范的接地处理,能显著降低SDI信号的误码率。对于需要更高帧率的场景,可以考虑改用Zynq-7000系列SoC,通过ARM核实现H.264硬件编码后再传输。