异步复位,同步释放

复位是为了让芯片电路进入一个已知的、确定的状态,常见的复位方式包括同步复位和异步复位

一、同步复位

1、优点

  • 一般能保证电路是100%同步的
  • 在时钟的有效沿进行复位,时钟可以起到过滤毛刺的作用

2、缺点

  • 复位信号的时长必须要大于一个时钟周期,才能被时钟采样到起到复位系统的作用。
  • 大多数寄存器都自带异步复位端口,采用同步复位的话,会消耗额外的资源。
  • 在低功耗设计中使用门控时钟时,可能会出现问题。
  • 使用同步复位的一个问题是综合工具无法分辨复位信号和其他数据信号。

同步复位可加载触发器的Verilog代码:

module load_syn_ff(clk,in,out,load,rst_n);
input    clk,in,load,rst_n;
output    out;
always@(posedge clk)
    if(!rst_n)
        out <= 1'b0;
    else if(load)
        out <= in;
endmodule

综合出电路如下:                                     也有可能综合处如下电路:

两种图在功能上完全一样,区别仅仅在于复位与门在多路器之外。 对于后面一张图来说,当rst_n信号为低时,能使多路器的两个输入强制为0,如果load是未知状态,这是触发器会停在未知状态,而不会复位,但是这只是在仿真过程中可能出现的问题,实际电路将会正常工作,触发器也会复位到0值。

二、异步复位

1、优点

  • 使用异步复位的最大好处是能保证数据路径上是干净的,能够保证没有任何复位信号加在数据路径上。
  • 最明显的优势是电路不管有没有时钟都能复位。
  • 大多数厂商器件自带异步复位寄存器,可以节省复位端的资源。

2、缺点

  • 在DFT时,如果异步复位信号不能直接被I/O管脚驱动,就必须将异步复位线路与复位驱动器断开保证DFT扫描和测试的正确。
  • 异步复位最大的问题是不管产生或撤销复位信号,都是一个异步过程,产生复位信号不存在问题,但是撤销时就出现了问题,如果异步复位在触发器时钟有效沿附近释放,触发器的输出就会进入亚稳态,因此导致SOC的复位状态丢失。
  • 异步复位的另一个问题与其源头有关,即由板级或系统复位所产生的的噪声或毛刺引发的伪复位,需要设计毛刺过滤器来消除复位电路上毛刺的影响。
  • 异步复位需要确保满足时序要求。

异步复位可加载触发器的Verilog代码:

module load_syn_ff(clk,in,out,load,rst_n);
input    clk,in,load,rst_n;
output    out;
always@(posedge clk or negedge rst_n)
    if(!rst_n)
        out <= 1'b0;
    else if(load)
        out <= in;
endmodule

综合生成的异步复位可加载触发器的硬件电路:

        使用异步复位需要避免亚稳态的产生,即复位如果发生在时钟有效沿左右,不满足recovery time(恢复时间)和removal time(移除时间),如果在时钟的recovery time(恢复时间)和removal time(移除时间)之间的窗口内触发复位信号,都会产生亚稳态。

recovery time(恢复时间):

        如果复位信号在时钟有效沿之前撤销,并且离时钟有效沿非常接近,再加上时钟有效沿的离散性,那么极有可能一部分触发器仍处于复位状态中而对时钟沿没有响应,而一部分触发器有响应,那么从这一时刻开始,电路就开始出错了。

removal time(移除时间):

        如果复位信号在时钟有效沿之后撤销,并且离时间有效沿非常接近,再加上时钟有效沿的离散性,极有可能一部分触发器从复位状态中恢复并响应了时钟,而一部分触发器没有响应,那么从这一时刻开始,电路就开始出错了。

解决的办法:异步复位,同步释放

三、异步复位、同步释放

        异步复位、同步释放是指复位信号产生时不受时钟信号的控制,但是释放的时候受到时钟信号的同步。主要目的是防止复位信号释放时候产生亚稳态。

        异步复位:当复位信号拉低时,直接进入复位状态。

        同步释放:当复位信号释放时,加入两级同步缓存器,电路不会立即释放,而是同步到时钟有效时再进行释放。

module rst_crtl(
    input    clk,
    input    rst_n,
    output   reset
);

reg    rst_n0,rst_n1;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        rst_n0 <= 0;
        rst_n1 <= 0;
    end
    else
    begin
        rst_n0 <= rst_n;
        rst_n1 <= rst_n0;
    end
end

assign reset = rst_n1;

    异步复位、同步释放时序图:   

        

  • 23
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三岁囍

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

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

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

打赏作者

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

抵扣说明:

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

余额充值