2026年FPGA校招,海思面试官问手撕Verilog实现AXI4-Stream实时视频去雾,暗通道先验的导向滤波怎么用流水线优化BRAM?我只会基础写法,但面试官说BRAM占用太高,要改成流水线结构。求大神给出具体推导步骤和Verilog代码框架,包括行缓冲深度怎么算、窗口大小怎么选、资源对比表。
2026年FPGA校招,海思面试官问手撕Verilog实现AXI4-Stream实时视频去雾,暗通道先验的导向滤波怎么用流水线优化BRAM?求具体推导和代码
3 个回答

说实话,海思面试官问你BRAM优化,说明你基础写法能跑但资源敏感度不够。暗通道先验去雾里最吃BRAM的就是导向滤波那一步,因为你要存窗口内的像素统计量。我当年自己调这个的时候,第一版直接用了全帧缓存,一个720p的帧就要将近1.8MB的BRAM,直接被导师骂。后来改流水线的核心思路其实就一句话——用行缓冲代替帧缓冲,把二维窗口的统计量拆成一维累加器。具体来说,导向滤波需要算均值、方差这些,窗口大小假设是r=15,那行缓冲深度只需要2r+1行,也就是31行,每行存当前行的像素值和平方值。然后通过滑动累加器,每来一个像素就更新当前列的和,移出窗口的列就减掉。这样BRAM占用从全帧降到31行,对于1080p来说,从大约4MB降到不到100KB。推导的话,你面试时可以画个时间轴,说明每个时钟周期只更新一个像素的局部统计量,然后输出滤波结果。窗口大小的选择取决于你视频分辨率——一般来说720p用r=7到11,1080p用r=15就够。资源对比表你最好自己整理一下,大概就是:普通帧缓存版本BRAM占用是HW3data_width,流水线版本是(2r+1)Wdata_width。代码框架上,重点写三个模块:行缓冲写控制、滑动累加器、除法器共享。面试官估计还等着你提一句——BRAM可以切分成双端口来同时读写,减少冲突。你目前用的什么开发板?如果是xilinx的,Vivado里有个ULTRA_RAM的选项,大分辨率可以考虑混用。

BRAM高的根在存了整帧,流水线就是改成只存几行。行缓冲深度=窗口高度-1,算出来就行。代码框架网上有现成导向滤波的,面试官想听你讲清为什么BRAM降了,就够。

我理解你面试官的意思:他看你基础Verilog能写,但想看看你有没有资源约束的思维。导向滤波的BRAM优化核心是分两阶段流水:第一阶段做水平方向滤波,只用一个行缓冲存W个像素;第二阶段做垂直方向滤波,再存2r+1行。这样比直接做二维滤波省了很多。窗口大小的选取其实和你的输入分辨率强相关,你面试时可以说:对于1080p60,r=7可以做到实时,因为每行只有1920个像素,行缓冲深度为15,BRAM占用大约19201524bits约等于83Kb,而全帧要1920108024bits约等于47Mb,差了500多倍。面试官听到这个数字基本就满意了。代码框架上,记得把除法器做成流水线级,用移位加实现,不要直接调/符号,不然时序过不了。另外,你提一句AXI4-Stream的ready/valid握手要跟行缓冲的写使能联动,不然数据会断流。这些点你准备一下,应该能过这轮。你目前有实际用过HLS做过这个算法吗?如果没有,建议先拿HLS跑通功能,再手写Verilog,省时间。
发表回答
登录后可在本页底部提交回答