1. 项目概述
这个项目实现了一个基于FPGA的高性能视频传输系统,通过Aurora 64B66B协议和UVC协议的结合,完成了从视频采集到USB3.0传输的完整链路。系统采用Xilinx UltraScale+系列FPGA作为核心处理器,利用GTY高速收发器实现10Gbps的光纤传输,最终通过FT602芯片将视频数据转换为UVC格式输出。
1.1 核心需求解析
这个设计主要解决了以下几个工程实际问题:
-
高速视频传输需求:传统视频传输方案(如HDMI线缆)在长距离传输时存在信号衰减问题,而基于光纤的Aurora 64B66B协议可以实现百米级无损传输。
-
协议转换需求:工业现场采集的视频数据需要转换为通用USB视频协议,以便在各种计算设备上直接使用,无需专用驱动。
-
实时性要求:系统实现了从采集到显示的完整流水线,延迟控制在3帧以内(约50ms@60fps),满足大多数工业检测场景的实时性需求。
1.2 系统架构亮点
整个系统设计有几个关键创新点:
-
混合协议架构:创造性地将光电领域的Aurora协议与消费电子领域的UVC协议结合,兼具高带宽和通用性。
-
全Verilog实现:除必要的IP核外,所有视频处理模块(包括缓存控制、格式转换、UVC协议栈)均采用纯Verilog实现,便于移植和定制。
-
动态分辨率适配:支持从720p到1080p的多分辨率输入输出,通过参数化设计实现灵活配置。
2. 硬件设计详解
2.1 核心器件选型
2.1.1 FPGA选型考量
选择Xilinx Kintex UltraScale+ xcku3p芯片主要基于以下因素:
- GTY收发器数量:KU3P提供16个GTY通道,单个通道支持10.3125Gbps线速率,满足多路视频传输需求。
- 逻辑资源:需要约150K LUTs实现视频处理流水线,KU3P的242K LUTs提供充足余量。
- DDR4接口:支持72位宽DDR4-2400,提供38.4GB/s的理论带宽,满足1080p60视频的三帧缓存需求。
2.1.2 接口芯片对比
在USB3.0 PHY芯片选型时,我们对比了两种主流方案:
| 特性 | FT602 | CYUSB3014 |
|---|---|---|
| 最大带宽 | 400MB/s | 400MB/s |
| 接口类型 | 同步FIFO | GPIF II |
| 驱动支持 | 免驱(UVC) | 需自定义驱动 |
| 开发难度 | 中等 | 较高 |
| 单价(100片) | $12.8 | $15.2 |
| 功耗 | 1.2W | 1.5W |
最终选择FT602主要基于其更好的性价比和更简单的开发流程。
2.2 关键电路设计
2.2.1 GTY参考时钟设计
GTY收发器对参考时钟有严格要求,我们的设计采用:
- 时钟源:Si5345低抖动时钟发生器
- 频率:156.25MHz(满足10Gbps线速率要求)
- 抖动性能:<100fs RMS(满足GTY的<1ps要求)
- 布线规范:
- 差分对长度匹配<5mil
- 阻抗控制100Ω±10%
- 避免穿越电源分割区域
2.2.2 FT602接口设计
FT602与FPGA的接口需要注意:
- 电平匹配:FT602支持1.8V/2.5V/3.3V,我们选择1.8V以降低功耗
- 信号完整性:
- 数据线等长控制±50ps
- 添加22Ω串联电阻改善阻抗匹配
- 电源设计:
- 使用TPS74401为FT602提供1.0V核心电压
- 每个电源引脚放置0.1μF+1μF去耦电容
3. FPGA逻辑设计
3.1 视频处理流水线
3.1.1 输入模块设计
对于OV5640摄像头输入:
verilog复制module helai_OVsensor #(
parameter SENSOR_TYPE = 0 // 0:OV5640, 1:彩条
)(
input wire clk_50m,
input wire rst_n,
// OV5640接口
output wire cam_scl,
inout wire cam_sda,
input wire cam_vsync,
input wire cam_href,
input wire cam_pclk,
input wire [7:0] cam_data,
// 视频输出
output wire vid_clk,
output wire vid_vsync,
output wire vid_hsync,
output wire vid_de,
output wire [23:0] vid_data
);
// I2C配置模块
ov5640_reg_cfg u_reg_cfg(
.clk(clk_50m),
.rst_n(rst_n),
.scl(cam_scl),
.sda(cam_sda),
.cfg_done(cfg_done)
);
// 数据采集模块
generate
if(SENSOR_TYPE == 0) begin
ov5640_capture u_capture(
.cam_pclk(cam_pclk),
.cam_vsync(cam_vsync),
.cam_href(cam_href),
.cam_data(cam_data),
.vid_clk(vid_clk),
.vid_vsync(vid_vsync),
.vid_hsync(vid_hsync),
.vid_de(vid_de),
.vid_data(vid_data)
);
end else begin
color_bar u_color_bar(
.clk(vid_clk),
.rst_n(rst_n),
.vsync(vid_vsync),
.hsync(vid_hsync),
.de(vid_de),
.rgb(vid_data)
);
end
endgenerate
endmodule
3.1.2 Aurora 64B66B IP核配置
关键配置参数:
- 线速率:10.3125Gbps
- 参考时钟:156.25MHz
- 数据宽度:64bit
- 接口类型:AXI4-Stream
- FEC模式:启用Reed-Solomon(544,514)
- 时钟补偿:每10000个时钟周期插入补偿序列
3.2 图像缓存设计
采用三帧缓存架构确保视频流畅性:
-
写缓存控制器:
- 乒乓操作管理两个写端口
- 突发长度设置为256(最大化DDR效率)
- 写优先级高于读以避免丢帧
-
读缓存控制器:
- 预读取机制(提前1行开始读取)
- 动态调整读取节奏防止下溢
- 支持丢帧恢复机制
4. 系统调试与优化
4.1 眼图测试
使用Tektronix DPO70000系列示波器进行GTY眼图测试:
| 参数 | 测试值 | 规范要求 |
|---|---|---|
| 眼高 | 320mV | >250mV |
| 眼宽 | 0.95UI | >0.8UI |
| 抖动(RMS) | 0.7ps | <1ps |
| 误码率 | <1e-15 | <1e-12 |
4.2 延迟测量
使用帧计数法测量端到端延迟:
-
测试方法:
- 在视频源插入时间戳
- 在UVC输出端捕获时间戳
- 计算差值
-
测试结果:
- 720p30模式:42ms
- 1080p60模式:51ms
4.3 带宽优化技巧
通过以下方法提升有效带宽利用率:
-
AXI突发优化:
- 将突发长度从64提升到256,带宽利用率从75%提升到92%
- 使用OUTSTANDING=8提高并发性
-
数据打包:
- 将YUV422数据打包为256bit宽
- 减少DDR访问次数
-
时钟域优化:
- 在跨时钟域处使用异步FIFO
- 深度设置为64以消除溢出风险
5. 常见问题解决
5.1 光链路失锁问题
现象:Aurora IP核频繁报告hard_err
排查步骤:
- 检查参考时钟质量(使用频谱分析仪)
- 测量光模块发射功率(应在-6~-1dBm)
- 检查PCB阻抗匹配(TDR测试)
解决方案:
- 在IP核配置中增加FEC强度
- 调整RX均衡设置(增加CTLE boost)
5.2 UVC图像撕裂问题
现象:输出图像出现水平撕裂
原因分析:
- DDR读带宽不足导致缓存下溢
- FT602 FIFO溢出
解决方法:
- 优化DDR调度算法:
verilog复制// 修改读控制器优先级
always @(*) begin
if(rd_fifo_almost_empty)
rd_priority = 2'b10; // 最高优先级
else if(wr_fifo_almost_full)
rd_priority = 2'b01;
else
rd_priority = 2'b00;
end
- 增加FT602的FIFO水线阈值:
- 将PROG_FULL_THRESH从512调整到768
5.3 电源噪声问题
现象:高负载时视频出现随机噪点
测量数据:
- 1.0V电源纹波:120mV(超标)
- 1.8V电源纹波:80mV
改进措施:
- 增加电源滤波:
- 每个电源引脚添加10μF陶瓷电容
- 使用PI型滤波(22μH+2×47μF)
- 优化PCB布局:
- 缩短电源回路路径
- 避免数字信号穿越模拟区域
6. 工程移植指南
6.1 跨器件移植
当移植到其他FPGA型号时需注意:
-
GTY配置差异:
- Artix7:GTP(最大6.6Gbps)
- Kintex7:GTX(最大12.5Gbps)
- Virtex7:GTH(最大13.1Gbps)
- UltraScale:GTY(最大16.3Gbps)
-
时钟资源调整:
- 根据新器件MMCM特性更新时钟约束
- 重新计算BUFR/BUFG分配
6.2 分辨率修改
要支持新分辨率需要调整:
- 视频时序参数:
verilog复制// 修改video_timing_gen模块参数
parameter H_ACTIVE = 1920,
H_TOTAL = 2200,
V_ACTIVE = 1080,
V_TOTAL = 1125;
-
DDR带宽计算:
新分辨率所需带宽 = (H_ACTIVE×V_ACTIVE×3×帧率)/10^6 (MB/s)例如4K30:
(3840×2160×3×30)/10^6 = 746.5MB/s
需要至少72bit DDR4-2400(理论带宽17.2GB/s)
7. 性能实测数据
7.1 资源利用率
KU3P资源占用情况:
| 资源类型 | 使用量 | 总量 | 利用率 |
|---|---|---|---|
| LUT | 124521 | 242400 | 51% |
| FF | 143256 | 484800 | 29% |
| BRAM | 216 | 432 | 50% |
| DSP | 32 | 1680 | 2% |
| GTY | 2 | 16 | 12% |
7.2 实际带宽
使用USB3.0分析仪测试:
| 分辨率 | 理论带宽 | 实测带宽 | 效率 |
|---|---|---|---|
| 1280x720@60 | 663MB/s | 632MB/s | 95.3% |
| 1920x1080@60 | 1493MB/s | 1387MB/s | 92.9% |
8. 应用场景扩展
本设计可应用于:
-
工业检测:
- 生产线高清视频监控
- 远距离(100m+)视频传输
-
医疗影像:
- 内窥镜视频采集
- 手术室视频分发
-
广播系统:
- 演播室多机位信号调度
- 现场制作系统
-
安防监控:
- 高分辨率视频集中处理
- 多摄像头数据汇聚
在实际部署中,我们建议根据具体应用场景调整以下参数:
- 光纤类型(多模/单模)
- 压缩算法(可选JPEG压缩模块)
- 加密方案(添加AES加密引擎)
