最近在调试一个MIPI CSI-2接口的摄像头采集项目,用的Xilinx K7系列FPGA,LP状态信号上偶尔会出现毛刺,导致图像偶尔撕裂或花屏。示波器看波形感觉是走线串扰造成的,但改PCB周期太长,领导让先在RTL层面想办法。我目前想到的是对LP信号做连续多拍采样滤波,但担心引入延迟导致时序违例。想问问各位大佬,在RTL层面对MIPI LP信号做滤波一般用什么策略?有没有什么经典的抗毛刺电路结构可以借鉴?另外,HS信号和LP信号切换的时候,有没有什么状态机设计上的坑?
2026年了,FPGA工程师做MIPI CSI-2摄像头采集,LP信号毛刺导致图像撕裂,除了改PCB还有哪些RTL层能做的滤波手段?
6 个回答

先别急着上多数表决。你示波器看到的毛刺是单次触发还是反复出现?如果是周期性的,先抓它和LP跳变沿的相对位置,很多所谓串扰毛刺其实是D-PHY端接或上下拉没配好导致的反射,RTL滤波只能兜底。真想滤波,双沿采样加三拍表决就够,采样时钟用byte clock的4倍以上,别用系统时钟去采,时序压力小很多。

个人感觉你现在的思路有个隐患:连续多拍采样滤波治标不治本,而且CSI-2的LP信号是双向的,你在接收端滤波,万一毛刺出现在发送端(摄像头侧)的LP-TX驱动上,你这边滤完可能把合法的Turnaround或Escape序列也滤掉了。我建议先分两步走:第一步,用ILA把LP信号原始波形和滤波后波形同时抓下来,对比毛刺是否落在HS前导码或LP-11稳定期——如果毛刺只在状态机切换瞬间出现,那多半是跨时钟域采样没对齐,不是走线问题。第二步,如果确认是走线串扰,RTL层能做的其实很有限,常见做法是:LP信号用独立的慢速时钟域(比如24MHz)打两拍,然后对LP-11/HS-0这类长稳定态做窗口判定,只有连续N拍都是同一电平才认;对Escape模式的短脉冲(比如LP-01只有几十纳秒)就不要滤波了,直接透传,否则会把合法的超短序列吃掉。至于HS/LP切换状态机,关键坑是:HS-0进入后必须等T_HS_TRAIL结束才能跳回LP-11,很多撕裂就是状态机提前跳变导致下一帧的SoT没对齐;建议加一个超时计数器,比如超过2ms还停在HS-0就强制回LP-11并拉一次错误标志,这样至少能恢复,不会一直花屏。另外,多数表决的窗口宽度要可配置,留个寄存器方便上板调,别写死。你用的K7的GTX是不管LP的,LP都是进普通IO,所以还得确认一下你的IO标准是不是设成了LVCMOS或者LVDS,这影响输入迟滞,有时候调一下IBUF的IBUF_LOW_PWR属性反而比滤波更有效。

滤波只是手段,你得先想清楚毛刺到底怎么进来的。CSI-2的LP信号在接收端通常经过一个差分转单端的接收器,毛刺如果发生在接收器输出端,那大概率是共模噪声,这时候你在RTL里怎么滤都滤不干净,因为毛刺宽度可能和合法信号一样宽。我建议你先做一个实验:把LP信号在FPGA内部先寄存一拍,然后用这一拍和原始信号做异或,抓异或结果为1的脉冲宽度分布——如果毛刺宽度集中在几个纳秒,那用三拍表决(每拍间隔约5ns)能滤掉;如果毛刺宽度有几十纳秒,那滤波窗口就得拉大,但拉大了又会把Escape模式的短脉冲滤掉,这时候不如改走线。状态机这边,我自己的经验是:不要用单热码状态机直接跳,先做一个LP电平译码器,把LP-00/01/10/11译成4个单bit信号,每个信号单独打拍滤波,然后状态机只认滤波后的译码结果,这样毛刺不会直接进状态转移逻辑。另外,HS进入前要检测到连续的LP-11至少T_HS_SETTLE时间,HS退出后要检测到LP-11再等T_HS_TRAIL,这两个参数在MIPI spec里有典型值,但实际板子可能偏大,建议留寄存器可调,别用常量。超时保护必须有,但超时时间别设太短,我见过有人设了1ms结果在长帧的HS blanking期间误触发,把正常传输打断了。你现在的撕裂是偶发还是概率比较高?如果是偶发,可能不是毛刺问题,而是帧同步信号没对齐,建议先查一下你的帧起始码检测逻辑。

