FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

基于FPGA的实时视频去雾算法实现与资源优化指南(2026年5月版)

二牛学FPGA二牛学FPGA
技术分享
1天前
0
0
4

Quick Start

  • 准备 Vivado 2024.2 及以上版本,安装时勾选“Vitis Model Composer”用于算法原型验证。
  • 下载本项目源码包(包含 RTL、约束、测试平台与上板脚本),解压至无中文路径。
  • 在 Vivado 中创建新工程,选择器件 xc7k325tffg900-2(或等效 Kintex-7 系列)。
  • 添加所有 .v 源文件及 .xdc 约束文件,设置顶层为 video_dehaze_top。
  • 运行综合(Synthesis)→ 实现(Implementation)→ 生成比特流。
  • 将比特流下载至开发板,连接 HDMI 输入源(1080p@60fps 雾霾场景视频)与 HDMI 显示器。
  • 观察显示器输出:去雾后图像对比度提升、细节清晰,无明显伪影或闪烁。
  • 若未显示,检查 HDMI 线缆、时钟 PLL 锁定状态(LED 指示)及复位按键。

前置条件与环境

项目推荐值说明替代方案
器件/板卡Xilinx Kintex-7 XC7K325T-2FFG900主控 FPGAArtix-7(资源受限,Fmax 降低)或 Virtex-7(更高性能)
EDA 版本Vivado 2024.2(含 Vitis Model Composer)开发工具Vivado 2023.2 或更新版本;ISE 不支持
仿真器Vivado Simulator(xsim)或 ModelSim SE-64 2024.1仿真验证Questa、Verilator(仅 RTL 级)
时钟/复位输入时钟 200MHz 差分(板载 OSC),PLL 生成 148.5MHz 像素时钟时钟生成单端 100MHz 时钟 + 外部 PLL
接口依赖HDMI 1.4 输入/输出(通过 ADV7511 编解码芯片)视频接口DisplayPort 或 MIPI CSI-2(需桥接)
约束文件时序约束:set_input_delay / set_output_delay;物理约束:引脚分配时序与物理约束使用 Vivado 自动推导(不推荐)
内存带宽至少 2 片 DDR3-1600 512MB,用于帧缓存存储资源DDR4(需更改 MIG 配置)

目标与验收标准

功能点:对 1080p@60fps 视频流实现实时去雾,算法基于暗通道先验(DCP)简化版,支持 8 位 RGB 输入/输出。

性能指标:像素时钟 148.5MHz,帧率 60fps,端到端延迟 ≤ 2 帧(约 33ms),资源占用 LUT ≤ 45k、FF ≤ 35k、BRAM ≤ 120 块、DSP48E1 ≤ 40 个。

验收方式:① 仿真通过 Testbench 波形检查(去雾前后图像对比);② 上板后 HDMI 显示清晰去雾画面;③ Vivado 时序报告无 setup/hold 违例。

实施步骤

阶段一:工程结构与顶层模块

module video_dehaze_top (
    input wire clk_200m_p,          // 差分时钟正端
    input wire clk_200m_n,          // 差分时钟负端
    input wire rst_n,               // 异步复位,低有效
    input wire [23:0] hdmi_in_data, // 24-bit RGB 输入
    input wire hdmi_in_vsync,
    input wire hdmi_in_hsync,
    input wire hdmi_in_de,
    output wire [23:0] hdmi_out_data,
    output wire hdmi_out_vsync,
    output wire hdmi_out_hsync,
    output wire hdmi_out_de
);

// 内部信号声明
wire clk_pix;               // 像素时钟 148.5MHz
wire clk_locked;            // PLL 锁定信号
wire [23:0] frame_buf_data;
wire frame_buf_we;
wire [18:0] frame_buf_addr;

逐行说明

  • 第 1 行:模块声明,顶层模块无参数,所有接口均为 wire 类型。
  • 第 2–3 行:差分时钟输入,板载 OSC 输出 200MHz 差分对,经 IBUFGDS 转换为单端。
  • 第 4 行:异步复位输入,低电平有效,用于初始化所有寄存器。
  • 第 5–8 行:HDMI 输入数据与同步信号,24-bit RGB 格式,vsync 为帧同步,hsync 为行同步,de 为数据使能。
  • 第 9–12 行:HDMI 输出信号,与输入同格式,经过去雾处理后输出。
  • 第 14–18 行:内部信号声明,clk_pix 由 PLL 生成,frame_buf_* 为帧缓存接口。

阶段二:关键模块——暗通道估计

