EETOP 创芯网论坛

便捷登录,只需一步

找回密码

  登录   注册  

搜帖子
第三代半导体技术资料|下载奖励300信元
楼主: IC.Michael

[求助] 关于跨时钟域单bit信号的同步问题

[复制链接]
发表于 2019-4-17 19:46:08 | 显示全部楼层


   
IC.Michael 发表于 2019-4-13 08:51
如果是这样的话,有点明白了,信号展宽后,就算刚开始信号跳变的时候存在亚稳态,但是在之后的clk沿一定 ...


优秀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-25 18:51:59 | 显示全部楼层
1. 亚稳态(Metastability):在数字电路中,信号处于没有定义的电压值的状态,此状态是介于稳态1和稳态0之间的极不稳定的状态,理论上只有在零噪声条件下才可长期存在;触发器亚稳态是指FF无法在某个规定时间段内达到一个可确认的状态,当一个触发器进入亚稳态,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上,通常也称为同步失效;数字系统中,亚稳态在信号无法满足Setup和Hold时序的情况下出现,其可以通过信号通道传播;在亚稳态驱向稳态的过程中,触发器可能输出中间电平,可能输出稳定电平,也可能在不同电平之间振荡,数字系统要避免这些不稳定状态给功能带来不可预知的影响;有两个概念:亚稳态窗、平均无故障时间。
2. 只要是组合逻辑电路,就容易产生毛刺,同步设计和异步设计的差别,就是同步设计能在约束的帮助下采用到正确的信号,而异步设计得不到这样的帮助,毛刺会被采样和传播,防止毛刺出现和传播,避免毛刺对功能电路产生影响,是异步电路处理一个重要关注点。
3. 无论是板级芯片间的信号还是芯片内的信号,由于IO和BUFFER的上下沿特性不同,信号有可能会变窄,也可能变宽;STA对异步之间的时钟不做直接的Setup/Hold的检查,不做约束的多bit信号之间的也会有延迟差异等;125M时钟采样200M时钟域扩展1拍的数据可能出错,156.25M时钟采样125M时钟域信号也有可能出错。
4. 注意再收敛问题!异步复位,同步撤离!当相同时钟域的两个模块,但是具有不同的复位域的情况下,可以随意动态复位其中的模块吗? 答案显然是否定的。
5. 单bit控制信号打2拍或3拍,单bit脉冲信号应经过扩展并在目标时钟域同步、取沿操作;多bit格雷码也可直接进行打拍处理,在Launch时钟域必须寄存器输出,同时,需要STA约束格雷码(各比特信号)到Capture时钟域的各寄存器的maxdelay在一定范围之内,建议值为0.5个Tmin(Capture或Launch周期中的最小值),保证多比特信号之间的走线延迟的偏差尽量小。
6. 多bit DMUX同步器,通过号同步后取沿作为en信号锁存数据,期间数据应保持不变。
7. 握手协议、异步FIFO实现同步。
8. 在两时钟域的同步器之间不能有组合逻辑出现,因为各触发器路径延迟不一致,各信号高低电平传输时间不一致,组合逻辑存在竞争冒险,可能会有毛刺,增加了不稳定区间。
9. 多个单bit信号组合作为同步信号时,必须在Launch时钟域完成组合和寄存处理,不能分别同步到Capture时钟域后再组合处理。



回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-28 22:20:20 | 显示全部楼层
本帖最后由 IC.Michael 于 2019-4-28 22:21 编辑

