如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转)

本文详细探讨了同步复位与异步复位的特点及其优缺点,并提出了一种结合两者优势的方法——异步复位同步释放。通过具体的Verilog代码示例,帮助读者更好地理解这两种复位方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、特点:
   同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用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、复位信号容易受到毛刺的影响。
三、总结:
    所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。

always @(posedge clk or negedge rst_n)

         if(!rst_n) b <= 1'b0;

         else b <= a;

如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转) - 辉 - 接着飘

我们可以看到FPGA的寄存器都有一个异步的清零端(CLR),在异步复位的设计中这个端口一般就是接低电平有效的复位信号rst_n。即使说你的设计中是高电平复位,那么实际综合后会把你的复位信号反向后接这个CLR端。

一个简单的异步复位的例子

always @ (posedge clk or negedge rst_n)

         if(!rst_n) b <= 1'b0;

         else b <= a;

我们可以看到FPGA的寄存器都有一个异步的清零端(CLR),在异步复位的设计中这个端口一般就是接低电平有效的复位信号rst_n。即使说你的设计中是高电平复位,那么实际综合后会把你的复位信号反向后接这个CLR端。

一个简单的同步复位的例子

always @ (posedge clk)

         if(!rst_n) b <= 1'b0;

         else b <= a;

如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转) - 辉 - 接着飘

         和异步复位相比,同步复位没有用上寄存器的CLR端口,综合出来的实际电路只是把复位信号rst_n作为了输入逻辑的使能信号。那么,这样的同步复位势必会额外增加FPGA内部的资源消耗。

       那么同步复位和异步复位到底孰优孰劣呢?

       只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患,特权同学过去从没有意识到也没有见识过。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。

   再看下面一个两级寄存器异步复位的例子

always @ (posedge clk or negedge rst_n)

         if(!rst_n) b <= 1'b0;

         else b <= a;

       

always @ (posedge clk or negedge rst_n)

         if(!rst_n) c <= 1'b0;

         else c <= b;     

如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转) - 辉 - 接着飘

         正常情况下,clk的上升沿c更新为b,b更新为a。一旦进入复位,b,c都清零;但是我们不能确定复位信号rst_n会在什么时候结束。如果结束于b_reg0和c_reg0的{launch edge –stup,launch edge+hold}时间只外,那么一切都会正常。但如果恰恰相反,会出现什么情况呢? rst_n的上升变化出现在了clk上升的建立保持时间上,此时clk检测到的rst_n的状态就会是一个亚稳态(是0是1不确定)。从代码里我们看到如果此时b_reg0和c_reg0认为rst_n为0,那么依然保持复位清零,而如果认为rst_n为1,那么就跳出复位。因为此时的rst_n的不确定性,就可能出现4种情况,即b_reg0和c_reg0都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成了系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?

       上面的分析似乎都让人意识到同步复位和异步复位都不可靠,那么如何将两者结合,取长补短呢。

       异步复位、同步释放

always @ (posedge clk)

         rst_nr <= rst_n;                 //现将异步复位信号用同步时钟打一拍

always @ (posedge clk or negedge rst_nr)

         if(!rst_nr) b <= 1'b0;

         else b <= a;

       

always @ (posedge clk or negedge rst_nr)

         if(!rst_nr) c <= 1'b0;

         else c <= b;     

如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转) - 辉 - 接着飘

         如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。


### 与非门复位机制中的异步复位同步复位区别 #### 异步复位的工作原理 在带有复位端的D触发器中,当`reset`信号有效时,该信号可以直接驱动最后一级的与非门,使得输出端`Q`被立即设置为指定的状态(通常是低电平),而不受时钟信号的影响。这种特性允许系统快速进入已知状态,而无需等待下一个时钟边沿到来[^5]。 对于异步复位而言,在实际应用中可能会遇到一个问题:如果复位解除发生在时钟周期的关键窗口期内,则可能导致亚稳态现象的发生——即系统的输出未能稳定在一个确定的状态上。这是因为此时的数据路径与时序关系变得不确定,从而影响到后续逻辑操作的结果[^4]。 #### 同步复位的特点 相比之下,同步复位则是在时钟脉冲的作用下完成整个过程。这意味着只有当时钟到达特定边缘(比如上升沿)并且复位请求已经准备好之后才会执行相应的动作;在此之前即使有新的复位指令也不会立刻生效。这种方式可以更好地控制时序并减少由于外部干扰引起的错误风险,但也意味着响应速度相对较慢一些,因为它依赖于固定的时基来进行切换[^3]。 #### 设计考虑及实现方式 为了克服单独使用任一类型的局限性,实践中常常采用“异步复位同步释放”的策略来构建更可靠的电路结构。这类方案利用两个连续工作的D型触发器组成缓冲链路,其中第一个元件接收来自外部源提供的原始复位命令,并将其传递给第二个单元作为最终确认标志。通过这种方法不仅能够迅速启动初始化流程而且还能确保安全退出条件下的稳定性[^2]。 ```verilog module async_reset_sync_release ( input wire clk, input wire rst_n, // Active low asynchronous reset signal output reg q_out ); always @(posedge clk or negedge rst_n) begin : proc_q_out if (!rst_n) q_out <= 1'b0; else // Normal operation logic here... end // Second stage of synchronization to avoid metastability on release. reg internal_rst; always @(posedge clk or negedge rst_n) begin : proc_internal_rst if (!rst_n) internal_rst <= 1'b1; // Set high during active reset phase else internal_rst <= 1'b0; // Clear after clock edge following deactivation of rst_n end endmodule ``` 上述Verilog代码展示了如何创建一个具有异步复位功能但在撤销阶段采取同步处理措施的基本模块实例。这里定义了一个名为`async_reset_sync_release` 的实体,它接受时钟(`clk`) 和负极性的重置输入 (`rst_n`) ,并通过两层触发器实现了所描述的功能[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值