一、特点:
   同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用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;

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

三种复位方式: 同步复位、异步复位、异步复位同步释放相关推荐

  1. 三种256MB SPIFLASH的高性能模式和软复位学习笔记

    三种256MB SPIFLASH的高性能模式和软复位学习笔记 WINBONE CONTINUE READ MODE The Fast Read Dual I/O The Fast Read Quad ...

  2. Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

    Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...

  3. OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式,8080并口,IIC,SPI三种驱动方式,采用的单片机是STM32F407. 文章目录 一.OLED驱动原理介绍 二.8080并口驱动方式 三.IIC驱动方式 四. ...

  4. Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    阅读目录 一.MVC与MTV 二.多对多表的创建 三.ajax,前后端传输编码格式contentType 四.批量插入数据与自定义分页器 摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端 ...

  5. 分布式锁简单入门以及三种实现方式介绍(滴滴)

    很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...

  6. 分布式锁简单入门以及三种实现方式介绍_徐刘根的博客-CSDN博客

    原文地址 rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmled ...

  7. 分布式锁简单入门以及三种实现方式介绍

    分布式锁简单入门以及三种实现方式介绍 2018年01月11日 21:16:28 徐刘根 阅读数:37912 标签: 分布式 分布式锁 高并发 更多 个人分类: 集群分布式 版权声明:本文为博主原创文章 ...

  8. SpringBoot Schedule的三种使用方式

    SpringBoot Schedule的三种使用方式 静态schedule 结果图 动态schedule schedule代码 结果图 mapper代码 application.yml文件配置 pom ...

  9. java如何实现定时任务_Java定时任务的三种实现方式

    前言 现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了. 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清 ...

  10. 网桥如何把信号传给服务器,无线网桥传输的三种传输方式

    原标题:无线网桥传输的三种传输方式 无线网桥从字面上来说,就是摒弃了传统的铜线或是光纤的一种无线网络的桥接,利用无线传输方式,以空气作为传输媒介,实现在两个或是多个网络之间建立通信的桥梁,进行网络数据 ...

最新文章

  1. CVPR NTIRE 2022|双目超分辨率挑战赛开赛
  2. 微信小程序eventChannel页面间事件通信通道
  3. python Day5
  4. python requests请求失败重试_Python Requests.post()请求失败时的retry设置
  5. 使用gpio输出驱动蜂鸣器出现破音_探索者 STM32F407 开发板资料连载第七章 蜂鸣器实验...
  6. 2021年宣城市高考成绩查询,宣城高考成绩查询入口
  7. python语言字符串_python中字符串的常见操作方法
  8. 快速了解C#接口(Interface)
  9. OpenGL ES总结(五)OpenGL 中pipeline机制
  10. Vue CLI 3 中文文档
  11. k2p华硕系统怎么设置_【华硕 RT-AC68U 无线路由器使用感受】管理|系统|操作|模式_摘要频道_什么值得买...
  12. 关于Oracle的PARALLEL_MAX_SEVERS参数
  13. 360浏览器查看html文件在哪里,IE/360浏览器无法查看源文件解决方法总结
  14. 脉聊社交网站源码类似微博的社交源码 模板UI非常漂亮自适应手机版 重点是有原生APP
  15. 信号在PCB走线中的延迟
  16. sublime Mac版怎么安装? Mac下载安装sublime的教程
  17. 高等数学基础概念的Python开发实现
  18. 做好多项目管理的十个关键步骤(含工具)
  19. UML的9种图例解析
  20. 软件需求管理(二) 需求获取

热门文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案-第三小题
  2. 2019全国普通高校学科竞赛排行榜发布
  3. 如何搭建VUE开发环境
  4. c++ 图的连通分量是什么_图与图论基本概念(图论算法入门)
  5. 挂载ntfs_运维丨linux如何挂载光盘
  6. 修改 mysql 字符集_如何修改MySQL字符集
  7. java有点_JAVA 有点儿冷
  8. cpu多核 node 单线程_详解node单线程实现高并发原理与node异步I/O
  9. java+c#+json+时间_C#与Json时间的转换
  10. maven 批量docker_Spring Boot 整合 docker