复位电路是每个数字逻辑电路的重要组成部分之一。复位的目的有二个方面:
1、仿真的时候使电路进入初始状态或者其他预知状态。
2、对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态。
复位方式大致分为二类: 同步复位和异步复位
(一)同步复位
指定同步复位时,always的敏感表中仅有时钟沿信号,仅仅当时钟沿采到同步复位的有效电平时,才会有时钟沿到达时刻进行复位操作。
always @ (posedge clk)
if (!rst_n)
begin
……
end
else
begin
……
end
优点: 同步复位仅在时钟的有效沿生效,可以有效的避免因复位电路毛刺造成的亚稳态和错误。
缺点:1.很多触发器本身并不包含同步复位端口,使用同步复位会增加更多逻辑资源
2.同步复位的最大问题在于必须保证复位信号的有效时间足够长,从而才能保证所有触发器都有效地复位。
(二)异步复位
指定异步复位时,只需在always的敏感表中加入复位信号的有效沿即可,当复位信号有效沿到达时,
无论时钟沿是否有效,复位立刻发挥功能。
always @ (posedge clk or negedge rst_n)
if (!rst_n)
begin
……
end
else
begin
……
end
优点:大多数触发器都包含异步复位端口,异步复位会节约逻辑资源,并且异步复位设计简单。
缺点:异步复位逻辑树的组合逻辑易产生毛刺,毛刺的有效沿会触发异步复位,造成逻辑错误。
(三)异步复位,同步释放
推荐的复位电路方式是异步复位,同步释放,这种方式可以有效地继承异步复位设计简单的优势,并克服异步复位的上述不足。
reg reset_reg;
always @ (posedge clk)
reset_reg <= rst_n;
always @ (posedge clk or negedge reset_reg)
if (!reset_reg)
begin
……
end
else
begin
……
end