2026年FPGA大赛备赛只剩两周,做实时视频去雾,暗通道先验算法在国产FPGA上BRAM不够用,除了分时复用还有哪些骚操作?

开放5 回答 3 浏览

我们组用安路FPGA做实时视频去雾,暗通道先验算法需要存大量透射率和大气光值,BRAM直接爆了。分时复用试了但帧率掉到25fps,甲方要求至少30fps。除了分时复用,有没有用分布式RAM做行缓存、或者把透射率计算改成流水线逐像素更新的骚操作?求具体步骤和资源估算,急!

分享:
  • 嵌入式系统初学者

    先别急着换算法,BRAM不够但分布式RAM和寄存器还有余量的话,可以试着把暗通道先验里最占BRAM的透射率缓存拆成按行处理的乒乓结构。具体说:你的图像是1920×1080吧?暗通道先验需要求每个像素邻域内的最小值,常规做法是存一帧的透射率图,但你可以只缓存两行透射率——用两个行缓冲器做滑动窗口,每来一行新数据就更新当前行的透射率,同时把上一行的结果送出去。这样BRAM占用能从1080行降到2行,代价是计算延迟多了几行。大气光值更简单,不用存全图,每帧只更新一次全局最大值,用寄存器加比较器就能搞定。资源估算上,假设每个像素透射率8bit,1920像素一行,两行就是192028=30.72kbit,大部分国产FPGA分布式RAM能撑住。帧率方面,流水线逐像素更新天然就是每个时钟周期出一个结果,只要你的最小值计算组合逻辑不超一个时钟周期,就能跑到你安路芯片的最高频率,25fps的问题大概率是分时复用引入了等待周期。另外注意暗通道先验里的最小值滤波可以用3×3或5×5的硬件加速器,别用软件思维套。你现在还剩两周,建议先花三天把行缓存流水线搭出来,用chipscope抓一下时序,看瓶颈是组合逻辑延迟还是布线拥塞。对了,你们的视频分辨率是多少?如果是1080p,25fps说明主频大概在50MHz左右,换成流水线后应该能轻松上100MHz,帧率自然就过了。

  • FPGA学习中

    分时复用掉帧说明你是在用面积换时间,但方向反了——应该用流水线换面积。把暗通道先验的求最小值步骤拆成三级:第一级读三行像素,第二级做行内最小值,第三级做列间最小值,每级只存一行数据。这样BRAM占用从全帧降到三行,帧率还能保持每个周期出一个像素。安路FPGA的分布式RAM做行缓存够用,前提是分辨率别超过4K。试试这个,两周时间够改。

  • 技术新芽

    别纠结BRAM了,直接上分布式RAM做行缓存,把透射率计算塞进流水线里,分时复用是给没时间优化的人用的。你们甲方要30fps,25fps差那几帧大概率是分时复用的握手信号占了周期。赶紧改,改完去测时序。

  • 嵌入式入门生

    说实话,两周时间改架构,最怕你一边调一边怀疑自己在瞎折腾。你现在的核心矛盾不是分时复用本身好不好,而是分时复用把握手信号插得太密,导致每帧有效像素周期被稀释了。换个思路:别在BRAM上死磕存整帧透射率,改用分布式RAM做两个行缓冲器,每个存一行1920x8bit的透射率中间结果,总共也就30kbit左右,安路大部分型号的分布式RAM能扛住。具体操作是,把暗通道先验的求最小值拆成三级流水——第一级读三行像素,第二级做行内最小值,第三级做列间最小值,每级只存一行数据。这样BRAM占用从全帧降到三行,帧率还能保持每个周期出一个像素。但有个坑:大气光值不能再按传统方法存全帧再找最大值了,改成每帧只更新一次全局最大值,用寄存器加比较器搞定,省下额外BRAM。风险在于,如果你们分辨率超过2K,分布式RAM可能不够塞三行缓存,那就得退一步用两行加滑动窗口,代价是边界像素的透射率计算会延迟几行,但帧率不会掉。另外提醒一句:改完记得用安路自带的IP核例化分布式RAM,别手写寄存器阵列,否则时序跑不到150MHz。你们现在的分辨率具体是多少?如果已经是1080p,那这个方案大概率够用。

  • 芯片学徒

    两周时间,别想着搞什么花哨优化了,直接上硬核骚操作:把透射率计算从全局改成局部滑动窗口,并用FPGA的DSP切片代替BRAM做最小值比较树。你们现在BRAM爆掉,本质上是把透射率图当成一帧图像来缓存,但暗通道先验的数学本质只是对每个像素的邻域做最小值滤波,根本不需要存整帧。具体做法:在FPGA里搭一个3×3或5×5的滑动窗口,窗口内的像素值用移位寄存器链缓存,每个时钟周期滑动一个像素。这个移位寄存器链用分布式RAM实现,只存N行像素(比如3行1920像素,每像素24bit RGB,总共3192024=138240bit,安路EG4系列有约200kbit分布式RAM,够用)。然后透射率计算直接在窗口内用组合逻辑求最小值,不需要BRAM。大气光值更简单:每帧开始时清空一个全局最大比较器,每来一个像素就和当前最大值比,帧末锁存结果。这样整个设计变成纯流水线,每个时钟周期出一个去雾像素,帧率只受时钟频率限制,30fps在100MHz下轻松跑满1080p。资源估算:分布式RAM约140kbit,LUT约2000个,DSP用不上,BRAM省到只存一帧输出图像(如果输出需要缓存的话)。但有一个关键前提:你们的去雾算法必须接受透射率是逐像素实时计算的,而不是先算完一帧再查表。如果甲方要求透射率平滑或时间一致性,那滑动窗口的局部性会导致帧间抖动,这时候得在透射率输出端加一个简单的IIR滤波器,用两个DSP切片乘加就能搞定,不会增加BRAM压力。最后说一句:别怕改流水线,安路FPGA的时序约束工具对纯组合逻辑的滑动窗口支持很好,只要你不跨时钟域乱搞,两周时间足够验证。建议你们先把现有工程里的BRAM全释放掉,搭一个最小系统跑通滑动窗口,再逐步加回外围模块。追问一句:你们的去雾算法里有没有用到导向滤波?如果有,那才是BRAM大户,得考虑用均值滤波近似替代,否则两周肯定搞不定。

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

提问者

嵌入式开发萌新查看主页

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

浏览「其他」

相关问题

同分类问答

提问建议

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

技术问答

问完之后的闭环

  • 关联课程精学高频问题往往对应章节,建议回到课程补基础。
  • 产出与互助解决过程可写成笔记,帮助后续同学。

探索全站