【总结篇】深入理解亚稳态及跨时钟域处理方法

一、深入理解建立保持时间为什么时序中赋值会延迟一拍

建立时间和保持时间:

1,所谓的建立时间或者保持时间都是在描述一种时钟变化的边沿上的数据状态。

2,建立时间:在时钟的有效沿(以上升沿为例)到来之前,数据的输入端信号必须保持稳定的最短时间。

3,保持时间:在时钟的有效沿(以上升沿为例)到来之后,数据的输入端信号必须保持稳定的最短时间。

亚稳态:

如果数据不满足触发器的建立时间和保持时间,或者在复位过程中时序不满足,从而使得触发器的Q输出端口存在一定时间的状态不稳定。所谓亚稳态就是触发器无法在规定的时间内达到一个可以确定的状态。

当reg1拉高时,reg2拉高。从波形来看为什么会相差一个时钟周期?

个人经验:

在同源时钟下:

①时钟驱动寄存器是在保持时间之后改变信号

②时钟判断、检测寄存器的数值都是在进入建立时间时

那如果不同源呢?

为什么打两拍降低亚稳态?

建立时间和保持时间应该是由于d触发器的主从锁存结构导致,所以要求时钟沿前后保持数据稳定。(个人见解)

这么说针对主从锁存器结构的D触发器是没有问题的,不过D触发器还有可能是边沿触发结构或者其他的结构

二、亚稳态与跨时钟域处理

亚稳态出现的原因

 数据传输中不满足触发器的Tsu(建立时间)和Thd(保持时间),或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态。

不满足建立时间和保持时间

复位信号释放实际不满足

打两拍

由于振荡时间Tmet是受到很多因素影响的,所以Tmet时间又长有短,所以当Tmet时间长到大于一个采集周期后,那第二级寄存器就会采集到亚稳态。由上面两个图可知,我们一般采用三级同步寄存器来增加系统的鲁棒性。

亚稳态的处理方法:

        降低系统的时钟频率。(不好,主频速度优先指标)

        引入CDC跨时钟域处理。

        使用反应更快的寄存器。(建立时间和保持时间更短)(成本比较高)

        CDC跨时钟域处理:Clock Domain Crossing

单比特信号的跨时钟域处理

①慢时钟域的信号传输到快时钟域:保证快时钟可以包括好几个慢时钟,这样慢时钟域信号在快时钟域下打两拍之后可以确保识别到单比特的脉冲信号!

通常认为这是一个双触发同步器电路。同时要注意,慢时钟域下的宽度至少是快时钟周期的1.5倍;也就是说要有明显周期差。

脉冲宽度会改变,但是不影响同步结果

还有一种是边沿检测同步器(慢时钟域到快时钟域)这种属于跨时钟域前信号非脉冲信号,但是跨时钟域后信号是脉冲信号。

我认为是在跨时钟域之后检测上升沿、下降沿、双边沿,并发出相应的脉冲,其本质还是跨时钟域前的处理

快时钟域的信号传输到慢时钟域:①用或运算对信号进行展宽+同步(打两拍,或运算)。

如果快时钟域为10ns,慢时钟域为100ns。那么需要打十拍才能被慢时钟域捕获到??是不是很麻烦这里有个更加简单的技巧!

使用移位操作,方便的延迟操作。

使用按位或符号,更加简洁。

w_pluse = | r_pluse;//其实就是相当于r_pluse[0] | r_pluse[1] | r_pluse[2];

组合逻辑会产生竞争冒险导致毛刺。考虑到这个

②双脉冲电平检测+双触发器同步+边沿检测。这里有地方也叫脉冲同步器

如果在快时钟域下有两个输入脉冲,检测到高电平触发信号发生翻转。下图所示toggle会有较长的电平时间,可以将其同步到慢时钟域下,延迟两拍。将两拍信号进行异或,就可以得到跨时钟域之后的信号了。(真的很强👍真的妙!)

脉冲同步器对于脉冲的间隔有比较严格的要求:输入脉冲之间的最小间隔必须等于两个同步器时钟周期

🤡这里也要考虑一下,如果两个输入脉冲之间间隔较短,触发信号与慢时钟域相差不多,也有可能在慢时钟下检测不到电平,导致同步失败。下面给出方法③

