1、复位的重要性

数字电路中寄存器和 RAM 在上电之后默认的状态和数据是不确定的,如果有复位,我们可以把寄存器 复位到初始状态 0,RAM 的数据可以通过复位来触发 RAM 初始化到全 0。那可能很多人会问为什么是全 0呢?其实一般逻辑起始都是从 0 开始变化的,这个是根据设计的需要设定的一个值,如果设计需要寄存器 上电复位为 1,也是可以的。还有一种情况是逻辑进入了错误的状态,通过复位可以把所有的逻辑状态恢复 到初始值,如果没有复位,那么逻辑可能永远运行在错误的状态。

因此复位功能是很重要的一个功能。数字电路的复位通常可分为:同步复位与异步复位。

2、同步复位

同步复位:同步复位指的是当时钟上升沿检测(有效沿)到复位信号,执行复位操作,有效的时钟沿是前提。

Verilog代码:

//*******************同步复位模块**************************//-----------端口定义-------------------------------
module  rst_test(input      clk     ,   //工作时钟input     rst_n   ,   //复位,低电平有效input      in      ,   //输入信号output    reg out         //输出信号
);
//-----------输出模块-------------------------------
always@(posedge clk )beginif(!rst_n)out <= 1'b0;      //复位将输出置零elseout <= in;         //其他时候将输入赋值给输出
end endmodule

使用Quartus II综合出的RTL如下:

可以看到,生成的触发器并没有复位置位端,而是生成了一个选择器,同步复位信号rst_n用作了选择器的使能,从而实现复位清零的作用。

用如下Testbench进行仿真(复位时间不足一个时钟周期、复位时间超过一个时钟周期、一个高频复位毛刺):

