原创 简单同步不是滤除毛刺的好方法

2006-12-13 11:39 9445 7 18 分类: FPGA/CPLD

    记得有一位博友不久前发过一篇文章,是关于滤除毛刺的多种方法的,其中提到了用同步的方法滤除毛刺。这篇文章就是关于跨时钟域同步逻辑和毛刺滤除方法的。 riple


    这些天我调试的一个系统就因为毛刺的问题出现了不稳定现象。对于毛刺我是很小心的,专门对这个18位的计数器q值进行了两级同步。但是今天早晨用signal tap抓到了由于两级同步造成的“毛刺放大”现象。图形如下: riple


点击看大图


    图中dma_req_end_d2信号与counter|q[7:0]信号(只对18位计数器的低8位信号进行了采样,在下面的代码中对应dma_req_counter)的关系如下: riple
wire dma_req_end = (dma_req_counter==18'd0)?1'b1:1'b0;
always @(posedge clk)
begin
  dma_req_end_d1<=dma_req_end;
  dma_req_end_d2<=dma_req_end_d1;
end
wire dma_req_end_filtered = dma_req_end && dma_req_end_d2;


    由上面的代码可知,只有当dma_req_counter计数到全0时,组合逻辑dma_req_end才应该输出一个高电平,dma_req_end_d2信号是对dma_req_end信号进行了两级同步得到的。 riple


    初看起来,两级同步是满可以把毛刺滤除的,也是跨时钟域的典型处理方法。但是明眼人会看出,如果同步时钟的采样沿恰好命中一个毛刺,而且毛刺的宽度和位置恰好满足建立保持时间的话,那么在第一级同步时就会采样到一个毛刺。毛刺毕竟是毛刺,这个毛刺在第一级同步的下一个采样时钟就消失了。这样,第一级同步的输出就会是一个完整的脉冲。这个脉冲可以很好的满足第二级同步的建立保持时间,于是这个被放大的毛刺就传递到了第二级同步的输出端。 riple


    在上面的波形中,q值由10跳转到0f过程中不可避免的会产生00毛刺(10->00->0f),这个毛刺就被上面代码中的两级同步放大成了dma_req_end_d2的输出脉冲。这个脉冲引发状态机的异常跳转,进而引发bug。由于我采用的采样时钟相对较慢,真正的毛刺在上面的波形中是看不到的。但是通过代码是可以分析出毛刺和异常脉冲之间的关系的。 riple


    这样看来,逐级同步非但不能滤除毛刺,在绝大多数情况下还会放大毛刺,起到了推波助澜的作用。 riple


    那么,对于这种毛刺就一定不能滤除吗?(这样的毛刺一定要滤除,否则被状态机的跳转逻辑采样到也会产生同样的问题。)同步方法真的不可取吗?答案是否定的。大家看一下代码的最后一行,这一句是我找到bug后添加进去的。这句话可以有效地起到滤除毛刺的作用,最大可以滤除长度为一个同步时钟周期的毛刺。 riple


    滤除的原理是把原始不干净的信号和此信号延时后的信号相与,如果二者都是1的话,才能产生结果为1的输出。对毛刺的滤除效果取决于延时的长度。当然,也可以把第一级同步和后几级同步的信号相与,效果是相同的。 riple


    这种滤除毛刺的方法利用了毛刺和稳定信号在持续时间长度上的差别。换句话说,毛刺的频率通常会高于稳定信号的频率,如果构建一个合适的数字滤波器,就可以把毛刺对应的频率滤除,得到干净的稳定信号。当然,代价是引入了一定的延时。 riple


 


    今天发现上面的文字有一些不甚严密的地方: riple


    1. 被第一级同步采样到的毛刺不一定要满足第一级同步寄存器的建立保持时间才会被放大。如果这个毛刺不满足建立保持时间的话,第一级同步寄存器的输出会进入亚稳态(metastable),第二级寄存器对这个亚稳态采样会得到一个不确定的稳定状态(也有极小的可能性进入一个新的亚稳态,概率比第一级进入亚稳态小得多了)。这就是消除亚稳态的措施遵循的原理:第二级进入亚稳态的可能性要比第一级小得多,所以第二级的输出可以认为是稳定的。但是需要注意的是,第二级的输出是稳定的,但取值是不确定的;只有在第一级的输出退出亚稳态后,在第二级才能得到稳定且确定的输出。 riple


    这个输出可能是我希望的0状态,也可能是我不希望的1状态。如果是1状态,那么就会产生一个稳定的脉冲输出。 riple


    实际上,完全消除亚稳态是不可能的,只能采取上面这样的措施使亚稳态发生的概率减小至可以忽略的程度。亚稳态是个杀不死的幽灵。 riple


    2. 把原始信号与两级同步的输出信号相与不能滤除所有形式的毛刺。假设第一个毛刺被两级同步放大成脉冲,而在第三个时钟上升沿处原始信号又出现一个毛刺,那么两者相与的结果就是一个新的毛刺,这个毛刺被后面的逻辑采样到的话,就会引发新的问题(毛刺放大或者是亚稳态传递)。 riple


    所以,上面用于滤除毛刺的代码是建立在某种假设上的,我的假设是在第三个时钟上升沿处不会出现新的毛刺或者跳变沿。这个假设在本例中是成立的:计数器时钟周期是同步时钟的10倍。第一级同步采样到毛刺后,9个时钟周期内都不会采样到新的毛刺或跳变沿;第一级同步采样到毛刺时,之前的9个时钟周期内都没有毛刺或跳变沿。也就是说,毛刺的持续时间不会超过1个本地时钟周期,出现的周期最短是10个本地时钟周期,符合假设。 riple


   用这种方法可以起到跨时钟域同步和滤除毛刺的双重功能。 riple


    3. natived朋友说得很对,优化逻辑消除不稳定因素是根本。如果把上面的计数器改为格雷码计数器可以有效地避免毛刺的产生。 riple 
    natived朋友担心采用上面的方法会造成降频,其实不必。 riple 
    两级同步是跨时钟域信号处理的常用方法,不会造成系统降频。 riple 
    当组合逻辑过于复杂以至于在一个时钟周期内不能稳定下来时,常可以采用“pipelining”和设计“multicycle路径”两种方法应对。这两种方法都通过引入局部延时避免了系统降频。甚至是提高系统频率的好方法。 riple 
    所以,设计合理的局部延时不会造成系统降频。 riple 
    我这个设计确实存在跨时钟域的问题:计数器的时钟与同步的时钟不同,周期是同步时钟的10倍。跨时钟域通常采用两级同步的方式避免产生亚稳态,这也是上面代码的初衷。我认为,跨时钟域处理可以在计数器之前进行(把计数器的时钟同步到后级时钟),也可以在计数器之后进行(就像上面代码中那样)。至于哪种更好,还请大家批评。 riple

PARTNER CONTENT

文章评论11条评论)

