1.一个简单的异步复位例子:

module test(
  input clk,
  input rst_n,
  input data_in,
  output reg out
); always@(posedge clk or negedge rst_n)
  if(!rst_n)
    out <= ;
  else
    out <= data_in; endmodule

综合结果如下:

我们可以看到,FPGA的寄存器都有一个异步清零端(CLR),在异步复位设计中,低电平有效的rst_n复位信号就可以直接连在这个端口上。(如果是高有效的复位,综合时会把它取反后接在这个端口上)

 2.一个同步复位的例子:

module test(
  input clk,
  input rst_n,
  input data_in,
  output reg out
); always@(posedge clk)
  if(!rst_n)
    out <= ;
  else
    out <= data_in; endmodule

综合结果如下:

我们可以看到,该电路中没有用到寄存器的CLR端,而是把rst_n复位信号作为输入逻辑的使能信号,那么这样的同步复位势必会额外增加FPGA内部的资源消耗。

3.那么,同步复位和异步复位到底孰优孰劣?

  实际上,同步复位和异步复位各有千秋。

  对于同步复位:

    优点:只在时钟上升沿(或下降沿)判断系统复位是否出现,降低了亚稳态的概率;

    缺点:就是之前说过的,额外增加了资源消耗;

  对于异步复位,它的优缺点刚好和同步复位相反。这里举个例子来说明异步复位带来的亚稳态问题:

module test(
input clk,
input rst_n,
input a,
output reg c
); reg b;
always@(posedge clk or negedge rst_n)
if(!rst_n) begin
b <= 'b0;
c <= 'b0;
end
else begin
b <= a;
c <= b;
end endmodule

综合结果如下:

  正常情况下,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都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成了系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?

4.如何兼顾它们俩的优点,同时避免它们的缺点?

  答案是:异步复位,同步释放!

module test(
  input clk,
  input rst_n,
  input a,
  output reg c
); reg b,rst_nr;
always@(posedge clk)
rst_nr <= rst_n; always@(posedge clk or negedge rst_nr)
if(!rst_nr) begin
        b <= 'b0;
        c <= 'b0;
      end
     else begin
       b <= a;
       c <= b;
     end endmodule

综合结果如下:

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

5.最终的改进型终极异步复位、同步释放电路

代码如下:

module test (
  input clk,
  input rst_n,
  output reg rst_out
);
reg R1; always@(posedge clk or negedge rst_n)
  if(!rst_n) begin
    R1 <= 'b0;
    rst_out <= 'b0;
  end
  else begin
    R1 <= 'b1; //这里写成1,而不写成rst_n,是因为根据实际综合效果来看,这样做更节省资源,具体原因参考同步复位
    rst_out <= R1;
  end
//可选
//wire rst_o;
//assign rst_o = rst_out;
endmodule

