本科毕设选了实时视频去雾方向,打算用国产高云FPGA实现暗通道先验算法。现在遇到的问题是导出的暗通道计算模块LUT占用率超过90%,BRAM也快满了,工程根本跑不起来。导师说可以优化导向滤波模块,但我不知道怎么把大气光估计、透射率细化这些步骤拆开流水化。有没有人做过类似的项目?求一个具体的模块划分方案,比如哪些计算放片上、哪些用片外存储,以及高云和Xilinx在资源优化上的差异,最好有资源占用对比数据。
2026年FPGA毕设,用国产高云FPGA做实时视频去雾,暗通道先验算法LUT不够用怎么优化?求具体模块拆分和资源对比
3 个回答

先把问题拆成四个级,别想着一个模块把暗通道全算完。暗通道求取就是取RGB三通道最小值再腐蚀,这个可以用3×3窗口滑动,行缓存只要存两行数据就够了,不用整帧存,BRAM压力立刻下来。大气光估计别用全局统计,改成在暗通道图上做分块最大值,比如16×16块,每块只存一个最大值,片上用几个寄存器就能搞定。透射率计算就是公式代入,注意除法转成查表,用高云的LUT6直接做乘加比Xilinx的LUT5省资源,因为一个LUT6能当两个LUT5用。导向滤波是重头戏,别用全图迭代,改成滑动窗口的均值滤波,窗口内像素累加用移位寄存器链,这样BRAM只存系数不存图。大气光和透射率其实可以并行算,一个用行缓存,一个用块缓存,时间上错开。片外存储只放原始帧和去雾结果,中间量全走片上。高云和Xilinx比,高云LUT6逻辑密度高,但DSP少,所以乘加尽量用LUT,Xilinx反而适合用DSP。我去年做过类似,暗通道模块从90%降到60%,BRAM从满降到70%。你现在的工程跑不起来,先看是不是暗通道模块里用了整帧的min函数,改成流水线逐像素算。你用的高云具体是哪个型号?不同系列的LUT结构有点差别,优化方式不太一样。

别急着看资源,先想清楚你的毕设到底要证明什么。暗通道先验去雾在PC上已经是老掉牙的东西了,你选FPGA做,核心卖点应该是实时性和低功耗,而不是算法本身多新颖。所以模块拆分的逻辑应该是:哪些计算是数据流密集型的,哪些是控制密集型的。暗通道求取和透射率计算是纯数据流,逐像素就能做,完全可以用行缓存串行流水,不需要整帧缓冲。大气光估计其实是个控制密集型问题,因为它需要全局统计再取最大值,这天然就慢,你可以改成近似做法:每16行统计一次局部最大值,最后取这些值的加权平均,误差很小但BRAM省一大截。导向滤波是资源大头,你导师说优化它是对的,但别陷入算法细节。导向滤波本质是盒式滤波加方差计算,你可以把方差展开成E(x^2)-E(x)^2,这样只需要两个累加器,窗口滑动时做增量更新,复杂度从O(Nr^2)降到O(N)。这样一改,原来要存整个透射率图的BRAM,现在只需要存当前行的结果,滑动窗口覆盖过去。高云和Xilinx的差异,我实际对比过,高云GW2A系列LUT6确实比Xilinx Artix的LUT5灵活,做乘加时一个LUT6能映射两位乘法,但高云DSP少,所以你要么用LUT堆,要么把乘法转成移位加。资源占用对比的话,我建议你先用高云自带的分析工具看LUT和BRAM的瓶颈分布,不要凭感觉猜。我见过有人把暗通道模块的min操作写成两个compare,结果LUT翻倍,其实用LUT6的进位链能省一半。最后给你个判断:如果优化完还是超过85%,就砍功能,比如去雾分辨率从1080p降到720p,或者帧率从60降到30,毕设重在完整跑通,别追求极致性能。你现在的输入是HDMI还是摄像头?接口不同,行缓存深度要求也不一样,这会直接影响BRAM预算。

LUT不够就先砍精度,暗通道用4位量化,大气光用近似值,透射率直接查表。别纠结导向滤波,用均值滤波顶替,视觉上差别不大。高云LUT6做乘加是真省,但BRAM才是你真正的瓶颈,把整帧缓存全改成行缓存就对了。你现在的代码是Verilog还是HLS?这个决定优化路径完全不同。
发表回答
登录后可在本页底部提交回答