1. 项目背景与设计思路
在工业视觉和高速视频采集领域,CameraLink接口因其高带宽和低延迟特性被广泛应用。但在项目初期,我们遇到了一个典型困境:CameraLink相机尚未到位,而编解码模块的验证工作必须立即开展。这种情况下,我们设计了一套基于FPGA的纯Verilog实现方案,通过HDMI-CameraLink-HDMI的闭环测试,巧妙解决了模块验证难题。
这个设计的核心思路是构建一个"数字铁人三项"链路:
- HDMI输入视频通过解码模块转换为RGB数据
- RGB数据经CameraLink编码模块生成LVDS差分信号
- 通过物理回环将输出信号重新接入CameraLink输入接口
- 解码后的RGB数据最终通过HDMI编码输出到显示器
这种设计的精妙之处在于:
- 仅需常见的HDMI设备(如笔记本和显示器)即可完成CameraLink全链路验证
- 视频效果可直接通过显示器观察,比传统波形验证更直观
- 同时验证了编码和解码模块的功能完整性
- 避免了采购专用CameraLink测试设备的成本
2. 硬件架构与信号流设计
2.1 系统整体架构
整个系统采用Xilinx 7系列FPGA作为处理核心,主要包含以下功能模块:
-
HDMI接收端:
- 采用Silicon Image SiI9135解码芯片
- 支持1080p@60Hz输入格式
- 输出24位RGB888格式视频流
-
CameraLink编码模块:
- 实现ChannelLink协议
- 将24位RGB+同步信号转换为28位并行数据
- 通过7对LVDS差分对输出
-
物理回环通路:
- 使用Samtec QTH系列高速连接器
- 阻抗控制100Ω差分对
- 最大支持85MHz像素时钟
-
CameraLink解码模块:
- 动态相位校准电路
- 28位数据重组逻辑
- 输出格式与HDMI接收端保持一致
-
HDMI发送端:
- 采用Analog Devices ADV7511编码芯片
- 支持EDID读取和热插拔检测
2.2 关键信号处理流程
视频数据在系统中的流转过程如下:
-
HDMI解码器输出:
- 像素时钟:148.5MHz(1080p@60Hz)
- 数据有效信号:DE
- 水平/垂直同步:HS/VS
- 像素数据:RGB[23:0]
-
CameraLink编码阶段:
verilog复制// 位宽转换状态机 always@(posedge clk) begin case(state) IDLE: if(vde) state <= TRANSFER; TRANSFER: begin ch0 <= {rgb[23:20], rgb[15:12]}; ch1 <= {rgb[19:16], rgb[11:8]}; ch2 <= {rgb[7:4], rgb[3:0]}; ch3 <= {4'h0, vsync, hsync, 2'b00}; end endcase end这段代码实现了24位RGB到28位CameraLink数据的转换,其中:
- ch0-ch2分别承载RGB各通道的高低位
- ch3包含同步信号和控制位
-
LVDS差分输出:
verilog复制genvar i; generate for(i=0; i<7; i=i+1) begin : lvds_out OSERDESE2 #( .DATA_RATE_OQ("DDR"), .DATA_WIDTH(4)) ser_inst ( .OQ(lvds_p[i]), .OCE(1'b1), .CLK(pixel_clk_x5), .CLKDIV(pixel_clk), .D1(parallel_data[4*i]), .D2(parallel_data[4*i+1]), .D3(parallel_data[4*i+2]), .D4(parallel_data[4*i+3]), .RST(rst) ); OBUFTDS #( .IOSTANDARD("LVDS_25")) obuf_inst ( .O(lvds_p[i]), .OB(lvds_n[i]), .I(lvds_p[i]) ); end endgenerate关键点说明:
- 使用OSERDESE2实现4:1并串转换
- DDR模式需要5倍像素时钟(742.5MHz)
- LVDS_25电平标准匹配CameraLink规范
3. 关键技术与实现细节
3.1 动态相位校准设计
LVDS回环信号在FPGA内部传输时会产生不可忽视的相位偏移,我们采用IDELAYE2模块实现动态校准:
verilog复制// 动态相位校准
IDELAYCTRL IDELAYCTRL_inst (
.REFCLK(ref_clk200),
.RST(rst)
);
IDELAYE2 #(
.CINVCTRL_SEL("FALSE"),
.DELAY_SRC("IDATAIN"),
.HIGH_PERFORMANCE_MODE("TRUE")
) idelay_inst (
.CNTVALUEOUT(delay_val),
.DATAOUT(rx_data),
.C(ref_clk200),
.CE(delay_inc ? 1'b1 : 1'b0),
.INC(delay_inc),
.IDATAIN(lvds_in)
);
校准过程要点:
- 需要稳定的200MHz参考时钟
- 通过ILA抓取眼图观察信号质量
- 动态调整delay_val值(范围0-31)
- 最佳采样点通常位于数据眼图中心
实际调试中发现:在7系列FPGA上,片间LVDS走线的固有延迟约为1.2ns,需要设置初始delay_val为8左右才能锁定信号。
3.2 数据对齐与时钟恢复
CameraLink接收端需要正确处理数据对齐和时钟恢复:
-
时钟恢复方案:
- 使用专用的MMCM生成恢复时钟
- 配置带宽为"LOW"以提高抖动容限
- 相位偏移微调步长56.25ps
-
数据对齐状态机:
verilog复制parameter SYNC = 2'b00; parameter HUNT = 2'b01; parameter LOCK = 2'b10; always@(posedge rx_clk) begin case(state) SYNC: if(comma_detect) state <= HUNT; HUNT: if(bit_slip_done) state <= LOCK; LOCK: if(error_count > 3) state <= SYNC; endcase end -
对齐检测逻辑:
- 监测K28.5逗号字符(0xBC)
- 滑动窗口检测连续3个有效逗号
- 错误计数器超限触发重新同步
3.3 视频格式转换处理
CameraLink与HDMI视频格式的主要差异处理:
| 特性 | CameraLink | HDMI | 转换方案 |
|---|---|---|---|
| 数据宽度 | 28位(4x7) | 24位RGB | 高位补零+同步信号重组 |
| 同步信号 | 嵌入数据通道 | 独立HS/VS信号 | 状态机提取和插入 |
| 时钟方案 | 串行时钟恢复 | TMDS独立时钟 | MMCM生成恢复时钟 |
| 传输模式 | 连续传输 | 数据有效信号控制 | DE信号生成逻辑 |
特殊处理情况:
- 1080p分辨率下需要启用行缓存(消耗18个36Kb BRAM)
- 色域转换时需考虑RGB与YUV的映射关系
- 消隐期数据处理要保持时序一致性
4. 调试经验与问题排查
4.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 显示器无图像 | LVDS相位未校准 | 调整IDELAY值并观察眼图 |
| 图像色彩错乱 | 数据通道位序错误 | 检查OSERDES的D1-D4连接顺序 |
| 随机噪点 | 接地不良 | 检查连接器接地和电源完整性 |
| 图像撕裂 | 时钟抖动过大 | 优化MMCM参数和电源滤波 |
| 仅部分屏幕显示 | 行缓存溢出 | 增加BRAM深度或降低分辨率 |
4.2 实战调试技巧
-
眼图观测方法:
- 设置ILA触发条件为垂直同步信号
- 时间基准设为200ps/div
- 电压阈值设为100mV
- 最佳眼图应满足:
- 眼高>400mV
- 眼宽>1.5ns
- 抖动<300ps
-
色彩验证方案:
- 使用标准色卡测试图
- 重点关注:
- 纯红色(FF0000)
- 纯绿色(00FF00)
- 纯蓝色(0000FF)
- 异常情况处理:
- 红色通道反相→检查ch0位序
- 亮度不均→验证数据截断逻辑
-
性能优化要点:
- 将IDELAYCTRL放置在靠近接收端的位置
- 约束LVDS差分对走线长度差<50mil
- 为高速时钟添加专用时钟缓冲器
- 在Vivado中设置PROHIBIT约束保护关键区域
4.3 资源利用优化
以XC7K325T为例的资源占用情况:
| 资源类型 | 使用量 | 总量 | 利用率 | 优化建议 |
|---|---|---|---|---|
| LUT | 12,345 | 203,800 | 6% | 可复用状态机逻辑 |
| FF | 8,765 | 407,600 | 2% | 减少流水线级数 |
| BRAM | 36 | 445 | 8% | 采用浅缓存策略 |
| MMCM | 2 | 10 | 20% | 共享时钟生成模块 |
| IDELAYCTRL | 1 | 12 | 8% | 区域化布局 |
具体优化措施:
- 将多个状态机合并为统一控制逻辑
- 采用乒乓操作减少BRAM使用量
- 共享像素时钟生成电路
- 使用SRL16E替代小型FIFO
5. 扩展应用与改进方向
这套验证方案在实际项目中展现出超出预期的价值,我们进一步开发了以下扩展功能:
-
压力测试模式:
- 生成极限分辨率测试图案(如4Kx2K)
- 注入可控抖动测试容错能力
- 长时间稳定性测试(72小时连续运行)
-
性能分析功能:
verilog复制// 延迟测量计数器 always@(posedge clk) begin if(hdmi_in_vs && !vs_d1) start_count <= 1; if(hdmi_out_vs && !vs_d2) begin latency <= counter; counter <= 0; end if(start_count) counter <= counter + 1; end这段代码实现了端到端延迟测量,典型值为:
- 1080p@60Hz:2.8行周期
- 720p@120Hz:1.5行周期
-
自动化测试接口:
- 通过UART接收测试指令
- 自动遍历所有测试模式
- 生成包含通过率的测试报告
未来改进方向包括:
- 增加AXI Stream接口提升系统集成度
- 支持CameraLink Base/Medium/Full配置自动识别
- 开发基于Python的自动化测试平台
- 实现动态分辨率切换功能
这种闭环验证方法不仅适用于CameraLink,经过适当修改也可应用于CoaXPress、SDI等其他高速视频接口的验证,具有很好的方法论价值。在实际项目中,我们用它成功验证了8通道CameraLink采集系统的核心功能,为后续开发节省了约40%的调试时间。