不过从仿真来看有个问题,为什么脉冲信号和触发信号在同一时刻拉高呢?仿真里输入用的=,那么在初始化initial里面如果用的是

更改仿真下图看起来就好多了。

③脉冲同步器+握手协议

由于基于双触发器的脉冲同步器(方法②)在快时钟域到慢时钟域进行同步时,可能存在采样失效或亚稳态的问题,因此为了能够安全的进行跨时钟域的同步处理,引入了握手机制。基于握手机制的脉冲同步器又叫做“结绳法”,该方法适用于任何时钟域的过渡。

所谓握手,意即通信双方使用了专用控制信号进行状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。

时钟域1通过寄存器产生req请求信号,req请求信号在时钟域2打两拍产生ack应答信号,应答信号再反馈回时钟域1打两拍完成握手。

其实,这里我不太理解为啥说是握手,我的理解是两者(应答请求都为1时触发相应动作)

请仔细看代码中的请求信号(r_wide_pluse_f)如何产生的!!!

单bit跨时钟域总结:

参考连接:【FPGA】跨时钟域问题(二)(单bit信号跨时钟域 1. 电平同步器 2. 边沿同步器 3. 脉冲检测器)_fpga 脉冲同步-CSDN博客

加油站| 单比特信号跨时钟域问题详解(大疆FPGA逻辑岗A卷) (qq.com)

求职攻略|如何用握手信号法处理单比特跨时钟域问题(大华FPGA岗解析) (qq.com)

多比特信号的跨时钟域处理

多bit的跨时钟域处理能不能直接打两拍?

由于多bit数据输入,有clk驱动多个寄存器,寄存器之间的路径不一致导致数据在采样过程中会发生变化,造成原始数据的错误。

比如,现在数据为100-010-101-000,那么在传输的过程中由于布局布线延迟的不确定性就会导致数据实际为100-011-……

(1)格雷码+同步(同步器)

格雷码是一种循环码,相邻的数字之间只有一个bit的不同

000-001-010-011-100-101-110-111

000-001-011-010-110-111-101-100

🎯这里要注意:①仅仅使用在地址或者数值一次增加(减少)的情况下可以使用格雷码+同步的方法。如果没有规律呢?

②慢时钟域到快时钟域才可以使用

代码其实很简单,唯一的点是格雷码的代码编写:assign w_data_grey = wdata ^ (wdata>>1)

如果多bit信号没有规律,可以转化为独热码,再打两拍到目标时钟域,再解码,适合于从慢到快

Multi-cycle path (MCP)多周期路径同步

(2)DMUX处理跨时钟域方法

通过一个使能信号来判断data信号是否已经稳定,当使能信号有效的时候说明data处于稳定状态,在这种情况下终点寄存器才对信号进行采样,可以保证没有setup/hold违例,相当于把多比特信号的CDC问题转换成了单比特信号的CDC问题。

无需考虑上述增加问题,并且可以支持处理跳变的多bit数据。但其缺点,相对于原来快时钟的信号来说,在同一个时刻内数据输出较多,在慢时钟域下输出数据量变少,需要足够的时间才能输出数据量一致。通常是有FIFO缓存。也就是说源时钟域下的数据需要在目的时钟域下必须保持好几个周期(三个四个)。可以看出传输效率比较低,没有异步FIFO带宽慢,速度快。但资源开销很少。

这就是多周期同步?在多个周期上同步数据?

无所谓快慢时钟域?

总结DMUX跨时钟域方法:

①不需要考虑地址线递增递减问题,并且支持处理跳变的多bit数据;

②数据和使能信号在源时钟域为同步到来的数据,DMUX原则是数据不同步只对使能信号同步;

③源时钟域下的数据需要在目的时钟域下保持好几个时钟周期,在目的时钟域对数据完成采样前数信号需要保持不变。

④使用DMUX处理慢时钟域到快时钟域时,采用单bit跨时钟域方法处理使能信号即两级同步器电路;那快时钟域到慢时钟域呢?只需要电路中的两级同步器换成单比特快到慢时钟域处理单元就行。

