本帖最后由 hxing 于 2016-5-7 14:47 编辑
最近看到一篇关于 同步复位和异步复位的比较 的帖子,感觉讲的很清晰,遂转载了
无论同步还是异步复位,在对触发器时序进行分析的时候,都要考虑复位端
与时序的相位关系。
对于同步复位,复位信号可以理解为一个普通的数据信号,它只有在时钟的
跳变沿才会起作用,一般只要复位信号持续时间大于一个时钟周期,就可以保证
正确复位。
对于异步复位,复位可以在任何时候发生,表面上看跟时钟没有关系,但真
实情况是异步复位也需考虑时钟跳变沿,因为时钟沿变化和异步复位都可以引起
Q端数据变化,如果异步复位信号跟时钟在一定时间间隔内发生变化,Q值将无法
确定,即亚稳态现象。这个时候即使异步复位信号持续时间再长也没有办法,因为
不定态已经传递下去了。
一、特点:
同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能
有效。否则,无法完成对系统的复位工作。用Verilog描述如下:
always @(posedge clk) begin
if (!rst)
....
end
异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用
Verilog描述如下:
always @(posedge clk or negedge rst ) begin
if (!rst)
....
end
二、各自的优缺点:
1、总的来说,同步复位的优点大概有3条:
(1) 有利于
仿真器的仿真。
(2) 可以使所设计的系统成为100%的同步时序
电路,这便大大有利于时序分析,
而且综合出来的fmax一般较高。
(3) 因为它只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺,
但它的缺点也有不少,主要有:
(1) 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位。同时
还要考虑,诸如,clk skew,组合逻辑路径延时,复位延时因素。
(2) 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,
综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
2、对于异步复位而言,也有三条有点,如下:
(1) 大多数目标器件库的DFF都有异步复位端口,因此采用异步复位可以节省资源。
(2) 设计相对简单。
(3) 异步复位信号识别方便,而且可以很方便地使用
FPGA的全局复位端口GSR。
但是它的缺点为:
(1) 在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位
释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致
亚稳态。
(2) 复位信号容易受到毛刺的影响。
三、总结:
所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。
四、推荐复位方式
推荐的复位方式上面提到的“异步复位,同步释放”。这就结合了上方面的优点,很好的
克服了异步复位的缺点。
具体方式是:在异步复位后加上一个所谓的“reset synchronizer”,这样就可以使异步复位信号
同步化,然后,再用经过处理的复位信号去作用系统,就可以保证比较稳定了。Verilog代码如下:
module reset_synchronizer (
input clk, asyncrst_n;
output reg rst_n
);
reg rff1;
always @(posedge clk or negedge asyncrst_n) begin
if (!asyncrst_n)
{rst_n, rff1} <= 2'b0;
else
{rst_n, rff1} <= {rff1, 1'b1};
end
endmodule
这就是一个DFF,异步复位信号直接接在它的异步复位端口上(低电平有效),然后数据输入端
rff1一直为高电平‘1’。倘若异步复位信号有效的话,触发器就会复位,输出为低,从而复位后继系统。
但是,又由于这属于时钟沿触发,当复位信号释放时,触发器的输出要延迟一个时钟周期才能恢复成'1',
因此使得复位信号的释放与时钟沿同步化。此外,还有一种方法更为直接,就是直接在异步复位信号后
加一个D触发器,然后用D触发器的输出作为后级系统的复位信号,也能达到相同的效果。
五、多时钟系统中复位的处理方法
这是一个很实际的问题,因为在较大型的系统中,一个时钟驱动信号显然不能满足要求,一定会根据系统
的要求用多个同源时钟(当然也可以是非同源了)去驱动系统的不同部分。那么在这样的多时钟系统中,复位
键怎么设置?它的稳定与否直接关系到整个系统的稳定性,因此要格外注意(其实,复位信号在同步时序系统
中的地位和时钟信号一样重要)。下面就说一下具体的处理方法,当然所遵循的原则就仍应该是上位的“异步
复位,同步释放“:
(1) non-coordinated reset removal: 顾名思义,就是同一个系统中的多个同源时钟域的复位信号,有
彼此独立的“reset synchronizer”驱动。当异步复位信号有效时,各时钟域同时复位,但是复位释放的时间
由各自的驱动时钟决定,也就是说:时钟快的先释放,时钟慢的后释放,但是各复位信号之间没有先后关系。
(2) sequence coordinated reset removal:这是相对于上述方式来说的,也就是说各时钟域的复位信号
彼此相关,各个部分系统虽然也同时复位,但是却分级释放。而分级的顺序可由各个“reset synchronizer”
的级联方式决定。可以先复位前级,再复位后级,也可以反过来。Verilog描述如下:
例子:三级复位系统,系统中的时钟分别为1m,2m,11m:
第一级reset_synchronizer程序:
module reset_synchronizer (
input clk, asyncrst_n;
output reg rst_n
);
reg rff1;
always @(posedge clk or negedge asyncrst_n) begin
if (!asyncrst_n)
{rst_n, rff1} <= 2'b0;
else
{rst_n, rff1} <= {rff1, 1'b1};
end
endmodule
第二、三级reset_synchronizer程序:
module reset_synchronizer2 (
input clk, asyncrst_n, d;
output reg rst_n
);
reg rff1;
always @(posedge clk or negedge asyncrst_n) begin
if(!asyncrst_n)
{rst_n, rff1} <= 2'b0;
else
{rst_n, rff1} <= {rff1, d};
end
endmodule
顶层模块的程序:
module top (
input clk1m, clk2m, clk11m, sysrst_n;
output sysrst1m_n, sysrst2m_n, sysrst11m_n
);
reset_synchronizer rst1m(
.clk (clk1m),
.asyncrst_n (sysrst_n),
.rst_n (sysrst1m_n)
);
reset_synchronizer2 rst2m(
.clk (clk2m),
.d (sysrst1m_n),
.asyncrst_n (sysrst_n),
.rst_n (sysrst2m_n)
);
reset_synchronizer2 rst11m(
.clk (clk1m),
.d (sysrst2m_n),
.asyncrst_n (sysrst_n),
.rst_n (sysrst1m_n)
);
endmodule
4