概述
目录
1、建立时间和保持时间违例导致的亚稳态
1.1同步时序电路亚稳态
建立时间、保持时间、最大时钟频率
规则1:setup检查
规则2:hold检查
1.2异步时序电路亚稳态
区别:竞争冒险
2、复位信号违例导致的亚稳态
2.1异步复位信号产生亚稳态
2.2同步复位电路产生亚稳态
2.3代码实现及综合
异步复位代码实现及RTL综合
同步复位代码实现及RTL综合
同步复位,异步释放的代码实现及RTL综合
跨时钟域(Clock Domain Crossing)产生的问题:
亚稳态是一种不希望出现的非平衡状态(non-equilibrium electronic state),既不是0也不是1,这种状态如果不加以处理,可能在亚稳态结束之后随机为0状态或1状态,可能会存在很长一段时间,对于自我恢复能力比较弱的系统,可能会导致系统奔溃。
例如:触发器有两个定义好的状态(0和1),但是在某些情况下,触发器的数据可能会在两个状态之间徘徊(hover),处于不稳定的状态;(之前用AD的ADC时出现过这种情况,进入亚稳态然后不能恢复的情况)
结果:
亚稳态可能会造成信号误判,从而让后续电路出现逻辑错误;也可能会造成系统崩溃。
原因:
建立和保持时间违例(setup and hold violations) 或者复位信号的移除时间和恢复时间(异步复位同步释放)违例。
1、建立时间和保持时间违例导致的亚稳态
1.1同步时序电路亚稳态
-
建立时间、保持时间、最大时钟频率
T(setup)表示电路的建立时间,即在触发器的有效边沿到来之前,信号线上的数据已经稳定存在的时间
T(hold)表示电路的保持时间,即在触发器的有效边沿到来之后,信号线上的数据必须继续保持的时间
最大时钟频率:在满足建立时间和保持时间的前提下,系统能够运行的最大频率
如上图所示:
CLKM:系统的主时钟
T(CLKM)表示所有时钟的时钟周期(器件会造成时钟延迟,但是不会对时钟周期有影响,因此三个时钟周期都是相同的)
T(lunch)表示数据产生时钟相对于主时钟之间的延迟,在同步时序电路中通常是固定的;
T(capture)表示获取始终相对于主时钟之间的延迟,在同步时序电路中通常是固定的;
T(ck2q)表示在触发器UFF0所产生的延迟
T(dp)表示两个触发器中间的组合逻辑电路所产生的延迟
分析目的:上一个时钟周期lunch的数据必须在下一个时钟周期capture,为了达到这个目的,必须满足以下两个规则。
规则1:setup检查
数据lunch:以CLKM的有效边沿为零点,当过了T(lunch)时间后UFF0才会启动数据lunch,然后经过T(ck2q)+T(dp)之后数据到达UFF1的D端口,即lunch到UFF1的D端口总时间为(T(lunch)+T(ck2q)+T(dp))
数据capture:以CLKM的有效边沿为零点,当过了T(capture)+T(CLKM)后开始采集,但是setup time要求在这个时间之前的T(setup),数据就必须已经稳定到达UFF1的D端口了,即要求上一个数据到达UFF1的D端口的数据最多只能是(T(capture)+T(CLKM)-T(setup)),这句话,总和上面的式子,得出以下公式:
T(lunch)+T(ck2q)+T(dp)<= T(capture)+T(CLKM)- T(setup)
上述式子又可以改变为:
T(CLKM)>= T(lunch)+T(ck2q)+T(dp)+ T(setup)- T(capture)
即存在对于时钟周期最小值的要求,根据时钟周期和频率的倒数关系,即存在对于时钟频率最大值的要求
规则2:hold检查
刚才分析了到达UFF1的D端口时的时间要求,但是hold time同时要求这个数据必须在UFF1的D端口继续保持T(hold)才能被UFF1成功获取,在此之前,不能有下一个数据已经lunch到UFF1的D端口,防止数据被覆盖;
第二个数据lunch到UFF1的D端口的时间为:T(CLKM)+T(lunch)+T(ck2q)+T(dp)
UFF1的D端口中上一个数据可以变化的最早时间为T(capture)+T(CLKM)+ T(hold)
则必须保证T(CLKM)+T(lunch)+T(ck2q)+T(dp) > T(capture)+T(CLKM)+ T(hold)才可以保证旧的数据在成功获取之前不会被新的数据覆盖,化简后得到如下公式:
T(lunch)+T(ck2q)+T(dp) > T(capture)+ T(hold)
如果不能满足setup检查或hold检查中的任何一个,电路就会进入亚稳态。
但是根据如上分析结果可以看出,对于同步时序电路来说,亚稳态出现的主要原因在于触发器工艺、组合电路延迟和时钟周期,且UFF0和UFF1的时钟之间的延迟实际上是固定的,只要处理好组合电路和确定时钟频率就行,因此同步时序电路出现亚稳态的情况比较少,原因也更容易分析。
但是在异步时序逻辑电路中由于UFF0和UFF1的时钟延迟不固定,这个地方就很容易出现亚稳态,也更难分析。
1.2异步时序电路亚稳态
(1) 对异步信号进行同步处理;(在输出时钟域经过经过两级或三级寄存器级联的方式来采样异步信号,且降低亚稳态出现的概率;传输多bit数据时,将使能信号经过寄存器级联来稳定,然后通过是能信号来采样跨时钟域的信号)
这里的方案都是在说怎么降低亚稳态出现的概率,但是不能保证产生亚稳态之后逻辑还是正确的,这就是数据包里面进行CRC校验的原因。
(2) 采用FIFO对跨时钟域数据通信进行缓冲设计;
(3) 对复位电路采用异步复位、同步释放方式处理。
-
区别:竞争冒险
竞争:当一个门的输入有两个或两个以上的变量发生变化时,由于这些变量是通过不同的组合逻辑电路到达的,因此在门的输入端来看,二者的变化有时间上的先后顺序,这种情况称之为竞争
冒险:由于竞争现象所产生的的毛刺或脉冲干扰,称之为冒险
检查方式:当组合电路的输入端每次只有一个输入发生变化时,如果出现Y=A+A'或Y=A·A'的情况(即如果电路在某些情况下可以化简成Y=A+A'或Y=A·A'的式子,则说明A和A'是通过不同的路径到达的,则会产生竞争冒险)
消除方式:
1.在输出端接入滤波电容(竞争冒险产生的脉冲或毛刺实际上是一种高频信号,利用旁路电路的滤除高频的作用来降低脉冲)
2.单独引入一个选通脉冲(在脉冲出现的瞬间来判别输出,虽然没了毛刺,但是可能会产生逻辑错误)
3.修改逻辑设计(引入格雷码计数器,每次只有一个bit发生变化)
2、复位信号违例导致的亚稳态
2.1异步复位信号产生亚稳态
恢复时间(recovery time):
是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。(理解:通常复位信号为低电平0有效,高电平无效,如果在某个CLK有效时钟沿到来前的removal time以内,RST信号才从0变为1,即变为无效,则触发器没有足够的时间来让其恢复正常工作,从而接受这个CLK有效时钟沿,则此CLK时钟会变得无效)
异步复位信号变得无效之后,触发器在一段时间内不能工作,也不能识别到CLK的有效边沿。这段时间称之为恢复时间。如果在这段时间内来了CLK的有效边沿,则此CLK有效边沿可能会被“无效”
移除时间(removal time):
是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。(理解:如果CLK的有效时钟沿已经被识别到,则在此之后的removal time 以内,如果rst出现了有效低电平,则此有效低电平会变得无效,无法实现正常复位,则CLK信号依然有效)
出现的亚稳态:如果RST信号在CLK有效边沿之前的recovery time之前变得无效,则触发器有足够的时间恢复,从而接受下一个数据,输出稳定值;如果RST信号在CLK有效边沿之后的removal time之后变得有效,则RST能够成功复位,则触发器会接收到RST的值,输出稳定值;如果RST信号从有效(1)变得无效(0)的时刻在CLK的recovery time以内,或者RST信号从无效(0)变得有效(1)的时间在removal time以内,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。则输出数据不稳定,就可能会产生亚稳态。
异步复位的优缺点:
优点:速度响应快
缺点:容易出现亚稳态
2.2同步复位电路产生亚稳态
当输入端Din为高电平,而且复位信号的撤销时间(区分:这是撤销时间,即从0变为1的时刻,而不是去除时间removal time)在clk的Tsu和Th内时候,亚稳态就随之产生了。如图3.5时序所示,当复位撤销时间在clk的Tsu和Th内,输入数据为“1”,通过和输入数据相与后的数据也在clk的Tsu和Th内,因此,势必会造成类似异步信号采集的亚稳态情况(这里出现亚稳态的原因是不满足静态时序分析中的建立时间和保持时间)
同步复位的优缺点:
优点:出现亚稳态的几率降低
缺点:综合后的面积增大
解决方式:异步复位,同步释放
2.3代码实现及综合
异步复位代码实现及RTL综合
module Async_Reset
(
input clk
,input rst_n
,input data_in
,output reg data_out
);
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
data_out <= 1'd0;
else
data_out <= data_in;
end
endmodule
同步复位代码实现及RTL综合
module Sync_Reset
(
input clk
,input rst_n
,input data_in
,output reg data_out
);
always @ (posedge clk)
begin
if (!rst_n)
data_out <= 1'd0;
else
data_out <= data_in;
end
endmodule
可以看出,D触发器前面增加了一个数据选择器(MUX,Multiplexer 又称多路复用器),将rst_n信号作为数据选择器的使能信号,当rst_n无效(1)时,选择器导通data_in,当rst_n有效时,数据选择器导通1h0。
可以看出同步复位信号增加了数据选择器,从而增大了RTL综合之后电路的面积。
同步复位,异步释放的代码实现及RTL综合
module Async_Reset_Sync_Validate
(
input clk
,input rst_n
,output reg data_out
);
reg R1;
//Asynchronization reset
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
R1 <= 1'd0;
else
R1 <= 1'd1;
end
//Synchronization validate
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
data_out <= 1'd0;
else
data_out <= R1;
end
endmodule
可以看出,第一级D触发器R1表现为异步复位信号,在复位信号为低电平的瞬间,就将R1输出设定为0;而第二级数据信号,只有复位信号在CLK之前的recovery time之前无效化之后,才能通过CLK的有效边沿将R1的输出采集,然后体现在data_out上面。即将“复位信号异步采集,同步输出”,从而大大降低了产生亚稳态的几率。
两级触发器做同步,是非总线信号的最常见异步处理方法。总线信号的异步处理方法,最常见的是异步fifo实现。
RTL仿真为前仿真(功能仿真),是不用加延迟信息和建立时间保持时间的,因此在RTL仿真中的逻辑可能因为亚稳态的原因而在实际电路中不一样。静态时序分析STA才会分析时序的问题。
跨时钟域(Clock Domain Crossing)产生的问题:
Re-convergence Problem的主要原因是上图中DelayA和DelayB的时间不一致,从而导致本来X1Y1和X4Y4之间出现问题,例如原本X1Y1=11,但是经过采集后可能会编程10或01
消除方式:通过格雷码编码的方式来避免,格雷码编码必须在跨时钟与之前来做,而不是在跨时钟域的时候。
最后
以上就是可爱含羞草为你收集整理的数字IC设计系列---- 亚稳态1、建立时间和保持时间违例导致的亚稳态2、复位信号违例导致的亚稳态的全部内容,希望文章能够帮你解决数字IC设计系列---- 亚稳态1、建立时间和保持时间违例导致的亚稳态2、复位信号违例导致的亚稳态所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复