一、建立时间和保持时间
对于数字系统而言,建立时间(setup time,Tsu)和保持时间(hold time,Th)是数字电路时序的基础。数字电路系统的稳定性,基本取决于时序是否满足建立时间和保持时间。
建立时间:建立时间就是时钟上升触发沿到来之前,数据需要保持稳定的最小时间。方便准确采样。
保持时间:保持时间就是时钟触发沿到来之后,数据需要保持稳定的最小时间,方便数据被电路准确传输。
总:时钟到来之前,数据需要提前准备好;时钟到来之后,数据还要稳定一段时间。建立时间和保持时间组成了数据稳定的窗口
二、亚稳态
亚稳态是由于违背了触发器的建立时间和保持时间而产生的。任何一个触发器都有特定的建立和保持时间,在时钟上升沿前后的这段时间窗口内,数据输入信号必须保持稳定。如果信号在这段时期发生了变化,那么输出将是未知的或者称为“亚稳的”。这种有害状态的传播就叫做亚稳态。触发器的输出会因此而产生毛刺,或者暂时保持在不稳定状态而且需要较长时间才能回到稳定状态。
在亚稳态窗口这段时间内输入信号和时钟都应该保持不变。如果信号在亚稳态窗口发生变化,那么就会造成亚稳态发生。
如图所示,当触发器处在亚稳态时,输出会在高低电平之间波动,这会导致延迟输出转换过程,并超出所规定的时钟到输出的延迟值( tco)。亚稳态输出恢复到稳定状态所需的超出tco的额外时间部分称为稳定时间 ( tMET)。并非所有不满足建立和保持时间的输入变化都会导致亚稳态输出。触发器是否进入亚稳态和返回稳态所需时间取决于生产器件的工艺技术与外界环境。一般来说,触发器都会在一个或者两个时钟周期内返回稳态。
三、亚稳态发生场合
1、异步信号检测
2、跨时钟域信号传输
3、复位电路
四、消除亚稳态方法
1、对异步信号进行同步处理(采用同步器);
2、采用FIFO对跨时钟域数据通信进行缓冲设计;
3、对复位电路采用异步复位、同步释放方式处理;
4、使用采样相应更快的触发器(亚稳态窗口小);
5、降低采样速率(降频);
6、避免使用dV/dt 低的输入信号;
1、使用多级同步器
这种模型大部分资料都说的是第一级寄存器产生亚稳态后,第二级寄存器稳定输出概率为90%,第三极寄存器稳定输出的概率为99%,如果亚稳态跟随电路一直传递下去,那就会另自我修护能力较弱的系统直接崩溃。
由于振荡时间Tmet是受到很多因素影响的,所以Tmet时间又长有短,所以当Tmet时间长到大于一个采集周期后,那第二级寄存器就会采集到亚稳态。
2、 当数据流从一个时钟域到另一个时钟域的时候,绝大多数情况下都采用FIFO来作为中间缓冲,采用双时钟对数据缓冲,就可以避免亚稳态的发生。
3、异步复位,同步释放
对于复位情况下的亚稳态,常常是由于恢复时间和移除时钟不满足造成的,因此,最常用的处理方式是采用异步复位、同步释放。常用电路模型如所示。采用第二级寄存器输出作为全局复位信号输出。
异步复位处理
wire sys_rst_n;
reg [1:0] rst_r;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
rst_r <= 2’d0;
else
rst_r <= {rst_r[0], 1’b1};
end
assign sys_rst_n = rst_r[1];
对于异步复位、同步释放的理解
通常我们使用复位信号有这几种方式:
(1)异步复位
always@(posedeg clk or negedge rst_n)
(2)同步复位
module system_ctr (
input clk ,
input reset_l ,
output reg reset_out
);
reg reset_d ;
always @ (posedge clk )begin
reset_d <= reset_l ;
reset_out<= reset_d ;
end
endmodule
reset_out 信号是已经同步过的复位信号,可以直接在其它模块使用。需要注意的是,这个复位信号会延迟几个时钟周期。并且,复位信号必须要大于时钟周期,才能被系统检测到。
(3)异步复位同步释放
reset_out信号是已经同步过的复位信号,可以直接在其它模块使用。需要注意的是,这个复位信号会延迟几个时钟周期。并且,复位信号必须要大于时钟周期,才能被系统检测到。
module test(
input clk ,
input reset_l ,
output reg reset_out
);
reg reset_d ;
always @ (posedge clk or negedge reset_l)
begin
if(!reset_l)begin
reset_out <= 1'b0 ;
reset_d <= 1'b0 ;
end
else begin
reset_d <= 1'b1 ;
reset_out <= reset_d ;
end
end
endmodule
这个电路图就是理解异步复位、同步释放的关键了。这里的复位信号直接接到D触发器的异步清零端,也就不存在同步复位中复位信号必须要大于时钟周期才能被检测到的局限。这就是异步复位的意思。同时,reset_out变为高电平是受时钟控制的,也就是所说的同步释放。同步释放避免了异步复位可能产生的不满足复位恢复时间的情况。综上所述,异步复位同步释放机制解决了异步复位和同步复位固有的缺陷,因此将这种方法作为系统复位是极好的选择。