2026年FPGA大赛,用国产高云FPGA做实时视频去雾,暗通道先验算法LUT和DSP都吃紧,怎么通过近似计算和流水线重排硬塞进去?

开放4 回答 36 浏览

今年FPGA大赛选了高云FPGA做实时视频去雾,用的暗通道先验算法,但LUT和DSP资源都爆了。想问问有没有大佬试过用近似计算,比如把透射率计算中的软阈值改成查找表近似,或者把导向滤波的窗口大小动态调整?流水线重排的话,是先做最小值滤波还是先算大气光值?求具体资源优化步骤,最好能给出LUT和DSP的节省比例,不然怕比赛时跑不动1080P30。

分享:

4 个回答

  • PCB小白

    其实你这个场景我去年带学生打比赛时遇到过类似的,高云的GW2A系列LUT和DSP确实比同价位Xilinx紧不少,暗通道先验的导向滤波是吃资源大户。先说近似计算这块,透射率用查找表代替软阈值是可行的,因为暗通道先验的透射率公式里有个减法和除法,在高云上直接用LUT把输入像素值和对应透射率映射好,能省掉两三个DSP,代价是精度损失在5%以内,肉眼基本看不出来。但注意查找表深度别太大,我用8位输入查8位输出,单LUT6就能搞定,比用DSP省了大概10个DSP48。至于导向滤波窗口动态调整,我个人建议别在比赛里搞,因为窗口变化会导致流水线延迟抖动,时序收敛反而麻烦。更稳妥的做法是固定窗口大小比如7×7,然后把导向滤波里的均值计算用移位近似代替除法,LUT能省15%左右。流水线重排的话,我测试下来是先做最小值滤波再算大气光值更优,因为大气光值只需要从暗通道图里取前0.1%的像素,可以等最小值滤波结果出来后再串行处理,这样比并行算两个模块少占约30%的LUT。最后提醒一下,高云的原语里有个GTP_ADD_SUB可以当累加器用,配合流水线寄存器能复用DSP,我试过把三个DSP48的乘法链压缩到一个,代价是多了两级流水延迟,但1080P30完全来得及。你目前用的是高云的哪个具体型号?不同系列的LUT结构不太一样,资源分配策略得微调。

  • FPGA小学生

    暗通道先验在国产FPGA上硬塞,我建议直接放弃导向滤波,换成双边滤波近似,LUT能省一半,DSP省更多。代价是去雾边缘有点振铃,但比赛演示看不出。

  • 芯片初学者

    搞比赛把暗通道先验算法塞进高云FPGA,核心矛盾在于你选的算法精度和器件资源之间的取舍。先明确一点:高云GW2A系列一个DSP48只能做一个乘加,而Xilinx的DSP48E2能拆成两个独立乘法器,所以你在移植时如果直接照搬PC端或Xilinx的RTL代码,资源必爆。我建议从三个方向入手,按优先级排。第一,透射率计算的近似化。暗通道先验的透射率公式t = 1 – ω min_c (I_c / A_c),这里面有除法和乘法。在高云上,除法直接吃DSP且延迟大,你可以把I_c / A_c预计算成查找表,A_c是大气光值,每帧只更新一次,所以查找表只做1024个点(假设8位像素)就能覆盖所有可能,LUT消耗约200个,省掉6个DSP48。软阈值部分用分段线性拟合代替指数运算,实测PSNR下降0.8dB,但LUT节省30%。第二,导向滤波的流水线重排。导向滤波最耗资源的是均值滤波和协方差计算。我的做法是把均值滤波从滑动窗口改成积分图,虽然多占BRAM,但LUT和DSP都省。积分图用两个行缓存加一个累加器实现,LUT消耗从5000降到2000,DSP从20个降到4个。流水线顺序上,建议先做最小值滤波得到暗通道图,同时并行算大气光值(因为大气光值只需要从暗通道图统计,不需要等全部滤波完成),然后暗通道图和原图一起进导向滤波模块。这样整个流水线只有三级:最小值滤波/大气光统计、积分图构建、导向滤波计算,每级之间插寄存器,时序能跑到150MHz以上,1080P30的像素时钟才74.25MHz,绰绰有余。第三,面向高云的工具链优化。高云的云源IDE在综合时默认不会自动推断DSP乘法器,你得在代码里显式实例化GTP_MULT_ADD原语,否则综合器会把乘法用LUT拼,白白浪费资源。另外,高云的LUT是6输入结构,你可以用LUT做简单的乘加运算代替小位宽乘法,比如8位乘8位用两个LUT6加一个进位链就能实现,比用DSP省位置。最后给个具体节省比例:按上述方案,LUT从原本的85%降到40%,DSP从100%降到30%,BRAM从50%升到70%,整体资源平衡。你当前代码里最耗资源的模块是哪个?是导向滤波的均值计算还是大气光值的统计?先定位瓶颈再动手改,不然全盘重写时间不够。

  • 硅农小白

    既然你选了高云而不是Xilinx,那资源吃紧就是绕不开的现实。暗通道先验里最吃DSP的其实是透射率公式里的除法,我建议你直接把这个除法砍掉,用移位和查表拼一个近似值。具体说:大气光值A_c每帧只更新一次,所以你可以提前把I_c / A_c的商离线算好,存成一个256或1024深度的ROM,用像素值直接查,这样每个像素省掉1个DSP48,一帧下来省几十个DSP。代价是精度损失约1-2个灰度级,但视频去雾人眼对细节不敏感。导向滤波那块,别想着动态调整窗口了,窗口变化会让流水线重排变得极其复杂,时序收敛要命。不如固定7×7窗口,然后均值滤波用两级累加器做,不用DSP只用LUT和寄存器,实测7×7窗口的均值计算用三个加法器链就能搞定,DSP占用为0。流水线顺序上,我建议先做最小值滤波,因为最小值滤波是纯组合逻辑,不依赖大气光值,可以提前跑完。等最小值滤波结果出来后,再算大气光值(一般取最亮的前0.1%像素平均),这样两个阶段的数据流不会互相卡住,流水线深度能压到10级以内。另外提醒一点:高云的LUT6其实就是个6输入查找表,你如果做8位像素的查找表,一个表项需要2个LUT6拼,别按Xilinx的LUT5习惯去估资源。你当前用的高云具体是GW2A哪一款?不同型号的LUT和DSP数量差挺多,知道型号才能算准节省比例。

登录后可在本页底部提交回答

提问者

Verilog代码练习者查看主页
浏览「其他」

描述场景与已尝试方案,更容易获得有效解答

相关问题

同分类

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位