1. 项目概述与核心挑战
在多媒体处理领域,实时视频拼接是一个极具实用价值的技术方向。这次分享的FPGA视频拼接项目,成功实现了将HDMI(1920x1080@60)、摄像头(960x540@30)和以太网(960x540)三路不同规格的视频源,通过HDMI信号复用形成四路输入,最终输出为完整拼接画面的解决方案。这个项目在FPGA竞赛中获得国家级二等奖,其技术难点主要在于三个方面:
首先是多源异构问题。三路输入视频的分辨率、帧率和色彩空间各不相同(HDMI为1080p@60Hz的24位RGB,摄像头为540p@30Hz的16位RGB,以太网为540p的16位RGB)。这种差异会导致同步信号处理、像素对齐和色彩空间转换等一系列技术挑战。
其次是实时性要求。视频处理对延迟极其敏感,特别是当输入源帧率不同时(60Hz与30Hz混用),需要设计合理的缓冲机制。我们实测发现,直接使用双缓冲会导致约3帧的延迟,而采用自适应的动态缓冲策略可以将延迟控制在1.5帧以内。
最后是资源优化。在紫光同创盘古-50K这款中等规模的FPGA上实现四路视频处理,需要精心设计流水线结构和存储方案。通过测试对比,采用行缓冲(Line Buffer)比全帧缓冲(Frame Buffer)节省约78%的BRAM资源,这对项目成功至关重要。
2. 硬件架构设计解析
2.1 平台选型考量
选择紫光同创盘古-50K开发板主要基于三个技术指标:首先是其内置的4.5Mb BRAM资源,能满足四路视频的行缓冲需求;其次是具备足够的DSP模块(共240个),可支持可能的像素运算;最重要的是该芯片的IO带宽足够,能稳定处理HDMI的148.5MHz像素时钟。
在接口设计上,我们为每路视频源配置了独立的物理层处理:
- HDMI输入:通过ADV7611解码芯片转换为并行RGB
- 摄像头输入:使用DVP接口直接连接OV5640模组
- 以太网视频:通过RGMII接口接收H.264流,由内置软核解码
2.2 时钟域规划
多视频源带来的最大挑战是时钟域交叉(CDC)问题。项目中存在四个主要时钟:
- HDMI像素时钟(148.5MHz)
- 摄像头像素时钟(74.25MHz)
- 以太网解码时钟(100MHz)
- 系统主时钟(200MHz)
我们采用异步FIFO实现时钟域隔离,每个FIFO深度经过精确计算。以HDMI到系统时钟的转换为例,FIFO深度计算公式为:
code复制Depth = (Δf × L) / f_slow
其中Δf=200-148.5=51.5MHz,L=3(安全系数)
计算结果为51.5×3/148.5≈1.04 → 实际取2的幂次方即2
2.3 存储架构设计
视频拼接的核心是智能的存储管理。我们采用三级缓存结构:
- 输入行缓冲:每路视频单独配置,深度为1行像素
- 共享帧缓存:双端口BRAM实现,存储重缩放后的图像
- 输出FIFO:解决显示端时序差异
具体到BRAM使用量,以1080p的YUV422格式为例:
code复制单行存储量 = 1920像素 × 16bit = 3840字节
四路总需求 = 3840×4 = 15360字节 ≈ 15KB
实际配置为16KB,留有足够余量。
3. Verilog实现关键技术
3.1 视频同步处理模块
同步信号处理是保证画面稳定的关键。我们设计的状态机包含以下状态:
verilog复制typedef enum {
SYNC_IDLE,
SYNC_DETECT_HSYNC,
SYNC_DETECT_VSYNC,
SYNC_PROCESS_ACTIVE,
SYNC_PROCESS_BLANKING
} sync_state_t;
对于不同步的输入源,采用自适应同步策略:
- 以HDMI为主时钟基准
- 检测其他信号VSYNC沿与HDMI的相位差
- 动态调整行缓冲的读取时机
实测显示,这种方案可使不同源之间的同步误差控制在±2个像素时钟周期内。
3.2 像素数据处理流水线
像素处理采用五级流水线结构:
- 色彩空间转换(对摄像头和以太网的16位RGB转24位)
- 分辨率缩放(双线性插值算法)
- 边缘增强(3x3卷积核)
- 色彩校正(矩阵运算)
- 输出合成
关键缩放算法实现如下:
verilog复制// 双线性插值核心代码
always @(posedge clk) begin
if (en) begin
pixel_out = (a * (x1 - x) * (y1 - y) +
b * (x - x0) * (y1 - y) +
c * (x1 - x) * (y - y0) +
d * (x - x0) * (y - y0)) >> 16;
end
end
3.3 动态拼接控制
通过寄存器配置实现灵活的拼接布局:
verilog复制reg [15:0] h_start[3:0]; // 各区域水平起始位置
reg [15:0] v_start[3:0]; // 各区域垂直起始位置
reg [15:0] h_size[3:0]; // 各区域宽度
reg [15:0] v_size[3:0]; // 各区域高度
always @(*) begin
for (int i=0; i<4; i++) begin
if (hpos >= h_start[i] && hpos < h_start[i]+h_size[i] &&
vpos >= v_start[i] && vpos < v_start[i]+v_size[i]) begin
src_sel = i;
end
end
end
4. 系统集成与调试
4.1 PDS开发环境配置
在PDS 2022.1环境中需要特别注意:
- 综合策略选择"AreaOptimized_Medium"
- 为视频路径设置False Path约束
- 手动分配BRAM资源避免竞争
关键时序约束示例:
code复制create_clock -name vid_clk -period 6.73 [get_ports hdmi_clk]
set_false_path -from [get_clocks eth_clk] -to [get_clocks sys_clk]
4.2 资源占用优化
通过以下手段优化资源使用:
- 共享运算符:多个色彩转换模块复用同一组DSP
- 时分复用:将边缘增强和色彩校正安排在不同周期
- 位宽压缩:中间结果采用18位定点数
最终资源占用报告显示:
- LUT利用率:63%
- BRAM利用率:82%
- DSP利用率:45%
4.3 实测性能指标
使用SMPTE测试图卡进行质量评估:
- 拼接缝误差:<0.1像素
- 端到端延迟:8.3ms(约1.5帧)
- 功耗表现:3.2W(室温25℃)
5. 关键问题与解决方案
5.1 画面撕裂问题
初期测试发现拼接边界处存在撕裂现象,根本原因是:
- 各视频源VSYNC不同步
- 缓冲切换时机不当
解决方案:
- 引入帧同步信号(Genlock)
- 采用三缓冲机制
- 动态调整读取指针
修复后的时序图显示,各源VSYNC最大偏差从15行降低到2行。
5.2 色彩不一致问题
不同输入源的色彩表现差异明显,特别是:
- 摄像头偏绿
- 以太网偏红
通过以下校准流程解决:
- 采集24色标准色卡图像
- 计算各通道增益系数
- 在FPGA中实现3x3校正矩阵
校正参数示例:
verilog复制// 摄像头色彩校正矩阵
parameter real cmatrix_cam[3][3] = '{
'{1.12, -0.03, -0.09},
'{-0.15, 1.05, 0.10},
'{0.08, -0.12, 1.04}
};
5.3 时序违例处理
在实现1080p60输出时遇到时序问题:
- 关键路径建立时间不足(-0.3ns)
- 保持时间违例(+0.5ns)
优化手段包括:
- 重定时(Retiming)流水线级
- 插入寄存器平衡树
- 手动布局关键路径
优化后时序裕量达到:
- 建立时间:+0.8ns
- 保持时间:+1.2ns
6. 扩展应用与优化方向
当前架构支持通过修改参数实现:
- 任意布局拼接(2x2、1x3等)
- 动态源切换
- 叠加OSD信息
未来可扩展方向:
- 支持更多输入源(8路)
- 智能内容识别拼接
- 低延迟模式(<5ms)
实测将输出降为720p60时,资源占用可降低40%,这为功能扩展提供了空间。在图像质量与系统复杂度之间取得平衡,是这类项目的关键设计哲学。