综合结果如下:(这个例子只是单纯的复位电路,没有功能电路

  加上此复位电路以后,假设第一级D触发器clk上升沿时rst_n正好撤除,则D触发器1输出高电平“1”,此时第二级触发器也会更新输出,但是输出值为前一级触发器次clk来之前时的Q1输出状态。显然Q1之前为低电平,顾第二级触发器输出rst_out保持复位低电平,直到下一个clk来之后,才随着变为高电平。即同步释放。

只做一级触发器来同步,效果如何?

  第一级触发器的输出,永远存在亚稳态的可能。亚稳态导致系统不会复位初始化到已知状态。 
  当第一级触发器采样异步输入之后,允许输出出现的亚稳态可以长达一个周期,在这个周期内,亚稳态特性减弱。在第二个时钟沿到来时,第二级同步器采样,之后才把该信号传递到内部逻辑中去。第二级输出是稳定且已被同步了的。如果在第二级采样时保持时间不够,第一级的输出仍然处于很强的亚稳态,将会导致第二级同步器也进入亚稳态,但这种故障出现的概率比较小。

  一般情况下,两级同步器总体的故障概率是一级同步器故障概率的平方。在大部分的同步化设计中,两级同步器足以消除所有可能的亚稳态了。

两级触发器做同步,是非总线信号的最常见异步处理方法。总线信号的异步处理方法,最常见的是异步fifo实现。

6.那么,到底什么情况下需要做“异步复位、同步释放”处理?

答案:一般来说,同步系统,都使用异步复位。这是因为同步复位的电路实现,比异步复位的电路实现,要浪费更多电路资源。

  未在本模块时钟域做过“异步复位,同步释放”处理的复位信号,提供给本模块做异步复位使用时,都需要做“异步复位,同步释放”处理。常见于系统内两部件不在同一时钟域的情况下。

  工程实践中,确实见过由于未做异步复位的同步处理,而出现大概率系统死机现象(复位的作用域是很大的)。

  通常对异步复位电路的时序分析称为 恢复时间检查和移除时间检查

想了解更多,可以参考该链接http://www.eefocus.com/coyoo/blog/13-12/301045_9c39f.html

FPGA设计中的异步复位、同步释放思想的更多相关文章

  1. FPGA设计中的复位

    (1)异步复位与同步复位的写法 1.异步复位与同步复位的区别? 同步复位:若复位信号在时钟有效边沿到来时刻为有效,则执行一次复位操作. 优点: 1)同步复位是离散的,所以非常有利于仿真器的仿真: 2) ...

  2. 影响FPGA设计中时钟因素的探讨。。。转

    http://www.fpga.com.cn/advance/skill/speed.htm http://www.fpga.com.cn/advance/skill/design_skill3.ht ...

  3. FPGA设计中遇到的奇葩问题之“芯片也要看出身”

    FPGA设计中遇到的奇葩问题之“芯片也要看出身”(一) 昨夜西风凋碧树.独上高楼,望尽天涯路 2000年的时候,做设计基本都是使用Xilinx公司的Virtex和Virtex-E系列芯片.那时候Alt ...

  4. 简单的node爬虫练手,循环中的异步转同步

    简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...

  5. C#中的异步和同步

    同步 同步(英语:Synchronization [ˌsɪŋkrənaɪ'zeɪʃn]),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象.说白了就是多个任务一 ...

  6. FPGA设计中的电源管理(转载)

    过去,FPGA设计者主要关心时序和面积使用率问题.但随着FPGA不断取代ASSP和ASIC器件,设计者们现正期望能够开发低功耗设计,在设计流程早期就能对功耗进行正确估算,以及管理和对与FPGA相关的各 ...

  7. 5.防止FPGA设计中综合后的信号被优化

    随着FPGA设计复杂程度越来越高,芯片内部逻辑分析功能显得越来越重要.硬件层次上的逻辑分析仪价格十分昂贵,而且操作比较复杂.目前,FPGA芯片的两大供应商都为自己的FPGA芯片提供了软件层面上的逻辑分 ...

  8. js中的异步与同步,解决由异步引起的问题

    之前在项目中遇到过好多次因为异步引起的变量没有值,所以意识到了认识js中同步与异步机制的重要性 在单线程的js中,异步代码会被放入一个事件队列,等到所有其他代码执行后再执行,而不会阻塞线程. 下面是j ...

  9. FPGA设计中的float

    在通常的设计中,不建议使用浮点数计算,因为浮点数计算会消耗FPGA大量的逻辑单元.但很多情况下,又需要使用浮点数进行计算提高精度. 所以需要有合适的方法计算浮点运算. 正常情况下FPGA只能以整形数据 ...

随机推荐

  1. ABBYY OCR技术教电脑阅读缅甸语(上)

    缅甸联邦共和国,原名缅甸,是东南亚的一个国家,从1962年到2010年,缅甸一直被政变后上台的军政府统治,直至最近5年它才对外界开放,与其他国家建立了贸易与文化联系. 缅甸语由很多方言组成,但所有方言 ...

  2. 【Docker】文件拷贝

    从容器复制到主机sudo docker cp containerID:container_path host_path docker cp 5c6ce895b979:/root/LearnPaddle ...

  3. Fidder

    第一步:下载Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler 打开Fiddler, Tools ...

  4. 服务器中了蠕虫病毒Wannamine2.0小记

    近期用户反馈某台服务器总感觉性能不是很好存在卡顿,于是今天远程上去分析. 打开任务管理器发现CPU使用率非常低,内存使用也在接受范围内(10/64G).不过我有一个偏好就是不喜欢用系统自带的任务管理器 ...

  5. H - An Easy Problem?!

    来源 poj2826 It's raining outside. Farmer Johnson's bull Ben wants some rain to water his flowers. Ben ...

  6. Slapper帮助Dapper实现一对多

    Dapper的Query的方法提供了多个泛型重载可以帮助我们实现导航属性的查询 1对1 public class Employees4List { public int Id { get; set; ...

  7. Analytics.js简介

    analytics.js JavaScript代码段是一种可用于衡量用户与您网站的互动情况的全新方式.它与之前的跟踪代码ga.js类似,但为开发者自定义实现方案提供了更大的灵活性. analytics ...

  8. 温故KMP算法

    最近由于某些原因,又回顾了一次KMP算法.上一次回顾KMP算法还是在刷题的时候遇到的: http://blog.csdn.net/dacc123/article/details/50994611 在我 ...

  9. ==、===和Object.is()的区别

    ==.===和Object.is()的区别 一. 定义: ==:等同,比较运算符,两边值类型不同的时候,先进行类型转换,再比较: ===:恒等,严格比较运算符,不做类型转换,类型不同就是不等: Obj ...

  10. zabbix客户端自动注册

    1. 概述 上一篇内容<zabbix自动发现配置>,大概内容是zabbix server去扫描一个网段,把在线的主机添加到Host列表中.我们本篇内容与上篇相反,这次是Active age ...