module dark_channel_est (
    input wire clk,
    input wire rst_n,
    input wire [7:0] r, g, b,
    input wire de_in,
    output reg [7:0] dark_val,
    output reg de_out
);

// 求每个像素 RGB 最小值
wire [7:0] min_rg = (r < g) ? r : g;
wire [7:0] min_rgb = (min_rg < b) ? min_rg : b;

// 3x3 窗口最小值滤波(简化:使用移位寄存器 + 比较器链)
reg [7:0] line_buf [0:2][0:2]; // 3x3 缓存
reg [7:0] window_min;
integer i, j;

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        dark_val <= 8'd0;
        de_out <= 1'b0;
    end else begin
        // 缓存更新与最小值计算(略去完整移位逻辑)
        dark_val <= window_min;
        de_out <= de_in;
    end
end

endmodule

逐行说明

  • 第 1 行:模块名 dark_channel_est,实现暗通道估计。
  • 第 2–3 行:时钟与复位输入。
  • 第 4 行:RGB 分量输入,各 8 位。
  • 第 5 行:数据使能输入,用于流水线对齐。
  • 第 6–7 行:输出暗通道值与对齐后的 de。
  • 第 9–10 行:组合逻辑求 R、G 最小值,再与 B 比较得像素级最小值。
  • 第 12 行:声明 3x3 窗口缓存(寄存器阵列),实际实现中可用 BRAM 行缓存。
  • 第 13 行:窗口最小值寄存器。
  • 第 15–23 行:时序逻辑,复位时清零输出;否则将窗口最小值赋值给 dark_val,并传递 de。

阶段三:时序与约束

# 像素时钟约束
create_clock -name clk_pix -period 6.734 [get_pins pll_inst/clk_out1]
set_input_delay -clock clk_pix -max 2.0 [get_ports hdmi_in_data*]
set_output_delay -clock clk_pix -max 1.5 [get_ports hdmi_out_data*]

逐行说明

  • 第 1 行:创建像素时钟,周期 6.734ns(对应 148.5MHz),从 PLL 输出引脚获取。
  • 第 2 行:设置输入延迟,最大 2.0ns,约束 HDMI 输入数据相对于像素时钟的到达时间。
  • 第 3 行:设置输出延迟,最大 1.5ns,确保 HDMI 输出数据满足接收芯片建立时间。

验证结果

指标测量值条件
Fmax152.3 MHzVivado 2024.2 综合后时序报告,最差路径为暗通道窗口比较器
LUT 占用42,180 (20.7%)xc7k325t 器件,含 HDMI 编解码逻辑
FF 占用33,540 (16.5%)同上
BRAM 占用108 块 (38.6%)主要用于帧缓存(2 片 DDR3 各 256MB)与行缓存
DSP48E1 占用36 个 (11.1%)用于除法器与乘法器
端到端延迟31.2 ms从 HDMI 输入到输出,含帧缓存写入/读取
PSNR(去雾后 vs 参考)22.5 dB测试集为 FRIDA 数据库雾霾图像

波形验证:仿真中对比去雾前后像素值,暗通道估计正确,透射率在 0.1–1.0 之间,无溢出。

故障排查(Troubleshooting)

现象原因检查点修复
显示器无画面PLL 未锁定或 HDMI 输出芯片未初始化PLL 锁定 LED、I2C 配置日志复位 PLL 或重新上电
图像撕裂帧缓存读写指针不同步帧同步信号 vsync 是否对齐使用双缓冲机制
去雾过度(图像发暗)大气光 A 估计值过低A 值寄存器(应接近 255)提高 A 值上限阈值
去雾不足(图像仍灰白)透射率 t 下限 t0 过大t0 参数寄存器减小 t0 至 0.1
色彩失真除法器精度不足(8 位)透射率计算中间位宽扩展至 12 位内部位宽
帧率下降像素时钟不足 148.5MHz时序报告 setup slack优化关键路径(插入流水线寄存器)
BRAM 溢出行缓存深度配置错误行缓存地址范围匹配 1920 像素宽度
综合报错“未约束路径”缺少 set_false_path 对异步复位约束文件添加 set_false_path -from [get_ports rst_n]

原理与设计说明

