一、同步复位和异步复位
1.1 同步复位
同步复位的意思就是当复位信号(rst_n)有效的时候,寄存器在下一个时钟沿到来之后被复位,时钟沿到来之前寄存器还是保持其之前的值。
同步复位信号代码如下所示:
always_ff @(posedge clk)
begin
if (rst_n==1'b0)
begin
q2 <= 1'b0;
end
else
begin
q2 <= d2;
end
end
综合出来的电路如下所示:
如上图所示,同步复位电路综合出来之后的电路图,可以看出rst_n使两级寄存器之间的组合逻辑多加了一个与门。
1.2 异步复位
异步复位就是说,当复位信号有效的时候,寄存器立刻被复位,与时钟沿到来与否没有关系。
异步复位信号代码如下所示:
always_ff @(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
begin
q2 <= 1'b0;
end
else
begin
q2 <= d2;
end
end
综合出来的电路如下所示:
如上图所示,异步复位电路综合出来之后的电路图,综合出来的寄存器自带rst_n pin,所以复位信号不参与中间的组合逻辑。
1.3 同步复位和异步复位的比较
异步复位电路由于对寄存器之间的路径没有贡献,所以在时序上面能够略微比同步复位电路好一些,所以在对逻辑路径抠得很细的设计中,可以使用异步复位来避免引入更多的组合延迟。
同步复位的优势是由于复位信号会最终起作用在寄存器的D输入端,那么通过复位的组合逻辑都会被STA所约束,也就是说复位信号和其他路径的信号一起要满足寄存器的setup time, hold time, min pulse等一系列时序检查。在时序约束的情况下寄存器不会因为复位信号的变化产生亚稳态。而纯粹的异步复位在当前的STA check中是没有办法检查的。
二、Recovery time 和 Removal time
为了解决异步复位没有办法进行STA check,这里我们介绍Recovery time(恢复时间)和Removal time(去除时间)。Recovery time(恢复时间)和Removal time(去除时间)都是相对于复位信号的释放而言的。因为当复位信号有效时,寄存器的值都是稳定在复位值,只要复位信号持续有效,来多少时钟信号,其他路径上的信号怎么变,寄存器的值都不会变化,所以复位信号在什么时候复位都没什么关系。但是复位信号的释放就不一样了,一旦复位信号从有效变为无效,那么寄存器之后的值就得取决于其他信号输入和时钟沿的关系了,所以在这里要详细的介绍Recovery time(恢复时间)和Removal time(去除时间)。
2.1 Recovery time
recovery time指的是复位信号释放之后要求距离下一个时钟沿的最小时间间隔。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步复位信号的释放与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。图形如下图所示。
2.2 Removal time
removal time指的是reset release之后要求距离上一个时钟沿的最小时间间隔。这个时间的意义是,如果保证不了这个去除时间,也就是说异步复位信号的释放与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。图形如下图所示。
三、异步复位、同步释放
由之前可得,异步复位信号的复位不需要制约,但是异步复位信号的释放需要满足恢复时间和去除时间,如果能把异步复位信号的释放变为同步释放是不是就解决了上述的问题呢?
因此引出了异步复位、同步释放电路,代码如下所示:
always @ (posedge clk or negedge rst_n)
begin
if (rst_n==1'b0) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1;
rst_s2 <= rst_s1;
end
end
电路图如下所示:
可以看到,当rst_n有效时,两个flop被异步复位,它们的Q会经过rst-to-q的延时之后立刻发生变化,使得rst_s2有效。
而当rst_n 释放后,rst_s2并不是立刻发生变化,而是要等待clk的时钟沿,并且打两拍之后才能将1传递到rst_s2。因为rst_s2是来自于flop的Q,而Q是经过clk上的同步信号。那为什么要两级flop,还是为了减小产生亚稳态的概率。
对于一个使用异步rst的模块,rst synchronizer是必须的。