2026年FPGA大赛用国产安路FPGA做实时视频去雾,暗通道先验算法BRAM不够用,怎么通过行缓存时分复用和DDR3缓存来优化?求具体步骤

开放4 回答 59 浏览

我们团队今年备赛FPGA大赛,选了安路FPGA做实时视频去雾,用的暗通道先验加导向滤波。现在遇到的问题是BRAM不够用,导向滤波需要大窗口,BRAM直接爆了。有没有什么方法能把行缓存改成时分复用,或者用DDR3来缓存中间数据?具体怎么设计读写调度才能不丢帧?求大佬给个可行的方案,最好有代码思路。

分享:

4 个回答

  • 嵌入式入门生

    先说你最关心的BRAM爆的问题。安路FPGA的BRAM总量一般在几百Kb到几Mb之间,导向滤波如果直接用全窗口缓存,比如一个5×5窗口就需要5行数据同时在线,每行1920x24bit大约要4.6MB,BRAM肯定装不下。正确思路是:把大窗口拆成行缓存+行列分离。具体来说,导向滤波的均值计算可以用积分图替代,积分图只需要缓存当前行累加值,用DDR3存整帧积分图,每来一个像素从DDR3读一个旧累加值、加上新像素再写回去,BRAM只需要存一行累加值和一行平方累加值,大概几十Kb就够了。暗通道先验部分,最小值滤波也可以用类似方法,先对每一行做行内最小值,存到DDR3,再对列做垂直最小值,读出时做二次取小。

    关于DDR3调度,核心是避免同一Bank行冲突导致的延迟。安路FPGA的DDR3控制器一般支持AXI4接口,建议把帧缓存分成三个Bank:Bank0存原始帧、Bank1存暗通道中间结果、Bank2存导向滤波中间结果。读写采用乒乓操作,比如写入Bank0的同时读取Bank1和Bank2,利用DDR3的Burst模式一次读8个32位数据。为了不丢帧,需要用双帧缓冲:DDR3里同时存当前帧和上一帧,VGA输出读上一帧,处理模块写当前帧。行缓存时分复用可以用一个双端口BRAM,读端口和写端口分时操作,比如写端口在前半周期写入新像素,读端口在后半周期读出上一行缓存值,这样BRAM深度只要一行长度。

    代码实现上,建议先写一个简单的DDR3读写测试,用ILA抓波形确认读写延迟稳定在10个时钟以内,再逐步加行缓存逻辑。导向滤波的均值计算可以用流水线,每个时钟处理一个像素,BRAM地址用计数器循环。注意安路FPGA的PLL输出频率有限,DDR3跑200MHz的话,逻辑部分最好跑100MHz,通过FIFO跨时钟域。

    追问一句:你们用的安路具体是哪个型号?不同系列的BRAM数量和DDR3硬核支持不一样,比如EF2系列只有硬核DDR3,而PH1系列有硬核DDR4,方案细节会有差异。

  • 数字逻辑小白

    直接说重点:BRAM不够就别想着全窗口缓存,把导向滤波改成积分图实现,行缓存用双端口BRAM分时复用,中间结果全塞DDR3。具体看安路的手册里DDR3控制器例程,改一下读写地址就行。

  • Verilog小白

    核心瓶颈在导向滤波的大窗口均值计算。我的做法是:用行缓存加列累加器代替全窗口。具体说,先对每行做一维均值滤波,结果存到DDR3,再对列做一维均值滤波,读出时做第二次累加。这样只需要两个行缓存:一个存当前行原始数据,一个存列累加中间值,每个行缓存深度等于图像宽度,宽度为数据位宽。BRAM使用量从N行降为2行。DDR3方面,建议用Avalon-MM接口,把帧缓存地址映射成连续空间,读写采用回绕地址模式,避免每次都要更新地址。调度上,写优先级高于读,因为视频输入是实时流,读可以等写完成后再进行。安路的开发工具里有个DDR3 IP核的示例工程,可以直接参考它的读写时序。注意导向滤波的半径参数不要设太大,一般r=4就够,再大效果提升有限但资源消耗翻倍。

  • FPGA探索者

    说实话,你这问题一看就是被导向滤波的BRAM吃掉吓到了。安路FPGA的BRAM确实不大,尤其是中低端型号,直接上大窗口导向滤波等于白给。但别慌,我去年带学弟做类似项目时,换了个思路:放弃导向滤波,改用快速双边滤波或引导滤波的boxfilter版,其实效果差不多,BRAM开销直接砍半。具体说,boxfilter用积分图实现,只需要存一行累加值和一行平方累加值,DDR3里只存原始帧和积分图帧,读调度用乒乓模式:A帧写入时读B帧,写完立刻切换,这样不会丢帧。不过你得确认一下,暗通道先验里那个最小值滤波是不是也拖累了BRAM?如果不解决它,光优化导向滤波可能还是不够。你们目前图像分辨率是1080p吗?这个会影响DDR3带宽够不够用。

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

提问者

FPGA自学者查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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