别人都在说滤波,我提醒一个容易被忽略的点:K7的IOB里自带可编程的输入延迟(IDELAY),你可以把LP信号走IDELAY链,用TAP值微调采样点,避开毛刺所在的相位窗口。这个比多数表决靠谱得多,因为毛刺通常出现在信号跳变沿附近,你只要把采样点挪到眼图中央,根本不需要滤。具体做法是:LP信号进IBUF后接IDELAYE2,输出直接采一拍,然后在线用ILA看毛刺是否消失,TAP值从0往上扫,找到最稳定的区间。代价是每个LP信号占一个IDELAY资源,K7上够用。至于状态机,HS和LP切换时最大的坑是没区分「进入HS」和「退出HS」两种毛刺:进入HS时毛刺可能导致状态机误判为LP-11而跳过前导码,退出HS时毛刺可能导致状态机误判为LP-00而提前结束HS,这两种症状都是撕裂但机理不同。建议状态机里分别记录最近一次错误类型,上板后先看错误计数是哪种多,再对症下药。最后说句实话,RTL滤波只能把撕裂概率从1%降到0.1%,想完全消除还是得改PCB,你最好同时催领导安排改板,别把希望全押在代码上。对了,你摄像头是接在FMC子卡上还是直接焊在主板上?这决定了我上面说的IDELAY方案可行性。

先说一个我踩过的坑:别一上来就给LP信号接一堆打拍逻辑,先分清毛刺是发生在LP稳定电平期还是跳变沿附近。如果毛刺只在跳变沿前后几个纳秒出现,那本质是采样相位问题,你滤它干嘛?直接用IDELAY把采样点往眼图中间挪就行,K7的IOB里自带IDELAYE2,TAP值从0往上扫,用ILA看哪个区间最干净。真正需要滤波的是那种稳定期也随机冒出来的窄毛刺,这时候双沿采样加三拍表决确实够用,采样时钟用byte clock的四倍以上,别拿系统时钟硬采。但注意表决逻辑会引入两三个周期的组合延迟,如果LP状态机对时序敏感,建议把表决结果打一拍再进状态机,别让毛刺直接怼到状态寄存器上。另外HS和LP切换的状态机,务必加超时保护——万一毛刺把状态机带飞,至少能在几十微秒内跳回LP-11重新等待前导码,不然撕裂会变成永久花屏。你现在的毛刺是只在切换瞬间出现,还是LP稳定期也偶发?这个决定了先查IDELAY还是先上表决。

个人感觉你现在的思路有个隐患:连续多拍采样滤波治标不治本,而且CSI-2的LP信号是双向的,你在接收端滤波,万一毛刺出现在发送端(摄像头侧)的LP-TX驱动上,你这边滤完可能把合法的Turnaround或Escape序列也滤掉了。我建议先分两步走:第一步,用ILA把LP信号原始波形和滤波后波形同时抓下来,对比毛刺是否落在HS前导码或LP-11稳定期——如果毛刺只在状态机切换瞬间出现,那多半是跨时钟域采样没对齐,不是走线问题。第二步,如果确认是走线串扰,RTL层能做的其实很有限,常见做法是:LP信号用独立的慢速时钟域(比如24MHz)打两拍,然后对LP-11/HS-0这类长稳定态做窗口判定,只有连续N拍都是同一电平才认;对Escape模式的短脉冲(比如LP-01只有几十纳秒)就不要滤波了,直接透传,否则会把合法的Escape序列滤成毛刺判负。状态机这边,别用单热码直接跳,先做一个LP电平译码器,把LP-00/01/10/11译成4个单bit信号,每个信号单独打拍滤波,然后状态机只认滤波后的译码结果——这样毛刺不会直接进状态转移条件,比在状态机内部硬扛干净得多。另外提醒一句:HS和LP切换时最大的坑是没区分「进入HS」和「退出HS」两种毛刺,进入HS时毛刺可能导致状态机误判为LP-11而跳过前导码,退出HS时毛刺可能导致状态机误判为LP-00而提前结束HS,这两种症状都是撕裂但机理不同,建议在状态机里分别记录最近一次进入和退出的时间戳,方便ILA定位。你摄像头端的LP驱动是片上端接还是外部上拉?这个会影响毛刺的反射特性,能说下具体型号吗?
发表回答
登录后可在本页底部提交回答