硬件架构的艺术(The Art of Hardware Architecture)之亚稳态

亚稳态的定义

图1.亚稳态窗口
在异步系统中,由于数据与时钟的关系不固定,当违背了触发器特定的建立和保持时间(即在亚稳态窗口,输入信号并没有保持稳定),那么触发器的输出将是未知的(输出在高低电平之间波动)。这种有害的状态的传播就是亚稳态。亚稳态产生之后,触发器会产生毛刺,或者暂时保持在不稳定状态而且需要较长的时间才能回到稳定状态(这种稳定状态是随机的,与触发器的输入信号无关。https://zhuanlan.zhihu.com/p/129889943)
图2.亚稳态的时序参数

发生亚稳态的机率

图3.亚稳态的恢复时间
Tr=Tco+Tmet
来源:https://blog.csdn.net/qq_26652069/article/details/99709766
MBTF是触发器故障率的倒数,是触发器发生亚稳态错误的时间间隔,平均无误差时间,MTBF越大,表示触发器越难出现亚稳态
单级同步器的MTBF
两级同步器的MBTF
1、第一级触发器发生亚稳态后,那么第二级触发器不一定就会发生亚稳态,而是有一定的机率。这个机率与Tmet or Tr相关
2、时钟频率越大,时钟周期越短,触发器建立时间的裕量会越少,发生亚稳态的概率越大。

容易发生亚稳态的几种情况

容易发生亚稳态的几种情况

常见的解决办法

第一类:在同步系统电路里面,可以说就是组合逻辑路径上的延迟大等原因而造成违反寄存器的时序要求。
这一类的解决方式比较好解决,一般较少路径延迟即可,而这种在同步系统电路里面其亚稳态的产生是比较小概率的,只要不违反时序,保证电路余量即可。
第二类:在多时钟跨时域的系统电路里面,因为发送域寄存器时钟与接收域寄存器时钟的时钟相位移不确定,而导致发送域数据有可能随时到达接收域寄存器(随时到达而不满足寄存器的Tsu跟Th),所以会导致寄存器产生亚稳态。
这一类的解决方式有多种方法,例如总线传输,异步FIFO传输等方式,这里不做详细描述,在后面的博文将再做详细介绍。
第三类:异步复位而导致系统电路产生亚稳态。因为异步复位信号有可能随时复位在时钟沿的附近,而导致系统产生亚稳态。这一类的解决方式有“异步复位,同步释放”等,也在后面的博文将再做详细介绍。
————————————————
版权声明:本文为CSDN博主「凌云望远」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39015789/article/details/105013592

1、加大时钟周期
2、同步器
亚稳态的解决办法

同步器类型

A类同步器
B类同步器
q1在sync_out为1且async_in为0时被清0,有点类似于由快到慢时钟域的数据传输(设置一个快时钟域的信号展宽,当需要进行跨时钟域的信号为1时,该展宽信号拉高,然后将该展宽信号传输进慢时钟域时先打两拍(亚稳态处理),把在慢时钟域打了两拍的信号再在快时钟域打两拍作为展宽信号的清零使能信号,即拉低展宽信号,详见https://blog.csdn.net/Reborn_Lee/article/details/101280171?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159223954919725222461879%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159223954919725222461879&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v1~rank_blog_v1-2-101280171.pc_v1_rank_blog_v1&utm_term=%E8%B7%A8%E6%97%B6%E9%92%9F%E5%9F%9F#%E5%BF%AB%E6%97%B6%E9%92%9F%E5%9F%9F%E5%88%B0%E6%85%A2%E6%97%B6%E9%92%9F%E5%9F%9F)
在这里插入图片描述
这个模式B中的第一个触发器将异步信号当成时钟信号,而数据输入是vcc,Vcc的值稳定,那么第一个寄存器应该不存在亚稳态情况才对,这个时候并不用考虑异步信号与时钟的关系。(个人想法,请大家多多指教)

复位信号中涉及的亚稳态(异步复位 同步释放)

https://blog.csdn.net/weixin_42294124/article/details/120209903
这篇博文里面介绍了
recover time:如果复位信号是低电平有效,那么恢复时间就是指时钟上升沿之前,复位信号由0变成1时需要稳定为1的时间(恢复时间可以理解为“数据信号开始有效”这种恢复)
recover time
remove time:复位信号低电平有效,那么清除时间就是指时钟上升沿之后,复位信号由0变为1时需要稳定为0的时间(可以理解为需要保持这个时间长度才能“清除数据信号”)
remove time
这两个参数限制的是复位信号释放时(即不考虑复位信号被拉高后又突然拉低的现象,因为复位信号优先级高,所以复位信号突然拉低时并不会导致触发器发生亚稳态,一定会输出低电平;),状态切换时间点的限制,如果切换时间点位于恢复时间与清除时间之间,那么触发器将无法判断是继续执行清零,还是直接等于数据输入端,于是进入亚稳态。
异步复位
类似上图中的异步复位,如果sys_rst_n释放时违背了恢复时间或清除时间的限制,那么程序将在if与else之间徘徊,结果就是无法确定dout到底时等于0还是等于din。

由于复位信号广泛应用于程序中的各个触发器,一旦复位信号发生时序违约这种情况,那么所有使用这个复位信号的触发器都将产生亚稳态,各个下级触发器可能模块A检测到0,模块B检测到1,会造成极大的影响。

如果使用异步复位,同步释放的方法,那么直接通过增加的两级触发器,发生亚稳态的机率将极大下降。
异步复位 同步释放的RTL

module Sy

nc_rst(
	input	sys_clk,
	input	async_rst_n,
	
	input	din,
	output	reg dout
	);
	reg	rst_reg;
	reg	sync_rst_n;
	
	always@(posedge sys_clk,negedge async_rst_n)begin
		if(!async_rst_n)begin
			rst_reg <= 1'b0;
			sync_rst_n <= 1'b0;
		end
		else begin
			rst_reg <= 1'b1;
			sync_rst_n <= rst_reg;
		end
	end
	
    always@(posedge sys_clk,negedge sync_rst_n) begin
        if(!sync_rst_n)
			dout <= 1'b0;
		else
			dout <= din;
    end
endmodule
————————————————
版权声明:本文为CSDN博主「小汪的IC自习室」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42294124/article/details/120209903

async_rst_n为原来的复位信号,sync_rst_n为经过异步复位、同步释放处理后的复位信号
异步复位同步释放的RTL视图
当复位信号async_rst_n违反recover time时,同步复位异步释放的处理时序

第一级触发器的输入端连接的是vcc,第二级触发器连第一级触发器的输出(rst_reg),在复位释放之前一直保持低电平,即1‘b0,就是从代码来说,如果是亚稳态,if,else不管怎么竞争,第二级输出一定是1’b0,因为此时rst_reg也是1’b0。而第一级的输出rst_reg,在if里边是赋值1’b0,在else里赋值是1’b1,发生亚稳态时,if,else在竞争,竞争期间输出就不稳定,因为有两种可能的状态。

假设直接使用async_rst_n作为复位信号,那么当async_rst_n发生recover/remove time违约时,其下级所有的触发器都将发生亚稳态。使用异步复位同步释放处理后,仅有rst_reg这个触发器确定会发生亚稳态,sync_rst_n有一定可能性会发生,使用sync_rst_n作为复位信号的触发器发生亚稳态的可能性更小。

异步复位与同步复位的区别

1、同步复位的RTL

触发器上的复位信号完全同步于时钟信号源。复位信号只有在时钟上升沿到来时,才能有效,否则,无法完成对系统的复位工作。

module sync_rst(
	input	sys_clk,
	input	sys_rst_n,
	
	input	din,
	output	reg dout
	);

	always@(posedge sys_clk) begin
		if(!sys_rst_n)
			dout <= 1'b0;
		else
			dout <= din;
	end
endmodule
————————————————
版权声明:本文为CSDN博主「小汪的IC自习室」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42294124/article/details/120209903

2、异步复位的RTL

复位信号直接接到功能触发器的异步复位引脚,复位只与复位信号有关,与时钟无关。无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。

module Async_rst(
	input	sys_clk,
	input	sys_rst_n,
	
	input	din,
	output	reg dout
	);
	
	always@(posedge sys_clk,negedge sys_rst_n) begin
		if(!sys_rst_n)
			dout <= 1'b0;
		else
			dout <= din;
	end
endmodule
————————————————
版权声明:本文为CSDN博主「小汪的IC自习室」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42294124/article/details/120209903

3、异步复位与同步复位的时序

同步复位时序
异步复位时序

4、同步复位与异步复位的RTL视图

同步复位的RTL视图
异步复位的RTL视图

5、同步复位与异步复位的特点

同步复位特点:

1.所设计系统为100%同步时序,有利于时序分析;
2.抗干扰性能好,能有效剔除信号中短于时钟周期的毛刺;
在这里插入图片描述
3.复位信号的有效时长必须大于时钟周期,才能真正能被系统识别完成复位操作,同时还要考虑诸如组合逻辑路径延迟、系统快慢时钟等问题,很难保证复位信号到达各个寄存器的时序;
在这里插入图片描述
4.由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。(对比RTL视图)

异步复位的特点

1.无需额外的逻辑资源,实现简单,可以保证复位信号到达各个寄存器的时钟偏斜最小;
2.复位信号易受外界干扰,对电路内的毛刺敏感;
在这里插入图片描述
3.复位信号释放具有随机性,如果复位释放信号刚好在时钟有效沿附近,可能存在时序违规(recovery time不满足要求),导致亚稳态。
在这里插入图片描述
异步复位 同步释放其实是同步复位和异步复位优点的折中。复位电路通过异步复位使得全部功能寄存器同时复位,同时使用同步释放很好克服了异步复位在信号释放时导致亚稳态的问题。异步复位,同步释放就是指在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。

那么为什么打两拍之后,亚稳态的概率会改变,以及亚稳态发生时,稳定的状态其实不确定,那么打两拍的意义是什么?(https://zhuanlan.zhihu.com/p/129889943)
亚稳态发生概率会改变与Tmet有关。
来源:https://zhuanlan.zhihu.com/p/129889943

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值