当前位置:   article > 正文

【基础知识】~ 亚稳态、跨时钟域处理_半握手与全握手跨时钟

半握手与全握手跨时钟

1. 亚稳态

1.1 定义

亚稳态,是因违反寄存器的建立时间和保持时间而产生的。逻辑电路中绝大多数的时序问题基本都是因为这个原因产生的。由于寄存器在任何信号通路中都有特定的建立时间和保持时间,这要求输入信号要保持稳定。但如果信号在这段时期发生了变化,那么输出将是未知的。这个未知的状态便称为亚稳态。

1.2 危害

只要系统中存在异步元件,那么亚稳态就是无法完全避免的。产生亚稳态后,寄存器输出在稳定之前可能是毛刺、振荡、固定的一个电压值。其他与之相连的数字元件收到它的亚稳态,也会发生逻辑混乱,最糟糕的情况就是系统直接崩掉。

1.3 常见情况

输入信号是异步信号 时钟偏移/摆动(上升/下降时间)高于容限值。(时钟信号质量不好)
信号在两个不同频率或者相同频率但相位和偏移不同的时钟域下跨时钟域工作。 组合延迟使寄存器的数据输入在亚稳态窗口内发生变化。

1.4 解决方法

在实际的 FPGA 设计中,人们不会想着怎么降低发生亚稳态的概率,而是想着怎么减小亚稳态的影响。常见的方法有以下几种:

  1. 降低系统时钟频率
  2. 用反应更快的 FIFO
  3. 引入同步机制,防止亚稳态传播(可以采用前面说的加两级触发器)。异步信号同步化(两级触发器);采用 FIFO 对跨时钟域数据通信进行缓冲; 对复位电路采用异步复位、同步释放处理
  4. 改善时钟质量,用边沿变化快速的时钟信号

2. 跨时钟域处理

2.1 为什么需要跨时钟域处理

根据前面所说,我们需要减少亚稳态的风险,那么如何减少呢?对于单一时钟域内的信号,我们可以采用EDA工具来检查每个触发器的建立保持时间,确保其不出现亚稳态,但是跨时钟域的信号,却没有工具保证其可靠性,如果使用静态时序分析,应该要设置 false path 约束,所以只能依靠跨时钟域处理的同步化技术。

2.2 处理方式

2.2.1 单 bit 信号

2.2.1.1 电平检测

最为简单的方法。通过寄存器打两拍进行同步,也就是所谓的电平同步器。
存在问题为,输入信号必须保持两个接收时钟周期,每次同步完,输入信号要恢复到无效状态。所以,如果是从快到慢,信号很有可能被滤除。适用于慢时钟域向快时钟域。

2.2.1.1.1 两级触发器可防止亚稳态传播的原理

假设第一级触发器的输入不满足其建立保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。
更确切地说,输入脉冲宽度必须大于同步时钟周期与第一级触发器所需的保持时间之和。最保险的脉冲宽度是两倍同步时钟周期。 所以,这样的同步电路对于从较慢的时钟域来的异步信号进入较快的时钟域比较有效,对于进入一个较慢的时钟域,则没有作用 。

2.2.1.1.2 为什么是打两拍呢,打一拍、打三拍行不行呢?

两级并不能完全消除亚稳态危害,但是提高了可靠性减少其发生概率。总的来讲,就是一级概率很大,三级改善不大。如果再加上第三级寄存器,由于第二级寄存器对于亚稳态的处理已经起到了很大的改善作用,第三级寄存器在很大程度上可以说只是对于第二级寄存器的延拍,所以意义是不大的。

2.2.1.2 边沿检测

在电平同步器的基础上,通过输出端的逻辑组合,可以完成对于信号边沿的提取,识别上升沿,下降沿以及双边沿,并发出相应的脉冲。比起电平同步器,更适合要求脉冲输出的电路。但同样,输入信号必须保持两个接收时钟周期。适用于慢时钟域向快时钟域

2.2.1.3 脉冲同步

先将原时钟域下的脉冲信号,转化为电平信号(使用异或门),再进行同步,同步完成之后再把新时钟域下的电平信号转化为脉冲信号(边沿检测器的功能)。这就从快时钟域取出一个单时钟宽度脉冲,在慢时钟域建立新的单时钟宽度脉冲。结合了之前所提到的两种同步器。但存在一个问题,输入脉冲的时间间距必须在两个接收时钟周期以上,否则新的脉冲会变宽,这就不再是单时钟脉冲了。适用于快时钟域向慢时钟域

2.2.1.4 代码实现

可以参考这篇文章,写的挺全的。

2.2.1.5 关于“打拍子”的解释

还有一个点就是,对于打拍的问题,我也是刚刚开始学习这方面的知识,对这个“打拍子”一知半解,参考了很多大佬的文章,我自己记录一下:
打拍其实就是通过寄存器,把数据锁起来,这也就是为什么可以很好的解决跨时钟域的问题了。知识真的是很多很杂,学无止境呀!

2.2.2 多 bit 信号

对于多 bit 的异步信号,可以采用如下方法:
1:可以采用保持寄存器加握手信号的方法(多数据,控制,地址);
2:特殊的具体应用电路结构,根据应用的不同而不同;
3:异步 FIFO。(最常用的缓存单元是 DPRAM)

2.2.2.1 采用保持寄存器加握手信号的方法(多数据,控制,地址)

握手指的是两个设备之间通信的一种方式,用来通信的信号就是握手信号。最简单的握手信号是 validready,也可以叫 request 和 grant。假设设备 1 向设备 2 发送数据,设备 1不知道设备 2 什么时候可以接收数据,设备 2 也不知道设备 1 什么时候会发送数据,那么它们之间如果用握手通信可能是这样的顺序:

  1. 设备 1 将 valid 信号置 1,告诉设备 2,数据准备就绪了,请查收
  2. 设备 2 此刻正处于忙碌状态无法接收数据,设备 2 将ready 信号保持为 0
  3. 设备 2 空闲了,将 ready 信号置 1 接收设备 1 的数据
  4. 设备 1 看到设备 2 的 ready 为1,它知道设备 2 已经接收好数据了,将 valid 置 0 同时撤销数据,准备下一次发送。

可以看到因为有握手控制,可以确保数据的正确传输,不会丢失。跨时钟域的握手设计就是利用握手控制这种优势,从而避免因为跨时钟域引起的数据传输错误。

2.2.2.2 异步 FIFO

移步这篇文章

声明

本人所有系列的文章,仅供学习,不可商用,如有侵权,请告知,立删!!!

本人主要是记录学习过程,以供自己回头复习,再就是提供给后人参考,不喜勿喷!!!

如果觉得对你有用的话,记得收藏+评论!!!

这篇文章就先写这么多吧,学习路上随时补充,加油!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/206835
推荐阅读
相关标签
  

闽ICP备14008679号