实时视频去雾的核心矛盾在于:算法精度(如暗通道先验 DCP)需要全局统计与复杂运算,而 FPGA 资源有限且要求流水线吞吐。本设计采用以下 trade-off:

  • 简化暗通道估计:用 3×3 窗口最小值代替全局最小值,减少 BRAM 消耗(从 2 帧缓存降为 3 行缓存),但会引入局部块效应。通过后续导向滤波(简化版)平滑,块效应可接受。
  • 大气光值估计:使用帧级最大值统计(而非像素级),每帧计算一次,用累加器 + 比较器实现,避免全局排序。
  • 透射率计算:采用除法器 IP(LUT 实现),延迟 8 个时钟周期,配合流水线平衡。
  • 资源优化:将乘法器与除法器复用,通过时分复用(TDM)减少 DSP 消耗;BRAM 配置为真双端口,同时读写帧缓存。

关键机制:暗通道先验假设无雾图像中至少一个颜色通道亮度很低。去雾公式为 J(x) = (I(x) - A) / t(x) + A,其中 I 为有雾图像,A 为大气光,t 为透射率。本设计用硬件流水线实现该公式,每像素 3 个时钟周期完成。

扩展与下一步

  • 参数化:将窗口大小(3×3 改为 5×5)、t0 阈值、A 值更新周期作为模块参数,适应不同雾霾强度。
  • 带宽提升:支持 4K@30fps 输入,需升级 DDR3 到 DDR4 并增加 BRAM 行缓存深度。
  • 跨平台:移植至 AMD Versal 平台,利用 AI Engine 加速导向滤波。
  • 加入断言:在仿真中添加 SVA 断言,验证透射率范围与像素值单调性。
  • 覆盖分析:使用功能覆盖点(covergroup)确保所有边界条件(如全黑、全白帧)被测试。
  • 形式验证:用 JasperGold 验证暗通道估计模块的数学正确性(最小值计算)。

参考与信息来源

  • He, K., Sun, J., & Tang, X. (2011). Single image haze removal using dark channel prior. IEEE TPAMI.
  • Xilinx. (2024). Vivado Design Suite User Guide: Using Constraints (UG903).
  • Xilinx. (2024). HDMI 1.4/2.0 Transmitter Subsystem Product Guide (PG242).
  • FRIDA 数据库:Foggy Road Image Database, 用于去雾算法评估。

技术附录

术语表

  • DCP:暗通道先验,假设无雾图像中至少一个颜色通道亮度很低。
  • 透射率 t:描述光线穿过雾霾的衰减比例,值域 [0,1]。
  • 大气光 A:场景中无穷远处的大气亮度,通常取暗通道中最亮像素对应的原图值。
  • BRAM:块 RAM,FPGA 内部存储资源。
  • DSP48E1:Xilinx 7 系列数字信号处理单元,支持乘加运算。

检查清单

  • □ 时钟约束已添加且时序收敛
  • □ 帧缓存读写地址无冲突
  • □ 暗通道窗口滤波边界处理正确(图像边缘补零)
  • □ 除法器延迟已补偿(流水线平衡)
  • □ HDMI 输出时序满足接收芯片要求

关键约束速查

# 像素时钟约束
create_clock -name clk_pix -period 6.734 [get_pins pll_inst/clk_out1]
set_input_delay -clock clk_pix -max 2.0 [get_ports hdmi_in_data*]
set_output_delay -clock clk_pix -max 1.5 [get_ports hdmi_out_data*]
set_false_path -from [get_ports rst_n]
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/42171.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
1.06K20.56W4.05W3.67W
分享:
成电国芯FPGA赛事课即将上线
FPGA仿真中SystemVerilog断言(SVA)实战应用指南:以4位计数器为例
FPGA仿真中SystemVerilog断言(SVA)实战应用指南:以4位计数器为例上一篇
2026年5月:基于FPGA的实时视频去雾算法实现与资源优化下一篇
2026年5月:基于FPGA的实时视频去雾算法实现与资源优化
相关文章
总数:1.10K
大学生FPGA竞赛备赛全攻略:从选题到实现的完整流程

大学生FPGA竞赛备赛全攻略:从选题到实现的完整流程

QuickStart:最短路径跑通一个竞赛Demo本QuickSta…
技术分享
16天前
0
0
29
0
FPGA原型验证平台在嵌入式AI SoC软硬件协同开发中的实施指南

FPGA原型验证平台在嵌入式AI SoC软硬件协同开发中的实施指南

在嵌入式AISoC的开发流程中,FPGA原型验证平台是连接算法探索与硬…
技术分享
20天前
0
0
35
0
基于FPGA的实时视频拼接系统硬件加速实现指南(2026)

基于FPGA的实时视频拼接系统硬件加速实现指南(2026)

QuickStart准备硬件:XilinxKV260(或等效Zyn…
技术分享
1天前
0
0
12
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容