这篇文章学习一下异步复位同步释放。
之前都是人云亦云的,说异步复位同步释放可以解决由于recovery time/removal time不满足导致的亚稳态问题,代码实现也很简单,所以一直都没有深度的思考过:这个电路到底是如何解决问题的?
(1)首先,recover time和removal time只关注时钟边沿和复位信号释放沿之间的时序关系,而与复位信号的有效沿无关。
以低有效复位信号rst_n为例,“有效沿”指的是复位信号由无效变有效的边沿,即下降沿。同理,“释放沿”则是复位信号的上升沿。
因此所谓recovery time,则是指复位的释放沿必须提前时钟沿出现的一段时间,若满足这个要求,则时钟边沿来临后,触发器处于非复位状态。
而removal time,是指复位的释放沿必须滞后时钟沿出现的一段时间,若满足这个要求,则时钟边沿来临后,触发器处于复位状态。
如果不满足recovery/removal time,触发器将在一段时间内纠结这个时钟沿的输出到底是复位还是不复位,因而处于亚稳态。
(2)由于复位导致的亚稳态和由于setup/hold导致的亚稳态是不一样的。 复位导致的亚稳态是“复位”和“非复位”之间的亚稳态,而setup/hold导致的亚稳态则是“0电平”和“1电平”之间的亚稳态。
有什么区别呢?
当触发器出现setup/hold亚稳态时,其Q端最后的输出可能是0也可能是1。
但是当触发器出现复位亚稳态时,其Q端输出在一些情况下是不会有这个问题的,而是稳定地输出0。这是因为加入这个寄存器的输入为0的话,那么在经过一段时间的亚稳态后,寄存器最终还是会稳定到“复位”或者“非复位”中的一种状态。
①假如稳定到了“复位”状态,那么复位的话,其Q端输出将是0。
②加入稳定到了“非复位”状态,那么Q端输出应该是D端输入的值,但是由于D端输入为0,因而其Q端输出仍然是0。
所以此时无论有没有亚稳态,触发器的输出可以保证是0。这个特性也被异步复位同步释放电路所利用。
(3)如上图所示。
①由于rst_n的释放沿处在寄存器的recovery+removal时间窗内,因而DFF1和DFF2都会出现亚稳态。
②由于DFF1复位状态和非复位状态的输出是不一样的(如果是复位则输出0,如果不复位则输出1),因此其输出Q1将有两种情况:
a:经过一段时间的纠结后,最终稳定到了非复位状态,则Q1输出1
b:经过一段时间的纠结后,最终稳定到了复位状态,则Q1输出0。
那么这个Q1是不能用于后续触发器的复位信号的,因为这个纠结的过程在后续可能由于走线甚至经过组合逻辑后被进一步放大,导致亚稳态的传播。
③DFF的输出端Q2虽然也是亚稳态,但根据上文,我们可以确定其输出是会一直为0的。
④我们认为DFF1的亚稳态会在下一个时钟上升沿来临之前结束(*),使Q1稳定到0或者1.
如果稳定到1,那么Q2会提前一个周期输出高电平,否则Q2将会滞后一个周期输出高电平,但无论如何,Q2的输出不会像Q1那样在0和1之间纠结不定。
那么这个Q2是可以用于后续寄存器的复位信号的,这是一个同步信号,综合工具会确保该信号不会在其它寄存器的rst_n端出现recovery/removal违例。
(*)这是因为DFF1和DFF2之间没有逻辑,而是直接走线,这也是两级寄存器同步方法的理论基础。
参考: