备赛2026年FPGA大赛,打算用紫光同创FPGA做1080p60帧实时视频去雾,暗通道先验算法需要计算每个像素的局部最小值,BRAM不够用。尝试了分块处理(把图像分成16×16块),但块边界伪影严重。也试了流水线重排,把最小值计算和透射率估计并行,但时序不收敛。求各位大佬支招,有没有不牺牲太多画质的资源优化技巧?
2026年FPGA大赛,用国产紫光同创FPGA做实时视频去雾,暗通道先验算法BRAM不够,怎么用分块处理和流水线重排硬挤出来?
提问
回答 4

暗通道先验本质是找局部最小,BRAM不够的本质是窗口缓存占得太凶。紫光同创的PGL系列BRAM容量确实比同价位Xilinx紧,但也不是完全没招。我去年做类似项目时踩过同样的坑,分块伪影是因为你直接割裂了块间的统计依赖——暗通道的最小值必须跨块平滑过渡。一个相对省BRAM的改法是:把16×16块改成行流水+滑窗,用LineBuffer只缓存两行数据,然后对每个3×3或5×5窗口做局部最小值,这样BRAM消耗从整块缓存降到了两行缓存。代价是去雾效果略弱,因为窗口变小了,但1080p60帧下肉眼几乎看不出差别。时序不收敛的问题,建议把最小值计算拆成两级流水:第一级做行内的横向比较,第二级做行间的纵向比较,中间插一拍寄存器。另外注意紫光的PLL输出频率上限,如果核心时钟跑太高,考虑把像素时钟降半频然后双沿采样,这样时序裕量能多出30%左右。还有一个容易忽略的点:暗通道计算前可以先把RGB转成灰度,只对亮度通道做最小值滤波,这样BRAM位宽直接从24bit降到8bit,省出来的资源刚好给透射率估计用。你现在的透射率估计是在哪一级做的?如果还没细化到具体模块,建议先画一张数据流图标出每个阶段的BRAM占用,再决定砍哪里。另外大赛评委可能更关注系统完整性和实时性,画质略微妥协是能接受的,别为了几个像素的伪影把时序搞崩了。

分块伪影本质是边界条件没处理好,试试在块之间重叠4个像素再拼回去,BRAM多消耗一丁点但画质能救。时序不收敛就先降频,1080p60用75MHz跑够用,别硬刚极限频率。

这个问题其实反映了FPGA大赛里很典型的一个矛盾:算法效果和硬件资源之间的折中。你提到的暗通道先验,在软件上跑很简单,但搬到FPGA上,尤其是紫光同创这种中等规模的芯片,BRAM瓶颈几乎是必然的。我先帮你理一下根因:暗通道需要计算每个像素周围一个较大窗口(比如15×15甚至更大)内的最小值,传统做法是用一个FIFO或者双口RAM缓存整个窗口的数据,这对于1080p分辨率来说,BRAM消耗会随着窗口尺寸平方增长。你的16×16分块思路本身没错,但伪影来自块与块之间的统计不连续——暗通道假设每个块的透射率是常数,但实际图像边缘处这个假设不成立。一个工程上更成熟的方案是引导滤波替代最小值滤波:引导滤波不需要大窗口缓存,只需要对原图和暗通道图做局部均值,这个均值计算可以用积分图来实现,积分图只需要一个加法器树和一个行缓存,BRAM消耗几乎可以忽略。虽然引导滤波的计算量稍大,但你可以用流水线把积分图计算和后续的透射率修正并行起来,时序反而更容易收敛。代价是去雾效果比原始暗通道柔和一些,但对于1080p60帧的实时系统来说,这种柔和其实更符合人眼视觉。另一个容易被忽略的技巧是数据量化:紫光同创的BRAM支持真双口模式,你可以把像素数据从8bit量化到6bit甚至5bit,暗通道计算的精度损失很小,但BRAM位宽减半意味着同样数量的BRAM可以缓存两倍的行数。不过注意量化要在算法仿真阶段先验证PSNR下降是否在可接受范围内,别等到上板才发现花屏。最后,如果你非要保留原始暗通道的窗口大小,可以考虑用外部DDR3做帧缓存,然后从DDR里按行读取数据做滑窗,这样BRAM只存两行,DDR带宽够用的话完全能跑1080p60。紫光同创的PGL系列一般带硬核DDR控制器,这个路径反而是最稳妥的,只是代码复杂度会高一些。你目前手头有开发板的DDR接口例程吗?如果还没调通DDR,建议优先攻克这个,一劳永逸。

我看你提到紫光同创的芯片,先确认一下具体是哪一款?PGL25还是PGL50?BRAM总量差挺多的。回到正题,分块伪影的根源在于暗通道最小值统计在块边界处跳变,你试过在块之间做重叠计算吗?比如16×16的块,实际每次取18×18的窗口计算,输出只取中间的16×16,这样边界处的像素能参考到相邻块的数据,伪影会平滑很多。BRAM开销只多了一丁点——每块多两行两列的缓存,总容量约增加25%,但效果提升很明显。时序问题我倒是觉得你流水线拆得还不够细:把最小值计算拆成横向比较和纵向比较两级,中间插寄存器,频率上不去通常是因为组合逻辑太长。另外,紫光的PLL输出范围有限,如果核心时钟跑太高,可以考虑把像素时钟降到75MHz,用双沿采样处理1080p60,这样时序余量能多出不少。画质方面,如果你接受轻度去雾效果,可以试试把窗口从15×15降到7×7,BRAM消耗直接降一半,时序压力也小很多——1080p60下7×7窗口的雾霾去除效果对于大部分户外场景其实够用了,边缘细节反而保留得更好。最后提醒一句:大赛评审更看重工程完整性,与其花时间硬怼BRAM,不如把去雾效果调稳、把帧率跑实,拿分可能更高。你目前分块大小和窗口大小具体是多少?这个信息能帮你更准地评估优化空间。
发表回答
登录后可在本页底部提交回答
