对于复位情况下的亚稳态,常常是由于恢复时间(Recovery Time)和移除时间(Removal Time)不满足造成的。最常用的处理方式是采用异步复位,同步释放。采用第二级寄存器输出作为全局复位信号输出,模块如下:
module rst(
input I_Clk,
input I_Rst_n, //异步复位输入
output O_Sys_Rst_n //异步复位,同步释放输出
);
reg [1:0] rst_n;
assign O_Sys_Rst_n = rst_n[1];
always@(posedge I_Clk or negedge I_Rst_n)
if(!I_Rst_n)
rst_n <= 2'd0;
else
rst_n <= {rst_n[0],1'b1};
endmodule
如果异步复位信号的撤销时间在恢复时间和移除时间之内,势必造成亚稳态,输出在时钟边沿后产生振荡,最终稳定到0或1。由此产生的结果是,在不同的触发器上,复位撤销的时间可能有一个时钟周期的差异。异步复位,同步释放的意义在于解决这个差异,亚稳态现象同样会出现在rst[0]上,但rst[1]却是同步输出的结果。