我是靠谱客的博主 孝顺台灯,最近开发中收集的这篇文章主要介绍亚稳态学习小结亚稳态学习小结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

亚稳态学习小结

一、亚稳态是什么

要知道亚稳态的定义,首先要知道时钟上升沿采样中的建立时间(setup time)和保持时间(hold time)。

1.1 建立时间(Tsu)、保持时间(Th)

img

建立时间:在触发器时钟上升沿到来之前,数据需要保持稳定不变的时间。如果建立时间不够,数据就不能在此上升沿被稳定打入触发器。

保持时间:在触发器时钟上升沿到来后,数据需要保持稳定不变的时间。如果保持时间不够,数据同样不能被稳定打入触发器。

1.2 亚稳态

在数据打入触发器时,若不满足建立时间或保持时间,触发器就会进入亚稳态。一个触发器一旦进入亚稳态状态,则无法预测触发器的输出电平,也无法预测什么时候可以稳定在某个确定的电平上,此时触发器的输出端Q在较长时间内处于振荡状态,不等于输入端D。稳定之前的这段时间称作决断时间(resolution time)。经过resolution time之后,输出端Q将会稳定在某个电平上,但是这个稳定之后的电平与输入端D是没有关系的。

亚稳态是触发器的一个固有特性,正常采样也会有一个亚稳态时间。当建立时间和保持时间满足时,触发器会经历采样,亚稳态后,进入一个正确的状态。

亚稳态是复杂时序电路中无法避免的现象,设计电路时首先要减少亚稳态发生的概率,其次要使系统对产生的错误不敏感。
前者靠同步来实现,后者需要根据不同的设计应用采取不同的处理办法。

二、常见的亚稳态产生及解决方法

在同步系统中,输入总是与时钟同步,因此寄存器的建立时间和保持时间是满足的,一般情况下是不会发生亚稳态情况的。(在同步逻辑中只要静态时序分析(STA)保证了每个触发器都能满足自己的建立时间以及保持时间,正常是不会遇到亚稳态问题的。)

只要系统中存在异步元件,则亚稳态是没有办法避免的,亚稳态通常发生在异步信号检测、跨时钟传输和复位电路当中。

2.1 跨时钟传输

产生原因

跨时钟传输时,由于两个时钟互不相关,因此很有可能在采集数据时不满足建立时间要求,产生亚稳态。

解决方法

使用本地时钟将异步输入信号打入本地触发器链中(一般使用二个触发器足够)。如上图所示:Din进入Clock2时钟域的第一个触发器后再进入后一级触发器,后一级触发器输出进入组合逻辑中。(将输入信号延迟两个本地时钟周期)

Verilog代码:

module sync(
    input async_in, bclk, rst,
    output sync_out
    );

reg bdat1, bdat2;

always @(posedge bclk or posedge rst) begin
    if (rst) begin
        bdat1 <= 1'b0;
        bdat2 <= 1'b0;
    end
    else begin
        bdat1 <= async_in;
        bdat2 <= bdat1;
    end
end

assign sync_out = bdat2;

endmodule

原理: 我们将触发器链的第一个触发器称为FF1第二个称为FF2……第N个称为FFn。
异步信号Din进入本地时钟域的FF1的D端,由于是异步信号,存在亚稳态的风险(产生亚稳态是由一定概率的),输出是非高非低的一个中间态。此时亚稳态传递到后面的电路,但是亚稳态信号不能够长期保持,亚稳态信号最终自己会变成稳态信号。这时有FF2,在下一个时钟上升沿采集FF1的输出,相当与给出一个时钟周期让亚稳态信号恢复成稳态信号的恢复时间。FF2采集到恢复成为稳态的信号输出。
但靠二级触发器也能不能完全避免亚稳态的发生,以上提到亚稳态信号总会由亚稳态自己变成稳态,但是这个时间不是完全确定的。所以只能说双触发器搭建的同步电路只能一定程度上避免亚稳态的发生(不过经过概率计算,双触发器号称将亚稳态发生的概率减少到了几年发生一次)。不过根据以上分析可以很明显发现触发器链越长发生亚稳态的概率越低,二级触发器之间完全不能有组合逻辑且二级触发器的物理路径越近越好。
一般系统使用二级触发器做同步化处理已经是足够。但注意双触发器作为同步器只能用在单比特数据的传递中。原因很简单,因为同步器输出只能保证是一个稳态不能不能保证是一个确定的值。故多比特数据使用同步器还是会出现乱码的情况。对于多比特数据的操作一般使用异步FiFO。

2.2 复位电路

产生原因

异步复位

复位信号撤销时产生亚稳态对电路影响较大,时序图如下所示

同步复位

在这里插入图片描述

在这里插入图片描述

与异步复位类似,在复位信号撤销时,容易进入亚稳态。

解决方法

异步复位,同步释放

在这里插入图片描述

module Reset_test(
	input clk,
	input rst_nin,
	output reg rst_nout
);
 
	reg rst_mid;
 
	always@(posedge clk or negedge rst_nin)
	begin
		if(!rst_nin)
		begin
			rst_mid <= 0;
			rst_nout <= 0;
		end
		else
		begin
			rst_mid <= 1;
			rst_nout <= rst_mid;
		end
	end

可以理解为跨时钟域传输复位信号,对复位信号延迟两个时钟周期。

三、疑问

资料中提到,“因为同步器输出只能保证是一个稳态不能不能保证是一个确定的值”,那么跨时钟传输经同步后的数据只是不再将亚稳态传递下去,但具体的数值似乎是随机的?这不会对电路数据传输造成巨大伤害吗?

最后

以上就是孝顺台灯为你收集整理的亚稳态学习小结亚稳态学习小结的全部内容,希望文章能够帮你解决亚稳态学习小结亚稳态学习小结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部