复位导致亚稳态的概念:
同步电路中,输入数据需要与时钟满足setup time和hold time才能进行数据的正常传输(数据在这个时间段内必须保持不变:1不能变为0,0也不能变为1),防止亚稳态;
1、复位恢复时间和清除时间
首先解释一下恢复时间(recovery time)和清除时间(removal time):(以复位信号低电平有效为例)
复位恢复时间(recovery time):撤销复位时,复位信号无效到时钟有效沿来临之间需要维持的最小的时间,类似于同步时钟的建立时间setup time;
复位清除时间(removal time):复位时,在时钟有效沿来临之后复位信号还需要保持复位状态的时间为去除时间,类似于同步时钟的保持时间hold time;
2、同步复位
同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。
优点:
1、系统100%同步,有利于时序分析
2、刚干扰性好,可以过滤信号中短于时钟周期的毛刺
当毛刺特别靠近时钟的上升沿时,可能导致时序违规,而使得电路产生亚稳态,但是这种几率很低,可以近似忽略。确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段。
缺点:
1、复位信号的有效时长必须大于时钟周期,否则复位无效。
2、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
同步复位RTL代码及对应的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
3、 异步复位电路
复位信号直接接到功能触发器的异步复位引脚,复位只与复位信号有关,与时钟无关。无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
优点:
1、 异步复位信号识别方便,而且可以很方便的使用全局复位;
2、由于大多数的厂商目标库内的触发器都有异步复位端口,可以节约逻辑资源;
缺点:
1、复位信号易受外界干扰,对电路内的毛刺敏感;
2、复位信号释放具有随机性,如果复位释放信号刚好在时钟有效沿附近,可能存在时序违规(recovery time不满足要求),导致亚稳态。(我理解的是恢复时间太短 不太行)
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
对比两者综合后的RTL视图,发现同步复位会多使用一些逻辑单元,这是因为一般的触发器都带有异步复位端;
4、异步复位、同步释放
系统设计采用“异步复位、同步释放”(复位信号低电平有效),是利用同步复位和异步复位优点的折中。复位电路通过异步复位使得全部功能寄存器同时复位,同时使用同步释放很好克服了异步复位在信号释放时导致亚稳态的问题。
异步复位,同步释放就是指在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。
module Sync_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
异步复位,同步释放原理解释:
异步复位:
当async_rst_n有效时,第一个D触发器的输出是低电平,第二个D触发器的输出rst_sync_n也是低电平,方框2中的异步复位端口有效,输出被复位。
同步释放:
如果async_rst_n撤除时发生在clk上升沿附近,则可能发生亚稳态事件,使用两级触发器尽可能消除亚稳态。假设第一级D触发器clk上升沿时async_rst_n正好撤除,则D触发器1可能输出高电平“1”,也可能输出亚稳态,也可能输出低电平。但此时第二级触发器不会立刻更新输出,第二级触发器输出值为前一级触发器Q1的输出状态。显然Q1之前为低电平,故第二级触发器输出保持复位低电平。直到下一个时钟有效沿到来之后,前一级亚稳态大概率输出稳定(可能为低电平也可能为高电平),使得第二级触发器能够稳定输出,若此时第二级触发器输出高电平,即实现同步释放,若输出为低电平且此时复位信号仍然保持无效状态,则在第三个时钟输出高电平,实现同步释放。
上述时序图是在第二个触发沿到来时,前一级亚稳态输出已经稳定且稳定为高电平情况下的时序,如果在第二个触发沿到来时,前一级输出的亚稳态还未达到稳定,则电路还是处于亚稳态状态(概率不大),所以两级触发器电路并不能完全消除亚稳态问题,但是可以极大改善亚稳态。
综上:如果async_rst_n撤除时发生在clk上升沿附近,则可能发生亚稳态事件,
补充:(我也没看懂)
如果异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之内,那势必造成亚稳态的产生,输出在时钟边沿的Tco后会产生振荡,振荡时间为Tmet(决断时间),最终稳定到“0”或者“1”,就会可能造成复位失败。
相比于时钟脉冲的亚稳态期信号不能变化 从而避免造成亚稳态出现的情况外,复位信号的释放也必须满足以下情况:
recovery time指的是复位信号释放之后要求距离下一个时钟沿的最小时间间隔。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步复位信号的释放与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。
总结:复位信号释放时如果离下个时钟沿太近,即小于 recovery time那么有可能会造成输出亚稳态,下个时钟沿也可能采集复位这个低电平
。
removal time指的是reset release之后要求距离上一个时钟沿的最小时间间隔。这个时间的意义是,如果保证不了这个去除时间,也就是说异步复位信号的释放与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。图形如下图所示。
总结:复位信号释放时如果离上个时钟沿太近,即小于removal time那么有可能会造成输出亚稳态,上个时钟沿也可能采集复位释放这个高电平。