//------------------------------------------------
//--同步复位仿真
//------------------------------------------------
`timescale 1ns/1ns //时间单位/精度//------------<模块及端口声明>----------------------------------------
module tb_rst_test();reg    clk     ;
reg     rst_n   ;
reg     in      ;wire   out     ;//------------<例化被测试模块>----------------------------------------
rst_test    rst_test_inst(.clk  (clk)   ,.rst_n (rst_n) ,.in        (in)    ,.out    (out)
);//------------<设置初始测试条件>----------------------------------------
initial beginclk = 1'b0;                  rst_n <= 1'b0;in <= 1'b1;#5                           rst_n <= 1'b1;#6                           rst_n <= 1'b0; #18                         rst_n <= 1'b1;#39                          rst_n <= 1'b0;#21                          rst_n <= 1'b1;#25                          rst_n <= 1'b0;#3                           rst_n <= 1'b1; end
//------------<设置时钟>----------------------------------------------
always #10 clk = ~clk;     //系统时钟周期20nsendmodule

仿真结果如下:

从仿真结果可以看到:

  • 第1个复位时间不足一个时钟周期,导致复位不成功
  • 第2个复位时间超过一个时钟周期,复位成功
  • 最后一个复位信号上的高频毛刺信号没有对系统造成误复位
  • 输出信号在第一个时钟上升沿到来之前是未知状态

同步复位电路的优点:

  • 有利于仿真器的仿真
  • 基本上没有亚稳态问题
  • 可以使所设计的系统成为 100%的同步时序电路,有利于时序分析
  • 由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺

同步复位电路的缺点:

  • 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑延时因素
  • 大多数的FPGA的DFF都只有异步复位端口,采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样会耗费逻辑资源

3、异步复位

异步复位:异步复位指的是无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。当时钟上升沿检测到复位信号,执行复位操作。

Verilog代码:

//*******************同步复位模块**************************//-----------端口定义-------------------------------
module  rst_test(input      clk     ,   //工作时钟input     rst_n   ,   //复位,低电平有效input      in      ,   //输入信号output    reg out         //输出信号
);
//-----------输出模块-------------------------------
always@(posedge clk or negedge rst_n)beginif(!rst_n)out <= 1'b0;      //复位将输出置零elseout <= in;         //其他时候将输入赋值给输出
end endmodule

使用Quartus II综合出的RTL如下:

可以看到,异步复位信号rst_n直接接入了触发器的异步复位端,从而实现复位清零的作用。

依然使用之前用的Testbench进行仿真,结果如下:

从仿真结果可以看到:

  • 只要复位信号被置为低电平,就执行复位操作,与时钟无关
  • 高频毛刺信号会对系统造成误复位
  • 在不考虑亚稳态的前提下,复位时间没有要求

a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
       b、复位信号容易受到毛刺的影响

异步复位电路的优点:

  • 大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源
  • 设计相对简单,异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR

异步复位电路的缺点:

  • 复位信号容易受到毛刺的影响
  • 因为是异步逻辑,无法避免地存在亚稳态问题(FPGA基础知识之11----“打拍(寄存)”和“亚稳态” 到底是什么?)

关于异步复位还需要考虑:

恢复时间(Recovery Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。

去除时间(Removal)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。

换句话来说,如果你想让某个时钟沿起作用,那么你就应该在“恢复时间”之前是异步控制信号变无效,如果你想让某个时钟沿不起作用,那么你就应该在“去除时间”过后使控制信号变无效。如果你的控制信号在这两种情况之间,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。而这些情况是应该避免的。所以恢复时间和去除时间是应该遵守的。

4、异步复位、同步释放

结合两种复位的优点,可以使用异步复位、同步释放设计,Verilog代码如下:

//*******************同步复位模块**************************//-----------端口定义-------------------------------
module  rst_test(input      clk     ,       //工作时钟input     rst_n   ,       //复位,低电平有效input      in      ,       //输入信号output    reg out             //输出信号
);
//-----------reg定义-------------------------------
reg arst_n_r;
reg arst_n;
//-----------复位信号同步模块-------------------------------
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginarst_n_r <= 1'b0 ;   //复位将输出置零arst_n <= 1'b0        ;   //复位将输出置零   endelse beginarst_n_r <= 1'b1  ;   //跟接rst_n是一样的,都是逻辑1arst_n <= arst_n_r    ;       end
end
//-----------输出模块-------------------------------
always@(posedge clk or negedge arst_n)beginif(!arst_n)out <= 1'b0;            //复位将输出置零elseout <= in;             //其他时候将输入赋值给输出
end endmodule

综合出来的RTL视图:

实际的电路图如下:

复位信号 rst_sync_n 由高拉低时实现 y 寄存器的异步复位。同步释放,这个是关键,即当复位信号 rst_async_n 撤除时(由低拉高),由于双缓冲电路(双触发器)的作用,rst_sync_n 不会随着rst_async_n 的 撤除而撤除。假设 rst_async_n 撤除时发生在 clk 上升沿,如果不加此电路则可能发生亚稳态事件,但是加上此电路以后,假设第一级 D 触发器 clk 上升沿时 rst_async_n 正好撤除,(第一个 DFF 此时是处于亚稳态 的;假设此时识别到高电平;若是识别到低电平,则增加一个 Delay)则 DFF1 输出高电平,此时第二级触发器也会更新输出,但是输出值为前一级触发器 clk 来之前时的 Q1 输出状态,显然 Q1 之前为低电平,所以第二级触发器输出保持复位低电平,直到下一个 clk 来之后,才随着变为高电平,即同步释放。

使用如下Testbench进行仿真:

//------------------------------------------------
//--同步复位仿真
//------------------------------------------------
`timescale 1ns/1ns //时间单位/精度//------------<模块及端口声明>----------------------------------------
module tb_rst_test();reg    clk     ;
reg     rst_n   ;
reg     in      ;wire   out     ;//------------<例化被测试模块>----------------------------------------
rst_test    rst_test_inst(.clk  (clk)   ,.rst_n (rst_n) ,.in        (in)    ,.out    (out)
);//------------<设置初始测试条件>----------------------------------------
initial beginclk = 1'b0;                  rst_n <= 1'b0;in <= 1'b1;#25                          rst_n <= 1'b1;#6                           rst_n <= 1'b1; #18                         rst_n <= 1'b1;#39                          rst_n <= 1'b0;#21                          rst_n <= 1'b1;
end
//------------<设置时钟>----------------------------------------------
always #10 clk = ~clk;     //系统时钟周期20nsendmodule

仿真结果如下:

可以看到:复位是异步进行的,一旦复位信号为低电平,则输出复位,而复位的撤除则被同步到了时钟域下。如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。

5、参考

正点原子逻辑设计指南--正点原子

【 FPGA 】稳态与亚稳态小结

异步复位,同步释放的理解

