比赛倒计时三天,我用高云FPGA做实时视频去雾,暗通道先验算法模块跑下来LUT用了92%,BRAM也爆了,现在连布局布线都过不去。我看往届获奖作品都是把暗通道求取和导向滤波拆成两个流水级,用行缓存替代整帧存储,但具体怎么切分数据流、每级缓存多少行、怎么控制时序才能不丢帧?求一个能落地的架构设计,最好有模块划分和资源估算。
2026年FPGA大赛只剩三天,用高云FPGA做实时视频去雾,暗通道先验算法模块LUT和BRAM不够用,怎么通过行缓存和流水线重构硬挤进去?求具体架构设计
4 个回答

三天时间别想着大改算法,直接把暗通道求取改成7行滑窗,每来一行新像素就移掉一行旧数据,行缓存用分布式RAM,别碰BRAM。导向滤波拆成两个流水级,中间插几级寄存器把关键路径断开,先用资源报告看哪块LUT占比高再决定要不要砍滤波半径。

说实话,三天内要硬挤进去,最该做的是先把数据流画出来,别急着改代码。你现在的瓶颈大概率是整帧缓存和全图最小值计算,这两个都是资源黑洞。暗通道求取改成7行滑窗后,每个窗口只需要比较上下左右四个方向的最小值,这样LUT消耗能砍掉一半以上。导向滤波那边,把均值滤波和方差计算拆成两个子模块,中间插两三级流水寄存器,时序能松很多。小尺寸的中间结果矩阵用分布式RAM存,比如7×7的窗口系数、局部均值这些,BRAM只留给行缓存和输出缓冲。具体估算的话,7行1024宽8bit的缓存大概56Kbit,分布式RAM够用;导向滤波的均值计算用移位寄存器累加,别用乘法器。最后布局布线前先看资源报告,如果LUT还高就试着把比较器换成加法器加阈值判断,能省不少。建议你今晚先把模块划分图定下来,明天写代码,后天专门调时序,比赛前留半天做回读验证。

核心思路就是把暗通道求取改成滑窗模式,只缓存7行,每来一行新像素就更新窗口内的最小值。这样BRAM只存7行数据,用分布式RAM实现就行,剩下大块BRAM留给输出帧缓冲。导向滤波那边,拆成两个流水级:第一级算均值,第二级算方差和校正系数,中间插寄存器断掉长路径。关键是每行数据进来时,要保证上下游模块的握手信号对齐,用valid/ready信号控制,别用全局使能。个人感觉你最大的风险是时序收敛,建议先跑一遍综合看关键路径在哪,如果还是过不去就减少滤波半径,从9×9降到5×5,视觉效果差不了太多但资源能省一大截。

三天这个时间点,别想着把算法再优化一轮了,核心任务是把资源数字压到能过布局布线。你现在的暗通道求取,问题在于它天然是全局操作,整帧最小值和整帧大气光都要全图数据,但实时视频去雾其实不需要那么精确,滑窗近似完全够用。具体做法:把输入图像按行流式送入,暗通道模块只维护一个7行的滑窗,窗口内做最小值滤波。这个7行窗口用分布式RAM实现,每行宽度就是图像宽度,假设是1080p,8bit灰度,那一行大概8Kbit,7行也就56Kbit,分布式RAM完全能扛。关键在于更新逻辑:每进来一行新像素,窗口就整体上移一行,旧行直接丢弃,同时窗口内每个像素位置的最小值要重新算,这个可以用三个比较器做三输入最小值,流水线打两拍,时序压力不大。导向滤波那边,你把它拆成两个子模块,第一级算局部均值,第二级算方差和校正系数。均值滤波也用滑窗,窗口小一点,3×3或者5×5就够了,因为导向滤波本来就是个平滑操作,精度要求不高。两个子模块之间插三级流水寄存器,把乘法和除法分开,除法用移位近似,别调IP核,高云的除法器资源很紧张。中间结果,比如局部均值、方差,这些矩阵尺寸小,用分布式RAM存,BRAM只留给输出帧缓冲。最后布线前,先跑一遍综合,看资源报告里LUT和BRAM的占比,如果LUT还高,就把暗通道里的比较器换成加法器加阈值判断,能省不少逻辑。你今晚先把模块划分图画出来,数据流标清楚,明天写代码,后天调时序,三天够了。对了,你用的是高云哪款芯片?如果是小容量型号,BRAM总量本来就不多,可能还得考虑把输出缓冲改成按行输出,不存整帧。
发表回答
登录后可在本页底部提交回答