我们团队今年备赛FPGA大赛,选了实时视频去雾这个方向,用的暗通道先验算法。现在在高云FPGA上实现时,BRAM资源严重不足,特别是透射率计算那部分需要大量缓存。我听说可以用行缓冲复用和流水线重排来优化,具体能省多少BRAM?有没有现成的Verilog代码框架可以参考?另外,算法精度会不会因为资源压缩而下降?求有经验的学长指点,最好能给出一个具体的资源优化前后对比数据。
2026年FPGA大赛做实时视频去雾,暗通道先验算法在国产高云FPGA上BRAM不够,用行缓冲复用和流水线重排能省多少资源?
提问
回答 6

暗通道先验吃BRAM是大实话,高云的BRAM本来就紧。行缓冲复用加流水线重排,透射率计算那块通常能省40%到60%的BRAM,具体看你窗口大小。但精度会掉一点,尤其是边缘和天空区域,得看你们比赛能不能接受。你们现在用的是多少位宽的数据?

个人感觉你先别急着找现成代码,高云这平台跟Xilinx差异挺大,直接移植容易翻车。行缓冲复用说白了就是把原来存整帧的RAM改成只存几行,比如窗口是15×15,那就只存15行,这样BRAM能从存一帧变成存十几行,省个百分之七八十都有可能。但代价是控制逻辑变复杂,时序容易跑不高,得配合流水线重排把关键路径打断。精度方面,暗通道本身是个近似算法,压缩资源后透射率图会变粗糙,去雾效果可能有点块状感,但比赛演示一般看不出来。你们先拿MATLAB跑个行为级模型,对比一下优化前后的PSNR,差个1-2dB以内都能接受。

既然你们是FPGA大赛,资源不够时除了行缓冲复用,其实还有个思路:把暗通道先验里的最小值滤波换成快速近似算法,比如用两个一维滤波器代替二维窗口,这样BRAM消耗能降一个数量级,但去雾效果会偏保守。具体来说,透射率计算那部分,原算法要缓存整帧的灰度图才能算最小值,改成行缓冲后只存N行,N取窗口高度就行,比如15×15窗口就存15行,BRAM用量从一帧的几百Kbit降到十几Kbit。流水线重排主要是把透射率计算和导向滤波(如果你们用了)的依赖错开,避免同时占用大量BRAM。一个常见坑是:高云的BRAM有块大小限制,有些小容量块拼大缓存时容易浪费地址位,建议用IP核的简单双口模式,别用真双口。精度下降是必然的,但比赛时评委更看重实时性和资源利用率,你们可以展示优化前后的去雾对比图,说明牺牲了边缘细节但保住了主体。另外,高云官方论坛有篇《基于高云FPGA的实时图像处理优化笔记》,里面提到了类似的BRAM复用技巧,你们可以去翻翻。你们现在用的是高云哪个型号?晨熙还是小蜜蜂?不同系列的BRAM布局差很多。

说实话,BRAM省多少完全看你窗口大小和图像分辨率。行缓冲复用加流水线重排,透射率计算那块大概能省掉一半到七成的BRAM,具体说就是原来要缓存一整帧的暗通道图,现在改成只存窗口高度那么多的行,比如窗口15×15就存15行,资源从几百Kbit降到几十Kbit。但代价是控制逻辑变复杂,时序可能跑不高。精度方面,边缘会有点块状感,但比赛演示一般看不出来。你们现在图像分辨率定的是多少?

我个人建议你别只盯着行缓冲复用,还得想想暗通道先验本身能不能改。比如把最小值滤波换成快速近似,用两个一维滤波代替二维窗口,这样BRAM消耗能降一个数量级。但去雾效果会偏保守,天空区域容易发灰。另外高云的BRAM有块大小限制,有些小容量块拼大缓存时容易浪费地址位,建议用IP核的简单双口模式,别用真双口。精度下降是必然的,但比赛时评委更看重实时性和资源利用率。你们可以先拿MATLAB跑个行为级模型,对比一下优化前后的PSNR,差个2dB以内都能接受。顺便问下,你们现在用的数据位宽是8bit还是10bit?

你们现在遇到的情况,其实很多做比赛的人都经历过。高云BRAM紧张是个老问题,特别是透射率计算那块,因为暗通道先验需要先对整帧做最小值滤波,传统做法要缓存一整帧的灰度图,那BRAM自然爆了。行缓冲复用的核心思路就是把存整帧改成只存N行,N等于滤波窗口高度。比如你们用15×15窗口,那就只存15行灰度数据,这样BRAM用量能从一帧的几百Kbit降到十几Kbit,省了百分之七八十。但这里有个坑:行缓冲配合流水线重排时,透射率计算和后续的导向滤波(如果你们用了)有数据依赖,得把它们的计算阶段错开,不然会同时占用大量BRAM。具体做法是在透射率算完一个像素后立刻输出,不缓存整帧透射图,导向滤波那边也用滑动窗口方式处理。这样流水线能跑通,但时序收敛要小心,高云的综合工具对跨时钟域处理不太智能,建议所有行缓冲都用同一个时钟域。精度方面,暗通道先验本身就是个近似算法,压缩资源后透射率图会变粗糙,边缘细节会模糊,但去雾主体效果还在。比赛时评委更关注实时帧率和资源占用率,你们可以在答辩时展示优化前后的去雾对比图,说明牺牲了边缘细节但保住了主体。另外,现成的Verilog框架网上确实不多,高云这块更少,建议你们自己基于行缓冲的IP核去搭,透射率计算可以用移位加加法代替除法,这样LUT也能省不少。你们现在有没有定下来用多大的滤波窗口?
发表回答
登录后可在本页底部提交回答