FPGA同步复位、异步复位、异步复位同步释放相关推荐

  1. HDLBITS笔记23:触发器的基础练习(同步清零、异步清零、复位端、字节使能等)

    题目1: D触发器是一种电路,它存储位并定期更新,位于时钟信号的(通常)正边. D 触发器在使用时钟始终块时由逻辑合成器创建(请参见始终阻止2).D触发器是最简单的"组合逻辑后跟触发器的斑点 ...

  2. FPGA之道(50)复位的设计

    文章目录 前言 复位的设计 为什么FPGA设计中要有复位 复位方式的分类 同步复位 异步复位 复位的设计方法 同步信号同步复位 同步信号异步复位 异步信号同步复位 异步信号异步复位 复位高扇出的解决方 ...

  3. FPGA 之 时钟,时钟域, 以及复位系统的设计

    FPGA时钟和时钟域 时钟树 所谓时钟树为FPGA内部资源, 分 : 全局时钟树, 区域时钟树 , IO时钟树 原则上优先使用全局时钟树, 在GT接口上使用IO时钟树, 一般工具也会对GT时钟加以限制 ...

  4. 怎么样理解同步清零和异步清零?

    DA专业论坛 »  通用设计 » [求助] 大家是怎么样理解 同步清零和 异步清零的?? 查看完整版本: [求助] 大家是怎么样理解同步清零和异步清零的?? mxflying 2005-4-20 03 ...

  5. 为什么在 Verilog HDL 设计中一定要用同步而不能用异步时序逻辑?

    本博文内容来源于:<从算法设计到硬件逻辑的实现>,仅供学习交流使用! 同步时序逻辑是指表示状态的寄存器组的值只可能在唯一确定的触发条件发生时刻改变.只能由时钟的正跳沿或负跳沿触发的状态机就 ...

  6. 同步时序逻辑与异步时序逻辑

    同步时序逻辑: 是指表示状态的寄存器组的值只可能在唯一确定的触发条件发生时刻改变.只能由时钟的正跳沿或负跳沿触发的状态机就是一例. always @(posedge clock) 就是一个同步时序逻辑 ...

  7. STM32如何计算RTC时钟异步预分频和同步预分频

    实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器,提供具有可编程闹钟中断功能的日历时钟/日历,可用于管理所有低功耗模式的自动唤醒单元.在配置RTC时钟时预分频器是关键指标,通过配置预分频器可 ...

  8. 关于同步加载与异步加载的区别

    关于同步加载与异步加载的区别 同步加载:同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行. 异步加载:异步加载又叫非阻塞,浏览器在下 ...

  9. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  10. 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

最新文章

  1. C语言中连续调用rand函数,返回值不变
  2. httpd关于php
  3. 贴现率 vs 折现率
  4. gentoo 安装opencv
  5. 关于内存管理-提前释放的问题
  6. iOS - 利用 UIBezierPath 绘制圆弧
  7. Spring学习总结(一)——Spring实现IoC的多种方式
  8. 如何准备电赛?19年电赛经验总结!
  9. const int是什么类型_C++的const语义
  10. Arrays工具类和二维数组
  11. segment段,setjmp和longjmp
  12. Asp.net Mvc+MongoDB+Autofac等打造轻量级blog系统(二)
  13. animation动画不生效_css animation不动怎么办
  14. 你是否知到西游记中孙悟空的师傅是什么人?
  15. python的元组是否能重复_python – 在带有元组的列表列表中查找重复项
  16. 徐志摩《翡冷翠的一夜》
  17. Git 备份 Hexo 博客
  18. (转)RMAN-06004: 恢复目录数据库发生 ORACLE 错误: RMAN-20005: target database name is ambiguous
  19. 中国人工智能学会公布首批会士名单,共计53名产业领军人物当选
  20. 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测总结

热门文章

  1. Scala-Day13
  2. 安卓应用加固壳判断java厂商_使用frida来hook加固的Android应用的java层
  3. 手机开发APP整体界面设计工具之墨刀---没用过就知道它很牛掰
  4. 虚拟机无法重启服务器,windows2019虚拟机管理服务无法启动
  5. ibatis的isequal_ibatIS中的isNotNull、isEqual、isEmpty
  6. 利用多线程中线程休眠----sleep实现简单的计时器以及时钟功能
  7. 三 国外IP核主要竞争对手
  8. 运维屌丝回答网传Linux运维面试题(一)
  9. 落枕了睡觉还枕枕头吗_兄弟,你还枕头吗?
  10. Spark 学习笔记——001【spark-mysql+spark-hive】