异步复位同步释放的理解

复位

复位是IC/FPGA设计中常见的操作,通过复位,我们可以使电路中某些寄存器的值为我们指定的一个初始值,从而使得电路能够正常工作。

Removal timing check

复位信号的removal time是指在时钟有效沿来临之后,异步复位信号需要继续保持有效的最短时间。满足这个最短时间才能确保对寄存器进行正常的复位。Removal time check的波形图如下图所示。
在这里插入图片描述

Recovery timing check

recovery time是指在时钟有效沿到来之前,复位信号保持高电平的最短时间。即复位信号变到非复位状态的电平必须在clk之前一定的时间到达。满足这个Recovery time,可以确保在时钟有效沿来临时,异步复位信号处于无效状态,从而确保正常的数据采样。

复位信号的分类

复位一般可以分为同步复位和异步复位。

同步复位

是指复位信号只有在时钟上升沿到来时,才能有效,否则无法完成对系统的复位工作。
RTL描述如下:

always@(posedge clk)
if(~rst_n)
    q<=0;
else
    q<=d;

优点:
1.有利于仿真
2.整个电路都是同步电路,时序分析较为简单,综合得到的时钟频率也较高
3.有利于消除毛刺信号
缺点:
1.复位信号的有效时长必须大于时钟周期,才能真正的被系统识别并完成复位任务。
2.由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,耗费较多的逻辑资源。

异步复位

是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
RTL描述如下:

always@(posedge clk,negedge rst_n)
if(!rst_n)
    q<=0;
else
    q<=d;

优点:
1.大多数的逻辑器件的目标库内的DFF都有异步复位端口,可以节省资源
2.设计相对简单
3.异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口
缺点:
1.在复位信号释放(reset)的时候容易出现问题。具体来说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态
2.复位信号容易受到毛刺的影响。

在大多数情况下,推荐使用异步复位,同步释放的方式。

异步复位,同步释放

异步复位出现亚稳态的问题分析

例子

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、c寄存器的{launch edge –setup,launch edge+hold}时间之外,那么一切都会正常。但如果恰恰相反,rst_n的上升沿出现在了clk上升沿的建立和保持时间区间内,此时clk检测到的rst_n的状态就会是一个亚稳态(是0是1不确定)。如果此时认为rst_n为0,那么b、c依然保持复位清零,而如果认为rst_n为1,那么就跳出复位。因为此时rst_n的不确定性,就可能出现4种情况,即b和c都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成一个系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?为了解决这个问题,一个常见的方法就是采用异步复位,同步释放的机制。

异步复位,同步释放

所谓异步复位,同步释放就是指在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。
在这里插入图片描述
上图即异步复位,同步释放的电路示意图
分析
异步复位
当rst_async_n有效时,第一个D触发器的输出是低电平,第二个D触发器的输出rst_sync_n也是低电平,方框2中的异步复位端口有效,输出被复位。
同步释放
假设rst_async_n撤除时发生在clk上升沿,如果不加此电路则可能发生亚稳态事件。加上此电路以后,假设第一级D触发器clk上升沿时rst_async_n正好撤除,则D触发器1可能输出高电平,也可能输出亚稳态,也可能输出低电平。但此时第二级触发器不会立刻变高,它要么复位为0,要么跟随前一级触发器的输出Q1,而前一级触发器的输出Q1为0,因此,无论如何第二级触发器的输出都为0,而触发器1的输出,若稳定后Q1为1,那么rst_sync_n在下一个周期被拉高,实现同步释放;如果稳定后的Q1为0,那么下个周期rst_sync_n仍为0,但此时由于rst_async_n已经为高,所以Q1在下一个周期必为1,那么rst_sync_n在下一个时钟上升沿到来时被拉高,也实现了同步释放,只是晚了一个周期而已。
下面是异步复位同步释放的RTL代码实现:

always @ (posedge clk, negedge rst_async_n)
if (!rst_async_n) 
begin
    rst_s1 <= 1'b0;
    rst_s2 <= 1'b0;
end
else 
begin
    rst_s1 <= 1'b1;
    rst_s2 <= rst_s1;
end
assign rst_sync_n = rst_s2;
  • 5
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA硅农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值