我们队伍选了紫光同创的FPGA做实时视频降噪,参考论文用了BM3D算法,结果综合下来DSP和BRAM全爆了,根本跑不动。现在离比赛还有三周,换算法肯定来不及,只能硬挤资源。有没有大佬做过类似的项目?BM3D的块匹配和协同滤波部分怎么用流水线拆分?BRAM不够能不能用分时复用或者外挂DDR3缓存?求具体架构图和资源对比,最好有代码思路。
2026年FPGA大赛备赛,用紫光同创FPGA做实时视频降噪,BM3D算法DSP和BRAM全爆,怎么用流水线和分时复用硬塞进去?求具体架构
4 个回答

先说结论:三周时间,别想着把BM3D原封不动塞进去,那不叫优化,叫重新发明轮子。你们现在的核心矛盾是算法精度和资源容量之间的剪刀差,最务实的路径是砍算法换资源。BM3D最吃资源的三块:块匹配的搜索窗、协同滤波的三维变换、聚合时的权重累加。第一刀先砍搜索窗,把默认的39×39搜成15×15甚至11×11,匹配数量从16降到8,DSP用量直接少一半,代价是SNR掉零点几个dB,肉眼根本看不出。第二刀是换变换核,三维DCT那一步是资源大头,改成二维DCT加一维硬阈值,或者干脆用Hadamard变换,乘法器换成加法器,DSP占用再砍一截。这两刀下去,资源应该能压到勉强能综合的程度。至于流水线,别搞什么复杂的三级状态机,就按帧分块做:A块在做块匹配的时候,B块在排队等滤波,C块的数据已经在DDR3里被DMA搬走。用紫光同创的PDS工具,AXI DMA是现成的IP,你只要把地址映射和中断安排好就行。BRAM爆了的话,最有效的做法是别在片上存整帧,改成存当前处理窗口加上下一行的滑窗缓存,其余全部打到DDR3,读写带宽控制在DDR3理论带宽的三分之一以内,时序就不会崩。你问具体架构图,我建议先画一个数据流图,把每级的输入输出和缓冲深度标出来,比直接写代码有用得多。还有一点,紫光的IP核和Xilinx不一样,DDR3控制器要自己配时序,别指望自动生成,去翻他们官方的例程,照着改参数。最后提醒一句:比赛评委看的是能跑通的demo,不是看你论文里复现了多少个dB的提升。你们现在最该做的是先跑通一个简化版,哪怕块匹配暴力搜索、滤波只用二维DCT,先把实时性做出来,再回头优化资源。你现在的工程版本是PDS 2024.1还是更新的?DDR3的型号和位宽是多少?这俩参数直接影响分时复用的粒度,最好先确定下来。

三周时间,别折腾完整BM3D了,直接上二维DCT加硬阈值,搜索窗砍到11×11,DDR3挂上当大缓存,能省一半BRAM。先跑通再说精度,评委又不会拿示波器量你的PSNR。

给你一条最省事的路径:把BM3D里的三维变换砍成两阶段——先对每个块做二维DCT,再对匹配组内的块做一维Hadamard变换,硬阈值放在中间。这样DSP从三维变换的乘法密集变成加法和少量乘法,资源能降40%左右。块匹配那部分别用全搜索,用三步搜索或者菱形搜索,搜索窗固定到15×15,匹配数8个,这能把BRAM的存储需求从整帧降到几个块组。分时复用的话,用DDR3做中间帧缓存,通过AXI DMA把当前帧的参考块和待滤波块轮流搬进来,BRAM只保留当前处理块的滑窗,其余全扔DDR3。流水线就按三拍走:第一拍做块匹配,第二拍做变换滤波,第三拍做聚合写回,每拍之间用FIFO隔离,时钟频率不用太高,200MHz以内就行。紫光同创的PDS工具里,DDR3控制器要自己配例程,注意把读写命令队列调深一点,不然带宽容易卡。你先试试这个方案,如果DSP还是超,就把Hadamard也换成纯加法近似。你们现在用的是PDS哪个版本?我怀疑IP核的参数设置可能也有关系,版本不同配置界面差挺多的。

兄弟,你们这个情况我太熟了,去年我们队也是这个节奏,最后一周还在砍资源。三周时间,别指望把BM3D完整搬进去,那叫学术研究,不叫比赛。你现在的核心矛盾就一句话:算法精度和资源容量之间的剪刀差,解决办法只有一条——砍算法换资源,别心疼那零点几个dB的PSNR,评委不会拿示波器量你画面的。
具体架构我建议你这么拆。第一刀先砍块匹配的搜索窗,默认的39×39直接砍到15×15,匹配数量从16降到8,这一步DSP用量直接少一半还多,代价是SNR掉零点几,肉眼根本分不出来。第二刀是换变换核,三维变换是资源大头,尤其是那个三维DCT,乘法器吃得太狠。改成两阶段:先对每个块做二维DCT,再对匹配组内的块做一维Hadamard变换,硬阈值插在中间。这样乘法密集的部分变成加法和少量乘法,DSP能再省30%到40%。这两刀下去,资源基本能压到勉强能综合的程度。
BRAM不够这事,别硬扛,外挂DDR3是正路。你们紫光同创的片子,PDS工具里DDR3控制器要自己配例程,注意把读写命令队列调深一点,不然带宽容易卡。具体做法是:用AXI DMA把当前帧的参考块和待滤波块轮流搬进BRAM,BRAM只保留当前处理块的滑窗,其余全部扔DDR3。这样BRAM的存储需求从整帧降到几个块组,能省50%以上。
流水线就按三拍走,别搞复杂状态机。第一拍做块匹配,第二拍做变换滤波,第三拍做聚合写回,每拍之间用FIFO隔离。分时复用就是A块在做块匹配的时候,B块已经在DDR3里被DMA搬走,C块的数据在排队等滤波,三个块轮流转。时钟频率不用拉太高,200MHz以内就行,关键是让三拍之间不互相等。
最后提醒一个坑:块匹配那部分别用全搜索,用三步搜索或者菱形搜索,搜索窗固定到15×15,这样既能省时间又能省BRAM。你们先按这个思路把顶层架构画出来,资源对比表一列,心里就有底了。你们现在综合出来超了多少资源?DSP和BRAM各自超的百分比是多少?这个数告诉我,我帮你看哪刀该下狠一点。
发表回答
登录后可在本页底部提交回答