❓仔细想一下,既然要求在目的时钟域下保持好几个时钟周期,那么貌似就不会分所谓的快慢时钟域????好像还是上面的对!

存在的缺陷:同步时的占用带宽过多造成速度较慢,虽然没有异步FIFO速度快,但是其优势在于资源开销很小。

使能信号接MUX的sel端口,若使能信号有效,则发送端数据选通,传输到接收端;若使能信号无效,则MUX的另一输入端选通,另一输入端与MUX的输出端(数据接收端)相连,相当于接收端数据保持不变;注意! ! ! MUX的输出端无法直接与输入端相连,需要先将输出数据保存在DFF中,再和输入端相连。

慢时钟域跨到快时钟域,数据打两拍。识别到使能信号跨过去之后将数据在目的时钟域下复制。

代码里面给的是快到慢

//mux选择,不建议这种写法 always@(posedge clk_b or negedge brstn)begin if(~brstn)begin dataout <= 0 ; end else begin dataout <= data_en_b1 ? data_temp : dataout ; //其他时候保持 end end

(3)握手同步

其实本质上还是对握手信号进行跨时钟域处理。

使用握手信号实现跨时钟域数据传输_牛客题霸_牛客网 (nowcoder.com)

牛客题目:分别编写一个数据发送模块和一个数据接收模块,模块的时钟信号分别为clk_a,clk_b。两个时钟的频率相同。数据发送模块循环发送0-7,在每个数据传输完成之后,间隔5个时钟,发送下一个数据。请在两个块之间添加必要的握手信号,保证数据传输不丢失。

模块的接口信号图如下:

解析:req拉高,表达请求准备接收数据——————>跨时钟域到达,识别到req为高,将ack应答信号拉高,表示可以传输

ack为高,说明已经准备好,将req拉低

req拉低——————>识别到为低,ack拉低

ack低

等待5个周期,传输数据,之后在进行上述操作……

不明白为啥不用管快慢时钟域,都只进行打两拍处理呢?

(4)异步FIFO

可以看的参考连接:CDC个人总结_cdcfcl--CSDN博客

其他

  • 采样中“快到慢”与“慢到快”在考虑问题时有什么区别?
    • 慢到快:只需要考虑亚稳态问题.
    • 快到慢:除亚稳态问题外,还需考虑慢时钟的采样速率问题。因为根据采样定理,采样频率低于信号最高频率2倍的时候,是无法完整采样的。
  • CDC传输方法总结:

单比特:

慢到快只考虑亚稳态问题,采用延迟打拍法;

快到慢还需要考虑慢时钟采样速度,但是只要延长信号长度即可。常用方法为电平同步器、脉冲同步器、握手协议。其中,握手协议限制较为灵活,但握手信号需要在两个时钟域来回传递导致延时很大,所以握手协议是以牺牲效率为代价保证信号传递质量。

多比特:

慢到快:只考虑亚稳态问题,采用延迟打拍法。为需要传输的数据配上一个同步的控制使能信号,数据和控制信号被同时发送到接收时钟域,使用此同步后的控制信号来加载数据(控制信号有效表示数据稳定不变化从而避免传输出错),这样数据就可以在目的寄存器被安全加载。这种方法我们称为MUX同步器法/多周期路径同步法(意思都差不多)。

快到慢:因为考虑时钟采样速度,所以需要延长(使能信号)信号长度。最常用的还是“握手协议”,将使能信号同步后再加载多比特数据。

处理多比特数据跨时钟传输,最常用还是异步FIFO

一来异步FIFO同时适用快到慢和慢到快两种CDC传输;

二来也能更好地满足数据流具有较快的传输速度要求。

CDC的几个重要问题(重要!!!)

  1. 多比特为能不能使用二级同步器传输?使用格雷码也不行吗?什么情况下可以使用同步器加格雷码跨时钟传输?
  2. 慢到快使用打两拍的前提是什么?
  3. 仅仅通过简单的同步器同步有可能是不安全的,那么如何传递两个同时需要的信号(b_load和b_en)?

答案连接:跨时钟域传输总结(包含verilog代码|Testbench|仿真结果)-腾讯云开发者社区-腾讯云 (tencent.com)

参考:其中一部分来自于数字逻辑君 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值