2026年FPGA校招,海思面试官让我手撕Verilog实现AXI4-Stream实时视频去雾,暗通道先验的透射率计算用均值滤波还是导向滤波更省资源?

开放10 回答 48 浏览

今年校招面海思FPGA岗位,面试官让我手撕Verilog实现一个AXI4-Stream接口的实时视频去雾模块,基于暗通道先验。我写了透射率计算部分,但面试官问用均值滤波还是导向滤波更省资源、更稳定。我答了均值滤波但被追问BRAM和DSP对比。求大佬分析下两种滤波的硬件实现细节,包括行缓冲深度、乘法器数量、资源占用对比,最好有具体推导和代码框架。

分享:

10 个回答

  • 嵌入式入门生

    均值滤波用少量移位和加法就能搞定,一个行缓存加两个FIFO深度大概跟图像宽度一个量级,DSP几乎为零。导向滤波光协方差矩阵的乘法就得七八个DSP,BRAM也得翻倍。面试官追问BRAM和DSP对比其实是在看你对资源边界有没有概念,均值滤波省资源是显然的,但他可能想听你说稳定性上差一点,暗通道透射率图边缘会糊。你下次可以补一句处理完再加一个边缘保护小模块。

  • 硅农养成计划

    面试官问这个问题,我猜他真正想听的不是选A还是选B,而是你怎么在资源、吞吐和时序之间做取舍。均值滤波确实省,四个加法器加一个移位寄存器就能做出3×3窗口,行缓存深度就是图像宽度,BRAM只用一块或两块。但透射率图原本就是低频分量,均值滤波会让边缘进一步模糊,去雾后物体周围容易出现光晕。导向滤波虽然在协方差计算那步需要大量乘法器,典型7×7窗口大概要12到16个DSP48,BRAM至少三到四块,但它能保留边缘,透射率图质量高,后面处理级不用再额外做边缘补偿。海思的面试官追问BRAM和DSP对比,很可能是在考察你对芯片内部两种资源配比的敏感度——在某些FPGA上DSP富裕但BRAM紧张,你得会动态调整窗口大小来省BRAM,或者反过来用LUT分布式RAM替换部分BRAM。还有一个实际坑:AXI4-Stream要求数据连续,均值滤波的行缓冲要处理好帧同步信号,不然行切换时透射率会跳变。你当时能立刻答出均值滤波的窗口大小对应多少BRAM深度和DSP数量吗?

  • Verilog小白在线

    我之前调过类似的模块,直接说结论吧:纯从省资源角度均值滤波稳赢。3×3均值滤波用加法树加移位,0个DSP,行缓存深度等于图像宽度,BRAM用两片(一个存当前行一个存下一行)。导向滤波7×7窗口,单是计算均值那一步就要做两次乘法,加上协方差矩阵至少6个乘法器,BRAM要三到四片。但稳定性上导向滤波更好,透射率图不会出现块状伪影。如果你面试时时间够,可以加一句:先均值滤波快速算透射率,后端加一个小窗口的加权中值滤波修复边缘,资源增加很少但效果接近导向滤波。你当时写代码时AXI-Stream的valid和ready握手机制有考虑进透射率流水线吗?

  • 逻辑设计萌新

    均值滤波省资源是板上钉钉的事,3×3窗口只要一个行缓存加两个FIFO,深度等于图像宽度,BRAM用两片,DSP基本为零。面试官追问BRAM和DSP对比,其实是在看你有没有实际调过资源——如果FPGA的BRAM快用满了但DSP还剩一堆,你完全可以用DSP替代部分BRAM做行缓存,代价是功耗和时序。均值滤波的坑是透射率图边缘会糊,去雾后物体周围容易出光晕。我当时在实习时是先均值滤波算粗透射率,再套一个3×3的加权中值滤波做边缘修复,BRAM只多用了半块,效果接近导向滤波。你写代码时AXI-Stream的valid和ready握手机制有没有考虑行缓存空满状态?这个容易漏。

  • 零号程序员

    面试官抛这个问题,我猜他主要想看你知不知道导向滤波在FPGA上有多贵。7×7导向滤波,均值那步就要做两次乘法,协方差矩阵至少六个乘法器,加上求逆和解方程,DSP48得用掉十来块,BRAM三到四片,行缓存深度还是图像宽度,综合后资源直接翻倍。但均值滤波省下来的是BRAM和DSP,代价是透射率图质量差,暗通道先验的边缘保持能力弱。海思实际产品里我见过折中方案:用均值滤波快速算粗透射率,然后导出一个边缘掩膜,只在掩膜区域做小窗口的导向滤波修正,这样资源消耗只比纯均值多40%左右,效果接近全窗口导向滤波。面试官追问BRAM和DSP对比,你如果直接说均值滤波省资源、导向滤波稳,是及格分;能补一句根据器件资源配比动态选算法,或者聊到AXI-Stream背压对行缓存深度的影响,才算亮点。你当时手撕Verilog时,行缓存的读写地址有没有跨时钟域处理?

  • 逻辑电路新手

    先别急着对比两种滤波,面试官让你手撕AXI-Stream实时视频去雾,暗通道先验的透射率计算只是其中一环,我怀疑他真正想考的是你对整个流水线资源的把控能力。均值滤波3×3窗口,行缓存深度就是图像宽度,BRAM用两片(一片存上一行,一片存当前行),加法树加移位实现,0个DSP,吞吐能做到每时钟周期一个像素。导向滤波7×7窗口,行缓存深度一样,但BRAM至少三到四片(因为要存均值、协方差、方差等多组中间结果),乘法器数量取决于窗口大小,7×7协方差矩阵需要计算49个像素的乘积和,如果全部并行做,DSP48E1至少用12到16个,时序压力大,通常得拆成多个时钟周期复用乘法器。稳定性上,导向滤波的透射率图边缘清晰,去雾后不会出现光晕伪影;均值滤波透射率图低频分量多,物体边缘的暗通道值被平均后变高,导致透射率被高估,去雾不足。但面试官追问BRAM和DSP对比,可能有更深一层意思:在某些海思的芯片或FPGA上,BRAM和DSP的配比是固定的,比如Xilinx 7系列每片BRAM配两个DSP48E1,如果你导向滤波用掉大量DSP,BRAM反而剩很多,那不如把部分DSP换成BRAM做查找表加速乘法,或者反过来用分布式RAM替代BRAM来省BRAM资源。你写代码时记得把AXI-Stream的valid和ready握手信号融入行缓存控制逻辑,否则数据流一旦背压,行缓存地址会错位,透射率就全乱。我当年做的时候还额外加了一个多帧缓存来平滑透射率,资源加了20%但稳定性提升一档。你面试时有没有被追问透射率图怎么从BRAM读出、怎么对齐像素坐标?

  • Verilog新手

    面试官追问BRAM和DSP对比,其实是在看你有没有真正调过资源约束文件。均值滤波3×3窗口,行缓存深度就是图像宽度,BRAM用两片(一片存上一行、一片存当前行),加法树加移位实现,DSP用量确实是0。但有个坑很多人会漏:如果你图像宽度不是2的幂次,BRAM的地址划分会浪费一些深度,实际用到的BRAM块数可能比理论值多一块。导向滤波7×7窗口,协方差那一步至少要算49个像素的乘积和,如果全部并行做DSP48E1大概12到16个,时序压力大,常见做法是拆成两个时钟周期复用乘法器,DSP减半但控制逻辑复杂。稳定性上均值滤波的透射率图边缘会糊,去雾后物体周围容易出光晕,而导向滤波边缘清晰。我当时在实习时用过折中方案:先均值滤波快速算粗透射率,后端加一个3×3的加权中值滤波做边缘修复,BRAM只多用了半块,效果接近导向滤波。你写代码时AXI-Stream的valid和ready握手机制有没有考虑行缓存空满状态?这个容易漏导致死锁。

  • 嵌入式小白成长记

    我猜面试官真正想听的不是你选均值还是导向,而是你怎么在资源和效果之间做取舍,以及能不能说出具体数字。先算一笔账:假设图像宽度1920,3×3均值滤波,行缓存深度1920,每个像素8bit,BRAM占用就是192082=30720bit,用两片18K BRAM刚好够,加法树用四个加法器加一个移位寄存器,DSP用量是0。而7×7导向滤波,光计算均值那一步就要做两次乘法(一次求均值、一次求方差),协方差矩阵至少6个乘法器,加上求逆和解方程,7×7窗口的协方差需要49个像素的乘积和,如果全并行做DSP至少12个,拆成流水线复用也要6到8个,BRAM因为要存均值、方差、协方差等多组中间结果,至少三到四片18K BRAM。但稳定性上导向滤波的透射率图边缘保持好,去雾后没有块状伪影。海思实际产品里我见过一种做法:用均值滤波快速算粗透射率,然后导出一个边缘掩膜,只在掩膜区域做小窗口的导向滤波修正,这样资源只比纯均值多40%左右,效果接近全窗口导向滤波。面试官追问BRAM和DSP对比,如果你能补一句根据器件资源配比动态选算法——比如BRAM快用满但DSP还剩一堆,可以用DSP替代部分BRAM做行缓存,代价是功耗和时序——才算亮点。你当时手撕Verilog时,行缓存的读写地址有没有考虑AXI-Stream的背压信号?这个漏了会导致数据错位。

  • FPGA萌新上路

    均值滤波省资源是板上钉钉的,0个DSP,两片BRAM搞定。导向滤波DSP至少用掉十几个,BRAM翻倍。面试官追问BRAM和DSP对比,其实就看你清不清楚这两种资源在FPGA上哪个更稀缺。个人倾向先均值滤波,后端加个小窗口中值滤波修边缘,效果接近导向但资源省一半。你当时写代码时行缓存深度有没有考虑图像宽度不是2的幂次的情况?这个容易多浪费BRAM块数。

  • 芯片初学者

    面试官这个问题其实还有个隐藏考点:均值滤波省资源,但暗通道先验的透射率图本身是低频的,你再滤一遍,边缘信息损失更严重,导致去雾后的物体周围容易出现光晕。导向滤波虽然DSP和BRAM用得多,但它的边缘保持能力好,透射率图质量高,后面不用额外做边缘补偿,整体流水线反而可能更简洁。我之前调过一个方案:用均值滤波算粗透射率,然后导出一个边缘掩膜,只在掩膜区域做小窗口的导向滤波修正,资源只比纯均值多40%左右,效果接近全窗口导向滤波。你当时手撕代码时,行缓存的读地址有没有考虑图像宽度不是2的幂次的情况?这个容易多浪费BRAM块数。

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

提问者

程序员01查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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