我今年大三,准备参加2026年FPGA大赛,选题是实时图像去雾。想用国产高云FPGA做,但暗通道先验算法里求最小值窗口和透射率估计的计算量很大,PL端资源有限。请问怎么设计流水线架构来加速?需要用到行缓存和双端口RAM吗?还有高云FPGA的DSP单元够不够支撑浮点转定点优化?求有经验的学长分享具体实现思路和资源占用情况。
2026年FPGA大赛用国产高云FPGA做实时图像去雾,暗通道先验算法硬件加速怎么实现?
提问
回答 6

行缓存是必须的,高云的BRAM不算多但做个两行缓存还是够的。暗通道求最小窗口其实不用全窗口并行算,你可以用移位寄存器加比较树,把3×3窗口的9个像素逐级比出最小值,这样流水线很深但每个时钟都能出一个结果。透射率估计那步的除法用查找表查倒数再乘,定点化后DSP只用两三个就够了。导向滤波用均值滤波近似,别用原版迭代,那样资源直接炸。高云DSP48E1的复用技巧就是先算乘法再截位,别纠结浮点了。你打算用哪款具体型号的高云?不同型号BRAM差挺多的。

先说个容易踩的坑:很多同学一上来就想把整帧图像存下来再算暗通道,那BRAM肯定爆。正确做法是只缓存两到三行,配合下沉窗口滑着走。你选的暗通道先验其实比深度学习模型好做加速,因为运算规律性强。我建议你把工程拆成三级流水:第一级做最小值滤波,第二级算透射率并做导向滤波的均值部分,第三级做大气光估计和去雾恢复。大气光估计别用全局排序,太费资源,改成在暗通道图上找前0.1%像素点然后取原图对应位置的均值,用阈值比较器加累加器就能实现,完全不用排序。定点化方面,高云FPGA没有硬浮点,所以所有运算必须转成Q格式。透射率公式里的减法、除法都可以用查找表和移位近似,误差控制在1%以内人眼看不出区别。导向滤波我建议你用盒式滤波加一次减均值操作,替代原来的梯度下降迭代,这样流水线几乎不增加额外延迟。资源占用上,如果选高云的GW2A-55,大概能用掉40%的LUT和60%的BRAM,DSP用七八个,足够跑1080p@30fps。你用的摄像头接口是MIPI还是DVP?接口类型会影响输入端的时序设计。

补充一个你可能没考虑到的风险:大赛评审很看重可复现性和文档完整性,所以不要只闷头调代码。你可以在GitHub上找开源的C模型先验证算法精度,再对着RTL结果做逐像素比对。高云IDE的在线逻辑分析仪叫GOWIN Analysis,习惯用Vivado的人刚上手会觉得难用,建议提前花一周熟悉它的触发和采样设置。另外暗通道去雾有个经典问题:天空区域会过饱和,你可以在透射率估计那步加个下限阈值,设成0.1到0.2之间,用寄存器配个参数就行,这样调试时不用重新综合。如果你们组有两个人,一个人写C模型和MATLAB对比脚本,另一个人写RTL和约束,效率会高很多。高云官方论坛有个技术支持的板块,遇到BRAM时序不收敛的问题可以直接去问,他们回复挺快的。

行缓存按两行算,别贪多,高云BRAM就那么点。窗口滑动用移位寄存器加比较树,一个周期出一个结果,流水线深度换吞吐很划算。DSP48E1复用乘加结构,定点化后透射率查表近似,误差人眼看不出来。你打算用高云的哪款型号?不同系列BRAM和DSP数量差挺多的。

个人感觉你完全不用怕DSP不够。暗通道先验最吃资源的是最小值滤波和导向滤波,但这两块都能用纯逻辑加少量DSP搞定。最小值滤波用比较树,9个像素逐级比,一个DSP都不用。导向滤波简化成盒式均值滤波,只保留减均值那步,乘法和除法用查找表加移位近似,DSP只用两三个做最后的乘累加。定点化时注意透射率公式里的减法,给大气光值留够位宽,比如用Q8.8格式,误差控制在1%以内。流水线分三级就行:第一级读行缓存算暗通道,第二级算透射率并缓存,第三级做去雾恢复加输出。高云的IP核生成器里有个FIFO可以直接当行缓存用,省得自己写双端口RAM的时序。唯一要小心的是大气光估计,别用全局排序,改成找暗通道图前0.1%亮度的像素点再取原图均值,用阈值比较器加累加器就能实现。

说个你可能没注意到的细节:暗通道求最小值窗口时,很多人习惯用3×3窗口全并行比较,但高云FPGA的LUT资源其实比BRAM紧张,全并行会吃掉太多逻辑单元。一个省资源的做法是用一维滑动窗口加行间缓存——先对每行做一维最小值滤波,存两行结果后再对列做一次一维最小值,等效于二维窗口。这样每个时钟只需要比较三个数,组合逻辑深度也浅,时序更好收敛。透射率估计那步的除法,如果直接用LUT查倒数再乘,注意查表地址位宽要够,否则天空区域会过饱和。你可以把透射率结果限幅在0.1到0.9之间,用寄存器配个阈值,调试时不用重新综合。导向滤波简化成均值滤波后,记得做一次边缘保护:在均值结果和原图之间做个加权平均,权值用梯度信息控制,这样去雾后细节不会糊。高云IDE的在线逻辑分析仪GOWIN Analysis触发条件支持边沿和计数,建议你设个帧同步信号做触发,抓第一帧数据验证流水线时序。你目前是用高云的哪个开发板?不同板子带的SDRAM带宽不一样,可能会影响行缓存的刷新策略。
发表回答
登录后可在本页底部提交回答
