今年秋招面海思,面试官让我手撕Verilog实现基于暗通道先验的实时视频去雾,导向滤波那部分BRAM爆了。他说可以用行缓冲优化,但具体怎么设计行缓冲深度和并行度才能不丢帧?我用的是Xilinx Artix-7,BRAM只有50个,求大佬给个具体推导公式和资源对比,最好有仿真波形参考。
2026年FPGA校招,海思面试官让我手撕Verilog实现AXI4-Stream实时视频去雾,暗通道先验的导向滤波怎么用行缓冲优化BRAM?求具体推导和资源对比
3 个回答

海思面试官让你手撕导向滤波,说明他想要的是你对资源与带宽的trade-off有直觉,而不是背公式。行缓冲的核心思路是用深度为一行像素数的FIFO换掉整帧buffer,通常取深度=1080或4096(取决于分辨率),并行度取决于你的计算窗口大小,比如5×5窗口就用5个行缓冲并行读。BRAM从几十个降到个位数,但代价是逻辑多了一倍,自己掂量。

兄弟,这题其实是个经典的面积换速度问题。暗通道先验的导向滤波里,最吃BRAM的是那步均值滤波,因为要同时存多行像素做滑动窗口。面试官提的行缓冲,说白了就是只存当前处理窗口所需的连续行,而不是整帧。具体推导上,假设你要做NxN的导向滤波,行缓冲深度就是一行像素数(比如1920),并行度是N-1条行buffer同时输出给后面的乘加树。资源对比很直观:用BRAM实现整帧buffer,Artix-7上1080p要1080x1920x8位约16.5Mb,50个BRAM每个18Kb,光存一帧就快爆了;换成行缓冲,只存N行,比如5行,BRAM用量降到5x1920x8=76.8Kb,不到5个BRAM。代价是你的控制逻辑要精确算好行同步,保证每行数据进来时,行缓冲里的数据能对齐窗口中心,不然丢帧。仿真波形重点看行有效信号和窗口对齐时刻,Vivado里用ILA抓一下行缓冲的写使能和读使能时序就行。另外,面试官问这个其实是在考察你对Xilinx原语和资源分布的熟悉程度,比如用SRL16代替小深度行缓冲能省BRAM但费LUT,你答出来会加分。你目前是卡在推导公式还是仿真环境搭建?

行缓冲优化导向滤波,别一上来就盯着BRAM数,先算清带宽需求。Artix-7的BRAM总量有限,但每个BRAM可以配成双端口,读写同时进行,行缓冲就是用这个特性。具体做法:把BRAM配置成深度为一行像素、宽度为数据位宽的FIFO,并行度等于滤波窗口行数减1。比如3×3窗口,用2个行缓冲,每个存一行,这样当前行数据进来时,上一行和上上行都能同时读出,送到后面的乘累加器。资源对比上,整帧buffer需要50个BRAM左右,行缓冲只需3-5个,省下来的BRAM可以留给后面的暗通道估计模块。面试官要的是你推导出行缓冲深度 = 图像宽度,而不是随便设个128。写Verilog时注意异步复位和行有效信号的跨时钟域处理,否则仿真波形上会出现毛刺。你的暗通道算法是纯硬件实现还是用了HLS?
发表回答
登录后可在本页底部提交回答