复位信号的重要性不言而喻,它可以帮电路恢复到正常的状态。
关注到有三种不同的复位
同步复位
指的是复位信号生效(一般为0复位,1释放)后,需要保持到时钟上升沿到来才会进行复位操作。复位信号撤销后,也需要保持到时钟上升沿到来才会进行取消复位的操作。
由此可见,优缺点显而易见:优点是对于复位信号的毛刺现象有很好的消除作用,并且同步信号很好进行时序分析。缺点一是触发器都是异步复位端,如果想实现同步复位电路会更复杂一些。
这里的复杂一点指,rst信号想要变成同步信号必须经过一级触发器才能连接在其他触发器的rst端。如图所示:
由此带来的问题是,如果rst在建立保持时间内变化,会产生亚稳态,rst总有可能会和clk产生竞争。
异步复位
当复位信号有效时,电路立刻复位,不用等待时钟沿的到来。复位信号释放也不需要等待时钟到来,即电路立刻进入工作状态。
缺点也显而易见,当复位信号释放的时候,仍然会和时钟信号竞争。产生亚稳态、
异步复位,同步释放
如名字,指复位信号有效时立刻复位,但是释放需要等待时钟上升沿才会从复位状态退出。但是与同步复位的释放不同的是,这里的同步释放是将复位信号释放的操作使用触发器延后一个周期。可以说吸收了上述两种的优点。
代码实现如下:
module ARSR (
input clk, //时钟信号
input asy_reset, //异步复位信号
output syn_reset //同步复位信号
);
reg load_reset; //工具人信号
always@(posedge clk or negedge asy_reset)
begin
if(!asy_reset)
{asy_reset,load_reset} <= 2'b00; //异步复位
else
{asy_reset,load_reset} <= {load_reset,1'b1}; //同步释放
end
endmodule : ARSR
可见当reset信号拉高之后会有一个延迟,才会将释放的reset信号同步传出去,这个延迟最少一个周期,最多两个周期。