登录后参与讨论

用户1556010 2010-7-5 21:08

我刚拜读过,挺好的

ash_riple_768180695 2008-8-29 23:46

恩,这是我的一个毛病。

ilove314_323192455 2008-8-27 22:55

不太明白,貌似没有把问题说明白

用户1359586 2008-8-7 19:49

很有帮助!

ash_riple_768180695 2007-8-20 11:08

你好,有什么问题到我推荐的小组里去讨论吧,把问题描述清楚,会有很多热心人帮助你的。

ash_riple_768180695 2007-8-8 13:15

部分同意你的观点。如果在FPGA内部同一时钟域内,可以采用约束的方法。只要涉及到跨时钟域,采用约束往往不能得到令人满意的结果:跨时钟域和异步信号传输可以看作一类问题,需要采用特殊的电路处理。

我在以后的文章里会专门介绍跨时钟域电路的。

用户1049668 2007-8-8 09:05

个人认为,你的解决思路没办法把同步逻辑中所有的毛刺问题都解决掉。除非能把所有产生毛刺的地方都找出来。这在复杂的设计里几乎是不可能的。能否考虑对寄存器的输入端加上setup和hold时间约束,然后进行综合。对于不能满足约束条件的path进行优化。

ash_riple_768180695 2007-6-3 13:25

这位仁兄说得很对,后面这句确实等于没有做sync。对于第一句,我想表达一个比较器,还没有想到更好的表达方法。

对于滤除毛刺的问题,我的设计在一开始就错了:应该在计数器之前同步到后级时钟;或者在计数器之后采用前级时钟进行一次同步,然后在后级时钟域进行两级同步。针对后一种方法,综合工具会保证前级时钟同步逻辑的时序,针对这一信号进行跨时钟域处理就不会放大毛刺。

现在看来,我举的这个例子本身是有问题的。拿出来,供大家解剖吧。

后一句的写法确实有问题,可是能够解决我遇到的问题。也许这种写法能够解决我的这个问题,在其他情况下就会引发新的问题。

ash_riple_768180695 2006-12-18 17:57

    谢谢natived朋友的评论,你的评论让我更深入地思考了上面逻辑的正确性

 

ash_riple_768180695 2006-12-18 17:55

    物之不齐,物之性也。再优化的逻辑也不能保证两个信号同时到达。在发送端和传输路径上实现不了的目标,只能在接收端弥补。

    弥补的方法不只一种,各有利弊。要实事求是才行。

相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
ash_riple_768180695 2011-06-26 23:20
Hardware-Assisted IEEE1588 Implementation Analysis
06/18/11 11:00:05 PM         最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步...
EE直播间
更多
我要评论
11
7
关闭 站长推荐上一条 /3 下一条