debounce去抖滤波电路,主要用在芯片的PAD输入信号,或者模拟电路输出给数字电路的信号上。
引用【杰克淡定】大神的一段代码:

   

        

                
  1. parameter BIT_NUM  = 4 ;
  2. reg [BIT_NUM-1 : 0] signal_deb ;
  3. always @ (posedge clk or negedge rst_n)
  4. begin
  5.     if (rst_n == 1'b0)
  6.         signal_deb <= {BIT_NUM{1'b0}} ;
  7.     else
  8.         signal_deb <= # DLY {signal_deb[BIT_NUM-2:0],signal_i} ;
  9. end

  10. always @ (posedge clk or negedge rst_n)
  11. begin
  12.     if (rst_n == 1'b0)
  13.         signal_o <= 1'b1 ;
  14.     else if (signal_deb[3:1]==3'b111)
  15.         signal_o <= # DLY 1'b1 ;
  16.     else if (signal_deb[3:1]==3'b000)
  17.         signal_o <= # DLY 1'b0 ;
  18.     else ;
  19. end
            

   

    复制代码
在此提供另一个思路(假设单比特 多比特请用generate实现):


   

        

                
  1. parameter CNT_NUM = 6 ;
  2. parameter GLITCH_WIDTH = 8;
  3. reg [CNT_NUM - 1 : 0] cnt ;
  4. //reg [CNT_NUM - 1 : 0] cnt [0 : BIT_NUM -1] ;
  5. always @ (posedge clk or negedge rst_n)
  6. begin
  7.     if (rst_n == 1'b0) begin
  8.         cnt <= #DLY {CNT_NUM{1'b0}} ;
  9.     end
  10.     else begin
  11.         if ((signal_o == signal_i_2d) || (cnt >= GLITCH_WIDTH)) begin
  12.             cnt <= #DLY {CNT_NUM{1'b0}} ;
  13.         end
  14.         else begin
  15.             if (signal_o != signal_i_2d) begin
  16.                 cnt <= #DLY cnt + 'd1 ;
  17.             end
  18.         end
  19.     end
  20. end

  21. always @ (posedge clk or negedge rst_n)
  22. begin
  23.     if (rst_n == 1'b0) begin
  24.         signal_o <= # DLY 1'b0 ;
  25.     end
  26.     else begin
  27.         if (cnt >= GLITCH_WIDTH ) begin
  28.             signal_o <= # DLY signal_in_2d ;
  29.         end
  30.     end
  31. end
            

   

    复制代码



回复 支持 反对

使用道具 举报

发表于 2019-4-29 15:01:27 | 显示全部楼层


   
IC.Michael 发表于 2019-4-28 22:20
debounce去抖滤波电路,主要用在芯片的PAD输入信号,或者模拟电路输出给数字电路的信号上。
引用【杰克淡定 ...


多bit为啥不用fifo
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-29 15:48:35 | 显示全部楼层


   
chindis 发表于 2019-4-29 15:01
多bit为啥不用fifo


是啊,用fifo更合适,我觉得这里应该指的不是强相关的信号,比如一组bus信号,这样子滤毛刺确实不太好。如果说有一些en, rst, pulse, etc.信号,那么可以打个捆统一送到该模块去滤毛刺,完了再送出去。目标时钟域是同一个,信号之间没有强相关,该模块内部generate分别滤毛刺。不过一般都是BIT_NUM给的1。
回复 支持 反对

使用道具 举报

发表于 2019-4-29 17:13:56 | 显示全部楼层


   
IC.Michael 发表于 2019-4-29 15:48
是啊,用fifo更合适,我觉得这里应该指的不是强相关的信号,比如一组bus信号,这样子滤毛刺确实不太好。 ...


我们使能、帧头全送到fifo里边,然后同步处理,比打拍子方便啊,打拍子还得算算时钟够不够而且只能高时钟到低时钟,麻烦
回复 支持 反对

使用道具 举报

发表于 2019-4-29 17:15:12 | 显示全部楼层
多bit能够用格雷码时,还要注意加上时序约束max_delay和min_delay
回复 支持 反对

使用道具 举报

发表于 2019-4-29 17:36:34 | 显示全部楼层
学习,学习
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-29 20:36:59 | 显示全部楼层


   
chindis 发表于 2019-4-29 17:13
我们使能、帧头全送到fifo里边,然后同步处理,比打拍子方便啊,打拍子还得算算时钟够不够而且只能高时钟 ...


我们这边一般上电时候的复位会过下这个滤毛刺的模块。但是一般只用1bit,不明白为啥std cell设置了参数化。哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-29 20:39:45 | 显示全部楼层


   
dkylx 发表于 2019-4-29 17:15
多bit能够用格雷码时,还要注意加上时序约束max_delay和min_delay


能用格雷码的话,是比较相关的数据吧,比如状态机?max/min_delay是约束没有时序的路径的吧?比如跨时钟域的时候,还需要加上这个约束吗,请教下哈。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关闭

小黑屋| 关于我们| 联系我们| 在线咨询 |  EETOP 创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2020-6-7 08:32 , Processed in 0.064830 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表