原文地址 : http://blog.163.com/qingyu_1984/blog/static/1444145032012620112858498/
一、介绍:
同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:
always @ (posedge clk) begin
if (!Rst_n)
...
end
异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:
always @ (posedge clk,negedge Rst_n) begin
if (!Rst_n)
...
end
二、各自的优缺点:
1、总的来说,同步复位的优点大概有3条:
a、有利于仿真器的仿真。
b、可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。
c、因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
其缺点也有不少,主要有以下几条:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合 逻辑路径延时,复位延时等因素。
b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的 数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
2、对于异步复位来说,他的优点也有三条,都是相对应的:
a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
b、设计相对简单。
c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
缺点:
a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄 存器输出出现亚稳态,从而导致亚稳态。
b、复位信号容易受到毛刺的影响。
三、总结:
所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。
**********************************************异步复位,同步释放****************************************
以前从来没有对FPGA的复位可靠性关注过,想当然的认为应该不会有什么问题。当问题真正出在复位上的时候,才又仔细地对FPGA的复位深入的了解了一下。首先我们用的复位管脚不是FPGA的全局管脚,并且复位信号上没有上拉电阻,容易受到干扰而产生毛刺,这对异步复位是相当有害的。其次,我在FPGA内部对复位的处理过于简单。
今天在网上看了一些资料,很多是关于同步和异步复位的优缺点比较。由于我在FPGA内部用的是异步复位,所以主要看了一下异步复位的缺点:1)复位信号在时钟有效沿或其附近释放时,容易使寄存器或触发器进入亚稳态;2)容易受到毛刺的影响;3)难以仿真,难以进行静态时序分析。上面的前两条应该对我来说是影响最重要的,而第三条说老实话,我还没有到哪个阶层(嘿嘿)
异步复位,同步释放——就可以消除上面的前两条缺点。所谓异步复位,同步释放就是在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。通过一个复位信号综合器就可以实现异步复位,同步释放。下面是一个复位信号综合器的VHDL描述:
Designer: skycanny
-- Date:2007-1-27
-- Discription: Reset Synthesizer
Library ieee;
Use ieee.std_logic_1164.all;
Entity Rst_Synth is
Port
(
Clk : in std_logic;
Arst : in std_logic;
Rst_n : out std_logic
);
End entity Rst_Synth;
Architecture RTL of Rst_Synth is
Signal dff : std_logic;
Begin
Process(Arst ,Clk )
Begin
If Arst = ‘0 then
Dff <= ‘0’;
Rst_n <= ‘0’;
Elsif Clk’envent and Clk = ‘1’ then
Dff <= ‘1’;
Rst_n <= Dff;
End if;
End process;
End RTL;
这里提供给系统的复位信号RST_n只有当其复位输入端Arst = ‘1’且时钟脉冲Clk上升沿来临时才会置1,
才将复位信号释放,实现同步释放的作用。 ——zhengjw2012.10.18
(假设不这样做,当触发器的复位信号置1时刻和其时钟信号的上升沿时刻很接近时,会造成此时触发器的
信号建立时间setup_time很短,造成亚稳态)。
使用复位信号综合器可以很好地将同步和异步复位的优点结合起来,而消除他们缺点。因此在FPGA/CPLD的逻辑设计中可以很好的提高复位的可靠性,从而保证电路工作的稳定可靠性。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PS : 自己习惯使用Verilog ,把原文的VHDL代码改成VerilogHDL后,异步复位同步释放,代码如下:
module rst_n_ctrl_module
(
input clk ,
input rst_n , // outside reset
output sys_rst_n // system reset
) ;
reg rst_n_r1 ,rst_n_r2 ;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
rst_n_r1 <= 1'b0 ;
rst_n_r1 <= 1'b0 ;
end
else begin
rst_n_r1 <= 1'b1 ;
rst_n_r2 <= rst_n_r1
end
end
assign sys_rst_n = rst_n_r2 ;
endmodule
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////