上次学习了时序分析和时序约束的内容,其中就提到了在处理异步跨时钟域的情况下,可以使用异步fifo来交互数据。那异步和同步的情况又有什么不同呢?
一.基础知识
1.同步时钟与异步时钟
- 同步时钟:当两个时钟之间的相位关系是固定的,则可以称这两个时钟位同步时钟。一般同源,且整数倍分频,如同一个MMCM/PLL产生的两个时钟可以称为同步时钟
- 异步时钟:无法判断两个时钟间相位时,则可以称这两个时钟位异步时钟。来自两个不同晶振的时钟,一定是异步时钟。或者同源,非整数倍分频。(另外,无时钟即组合逻辑和有时钟之间也是异步时钟)。
2.同步电路和异步电路
- 同步电路:电路中所有受时钟控制的单元,全部由一个统一的全局时钟控制。在确定布局布线的情况下,EDA工具可以通过静态时序分析对电路遍历计算时序裕量,并对电路通过插入延时等方式进行迭代优化,并给出时序报告,报告时序违例情况与路径来指导设计人员优化。
- 异步电路:电路中没有一个全局的控制时钟,寄存器间信号传递存在异步时域交叉,异步设计结构的时序通常很难或者不可能用时序分配和约束来建模。静态时序分析无法处理异步的情况,一般需要额外的异步处理手段来保证数据的正确传输。
3.亚稳态
概念:指触发器无法在某个规定时间内达到一个确定的状态,当一个触发器起进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时才能稳定输出在某个正确电平上。在这个期间,触发器输出一些中间级电平,或者处于震荡状态,并且这种这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
通常发生在目的寄存器的数据变化时刻与时钟采样边沿非常接近的时刻,既不满足寄存器的建立或保持时间的时刻。
4.寄存器结构
寄存器的结构在时序分析和约束中写过,这里就用简图大致讲一下。
D触发器主要分为两个部分:主锁存器和从锁存器
可以看出,当CLK为0,输入D进入主锁存器,停留在了的位置,当CLK=1时,
由从锁存器送到Q端口。
不满足建立时间要求:D到Q的捕获,首先要满足建立时间的要求,应该要处于一个稳定状态。如果不满足建立时间要求,正反馈双稳态时间不足够使得
电平达到稳定状态,出现亚稳态。大致意思就是D在主锁存器中必须要自行循环一段稳定时间。
不满足保持时间要求:D的数据必须维持到CLK把T1完全关闭之后,否则会写入错误的值,即最少维持CLK到T1的传播时间(同时需要考虑CLK传播时间,如果D和CLK的传播时间相等,则一般为0)
5.故障平均时间
Altern在文章中引入了MTBF(mean time between failures)即故障平均时间,这个参数衡量亚稳态发生的可能性,MTBF的值越大,意味着发生两次问题之间的时间越长,也就表示系统的鲁棒性越好。
:寄存器从时钟上升沿触发后的时序余量时间
:数据的变化频率
:接收时钟域的时钟频率
C1,C2:与器件有关的参数
= T -
-
-
-
分析上述公式,用户只能减少,即减少两个寄存器间的逻辑延时以及走线延时。
二.异步处理
问题:
- 为什么要进行异步处理?
- 同步电路是如何处理的?
1.单bit信号的异步处理(电平信号)
电平信号:指长时间稳定在高电平或低电平的一种信号,这种信号做跨时钟域处理时候,不关心信号边沿是否正确,只需要避免将亚稳态传递至后续电路。
至于为什么双触发器可以用作同步器呢?下面就来解释这个问题:
我们将触发器链的第一个触发器称为FF1第二个称为FF2…..第N个称为FFn。
异步信号Din进入本地时钟域的FF1的D端,由于是异步信号,存在亚稳态的风险(产生亚稳态是由一定概率的),输出是非高非低的一个中间态。此时亚稳态传递到后面的电路,但是亚稳态信号不能够长期保持,亚稳态信号最终自己会变成稳态信号。这时有FF2,在下一个时钟上升沿采集FF1的输出,相当与给出一个时钟周期让亚稳态信号恢复成稳态信号的恢复时间。FF2采集到恢复成为稳态的信号输出。
但靠二级触发器也能不能完全避免亚稳态的发生,以上提到亚稳态信号总会由亚稳态自己变成稳态,但是这个时间不是完全确定的。所以只能说双触发器搭建的同步电路只能一定程度上避免亚稳态的发生(不过经过概率计算,双触发器号称将亚稳态发生的概率减少到了几年发生一次)。不过根据以上分析可以很明显发现触发器链越长发生亚稳态的概率越低,二级触发器之间完全不能有组合逻辑且二级触发器的物理路径越近越好。
根据前面说的双稳态电路的特性,每经过一次触发器,亚稳态被传递到下一级的概率都会大幅降低。因此,可以在采样时钟下对信号进行打牌,降低把亚稳态输出到后级的概率。
思路:两级同步触发器,在某些高速场景下,采用三级同步触发器。
具体做法:将采样信号在目的时钟域下打两拍。
2.单bit信号的异步处理(脉冲信号)
脉冲信号:脉冲信号指的是在源时钟下只保持一个时钟周期的信号,为保持其信号特性,跨时钟后该信号需要再目的时钟域下也只保持一个时钟周期,需要考虑原时钟和目的时钟的频率关系,并在设计中采取不同的方式。
情景1:Slow to Fast
直接采样可能导致目的时钟对脉冲的重复采样,表现为脉冲信号被拉高多个周期
思路:向使用两级同步触发器保证数据稳定,再对稳定后的信号做边沿采样获取脉冲
具体做法:将采样信号在目的时钟域打两拍稳定数据,再根据额外打一拍做边沿采样,产生脉冲。
情景2:Fast to Slow
直接采样可能导致脉冲漏采,即脉冲信号未被采样到。
思路:在源时钟下对脉冲展宽或转为电平信号,在目的时钟下对展宽信号或电平信号进行边沿采样。
具体做法:将脉冲信号转化为电平信号;在源时钟域下根据脉冲信号生成电平信号,检测脉冲信号,将电平信号翻转一次。电平信号CDC方式同步至目的时钟域,在目的时钟域下边做边沿检测,从而恢复出脉冲信号。
3.多bit信号的异步处理
1.DMUX同步器以及握手机制
对于数值非连续变化,保持多拍的多bit信号,可以使用DMUX同步器方式来保证数据有效传输。源端为数据分配单比特信号tx_sel;对该信号进行异步处理同步至目的时钟域,目的端接收到有效的单比特,此时数据已经稳定,可以采样到有效数据。
也可以使用握手机制来保证数据有效传输。源端为数据分配单比特信号req,对该信号进行异步处理同步至目的时钟域,目的端接收到有效的该请求信号,此时数据已经稳定,可采样到有效数据;同时目的端向源端发起响应ack,该信号进行异步处理同步至源时钟域,源端接收后拉低req信号。当源端有新数据达到时,重复过程即可。
2.格雷码
格雷码的特点:相邻状态单比特改变
3.异步fifo
使用RAM和fifo的时候,只要按照规定的方式读写数据,数据的稳定性和正确性均可以得到保证。但在使用异步fifo的时候需要注意,由于读写侧逻辑异步交互,表明fifo状态的empty,full,almost_empty,almost——full不是完全准确的。
三.复位
1.功能:
- 仿真的时候让电路进入初始状态或其他预知状态
- 对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态
2.分类
- 根据驱动域可以分为全局复位和局部复位
- 根据与时钟关系可以分为同步复位和异步复位
3.xilinx复位准则
- 尽量少使用复位(xilinx的FPGA在上电时会对寄存器配置初始值)
- 必须复位时采用同步复位以及确保使用高电平有效的复位
- 避免使用异步复位
- 避免全局复位,使用局部复位(扇出过大导致布线skew的增加,容易造成recovery违例)
4.同步复位
5.异步复位
6.异步复位,同步释放
可有效解决异步复位中可能存在的亚稳态问题,设计中推荐使用异步复位同步释放操作。需要注意的是,同步释放动作需要根据系统中存在的时钟域,对各个的时钟域下做相应的异步复位同步释放操作。