复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)

文章目录

  • 背景
  • 前言
  • 一、复位信号的同步与释放
    • 1.1 ··· 同步复位
      • 1.1.1 ··· 综述
      • 1.1.2 ··· 优缺点
    • 1.2 ··· recovery time和removal time
    • 1.3 ··· 异步复位
      • 1.3.1 ··· 综述
      • 1.3.2 ··· 优缺点
    • 1.4 ··· 同步复位 与 异步复位
    • 1.5 ··· 异步复位、同步释放
      • 1.5.1 ··· 总述
      • 1.5.2 ··· 机理
      • 1.5.3 ··· 复位网络
  • 二、思考与补充
    • 2.1 ··· 复位信号是否被需要
    • 2.2 ··· 关于第一级触发器的数据端口
    • 2.3 ··· 第二个dff是否存在亚稳态
    • 2.4 ··· 异步复位去毛刺
    • 2.5 ··· PLL配置后的复位设计
    • 2.6 ··· 复位的消耗的资源比你想象的要多
  • 参考文献


说明1:在查阅相关资料过程中,发现一些关于有趣的知识点,本文有尝试对其进行整合,力求详尽。
说明2:如果文章有误,欢迎大家指出、讨论,笔者也会积极改正,希望大家一起进步!


背景

笔者前一阵子在写Verilog代码时,关于rst_N信号,用的是如下片段。

input Clk;
input rst_N;
reg rst_N_d;
always @(posedge Clk or negedge rst_N) beginif (!rst_N) beginrst_N_d <= 1'b0;end else beginrst_N_d <= 1'b1;end
end
// 将rst_N_d作为整个工程的复位信号,接到顶层模块下面的各个子模块中。

但是,实际将代码下载到开发板后,发现将输入信号rst_N反复置0、置1切换时,输出的效果相比于预期效果,不是很稳定,百思不得其解。随后,一个经验丰富的大佬告诉我,可以考虑异步复位、同步释放的方式来控制所有子模块的rst_N_d 信号,如下所示。

input Clk;
input rst_N;
reg rst_N_d1,rst_N_d2;
always @(posedge Clk or negedge rst_N)if (!rst_N) beginrst_N_d1 <= 1'b0;rst_N_d2 <= 1'b0;end else beginrst_N_d1 <= 1'b1;rst_N_d2 <= rst_N_d1;
end
// 将rst_N_d2作为整个工程的复位信号,接到顶层模块下面的各个子模块中。

改完后,发现代码下载到开发板后的效果比较不错,稳定了很多。
基于此,考虑到自身学FPGA是野路子,决定好好研究一下同步与释放,记作此文。

前言

  • 复位的作用:
    可以使代码或者是器件恢复到一个已知、确定的状态,如初始状态;
    可以寄存器、计数器等内部的数据置为预设的值。

  • 复位的目的:
    1、通过控制复位信号,确保电路从已知的初始状态开始运行。
    2、通过控制复位信号,使电路从某个错误状态回到已知状态。

  • 在FPGA设计中,复位信号的同步与释放是确保系统稳定性和可靠性的关键。几种常见的复位信号,如下:
    1、同步复位
    2、异步复位
    3、异步复位、同步释放

  • 关于触发器,已在前文《7系列 之 存储单元(Storage Elements)》中有过介绍,诸位道友可点击链接进行传送。

  • 本文所查看得RTL、Synthesis视图,是基于xc7a100tfgg676-2 (active)进行的。

一、复位信号的同步与释放

1.1 ··· 同步复位

1.1.1 ··· 综述

  • 诸位道友经常提及的 同步复位 ,
    即同步复位、同步释放,Synchronous Reset and Synchronous Release。

  • 复位信号的复位、释放都是与时钟信号同步进行的,
    这意味着,复位信号的变化只在特定的时钟边沿(通常是上升沿)发生。

  • Verilog代码,如下:

input Clk;
input rst_N;
reg rst_N_d;
always @(posedge Clk ) beginif (!rst_N) beginrst_N_d <= 1'b0;end else beginrst_N_d <= 1'b1;end
end
  • 其RTL视图为:
    在这里插入图片描述
  • 其综合后的电路为:
    在这里插入图片描述
    从RTL视图来看,同步复位的代码过程就是一次触发器过程。
    而其综合的结果为,FDRE。
    注:FDRE,为Xilinx的触发器的Primitive之一;功能描述为:同步使能、同步复位。

1.1.2 ··· 优缺点

  • 优点:
    1、复位、释放操作是在时钟边沿同步进行的,因此可以确保所有的寄存器和逻辑单元在同一个时钟周期内被正确地复位、释放,从而给了寄存器足够的时间来稳定状态来减少复位信号引起的亚稳态问题、避免了由于复位信号不同步导致的时序不确定性。
    2、同步复位使得电路是同步的,可使静态时序分析更加简单,减少时序分析难度。

  • 缺点:
    1、采用同步复位,需要在数据输入端增加组合逻辑,消耗额外的逻辑资源;
    在这里插入图片描述2、同步复位比较依赖于时钟信号,且复位信号的脉冲宽度必须要大于一个时钟周期,才能确保同步复位。
    3、如下图所示,博文《异步复位 & 同步释放》在同步复位的缺点中提及到:“一些三态总线的初始化过程中,要求最好异步复位。”。在这里插入图片描述
    4、当复位信号的撤销时间在建立时间和保持时间以内时,也会产生亚稳态。

1.2 ··· recovery time和removal time

信号的本身不稳定、或者信号采样时刻不确定,都可能会带来亚稳态。

在同步电路中,输入数据需要与时钟满足setup time和hold time才能进行数据的正常传输,防止亚稳态。同样的道理,对于一个异步复位寄存器来说,异步复位信号同样需要和时钟满足recovery time和removal time 才能有效进行复位操作和复位释放操作,防止输出亚稳态。(《异步复位和同步释放》)

  • recovery time(恢复时间),指撤销复位状态时,在时钟有效沿来临之前,复位信号保持无效电平的最短时间,即复位释放与下一个时钟有效沿之间需要间隔的最小时间,类似于setup time。
  • removal time(去除时间),指进入复位状态时,在时钟有效沿来临之后,复位信号保持有效电平的最短时间,即复位信号与上一个时钟有效沿之间需要间隔的最小时间,类似于hold time。
    在这里插入图片描述

无论是复位信号的电平,
必须要满足recovery time和removal time这两个要求,否则可能会造成亚稳态。

另外,并不是复位信号撤销时才可能出现亚稳态,复位信号一开始出现时,同样可能会存在亚稳态,只不过异步复位信号持续时间长,即使第一个周期出现了亚稳态(即第一个周期复位未成功),下一个时钟周期也不会再出现亚稳态了。如果复位信号的变化只持续刚刚一个时钟周期,那么复位信号开始和撤销时都可能会出现亚稳态。(《异步复位,同步释放》)

1.3 ··· 异步复位

  • 诸位道友所经常提及的 异步复位 ,
    即,异步复位、异步释放,Asynchronous Reset and Asynchronous Release。
    复位信号,不随着系统时钟的边沿触发起作用,而是可独立于时钟信号起作用。

1.3.1 ··· 综述

  • Verilog代码,如下:
input Clk;
input rst_N;
reg rst_N_d;
always @(posedge Clk or negedge rst_N) beginif (!rst_N) beginrst_N_d <= 1'b0;end else beginrst_N_d <= 1'b1;end
end
  • 其RTL视图为:
    在这里插入图片描述相比于同步复位,拥有异步复位的寄存器在设计过程中就多了一个引脚(复位引脚)。

  • 其综合后的电路为:
    在这里插入图片描述而其综合的结果为,FDCE。

注:FDCE,为Xilinx的触发器的Primitive之一;功能描述为:同步使能、异步复位。
在这里插入图片描述

1.3.2 ··· 优缺点

  • 优点:
    1、大多数的触发器都有异步复位端口,能保证数据路径上是干净的,不用消耗额外的逻辑资源。
    2、复位信号不依赖于时钟,不管有没有时钟信号,复位信号都能使电路复位。

  • 缺点:
    1、当异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之间时,输出结果就会出现亚稳态,造成复位失败。

recovery time和removal time都是检查异步信号(reset或preset或set)的释放沿,释放沿必须在时钟沿前面提前recovery time释放,或者在时钟沿后removal time之后释放。由于异步复位信号与时钟无必然联系,两者都是独立的,所以复位信号的释放将有一定的概率导致电路出现亚稳态。(《异步复位同步释放》)

在这里插入图片描述
2、系统所产生的的噪声或毛刺会引发伪复位,需要设计过滤器来消除复位电路上毛刺的影响。
3、异步复位需要确保满足时序要求。(补充:“复位信号和时钟信号一样,都是大扇出,所以无论同步或异步,在后端版图设计时需要分析复位树的时序确保满足时序要求。尽管存在复位 buffer tree,但最好要对复位信号少做逻辑。”(《异步复位,同步释放》))

1.4 ··· 同步复位 与 异步复位

只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。(《异步复位同步释放—关于复位的问题》)

ADD:

对于xilinx 7系列的FPGA而言,flip-flop支持高有效的异步复/置位和同步复位/置位。对普通逻辑设计,同步复位和异步复位没有区别,当然由于器件内部信号均为高有效,因此推荐使用高有效的控制信号,最好使用高有效的同步复位。输入复位信号的低有效在顶层放置反相器可以被吸收到IOB中。(《xilinx FPGA复位浅析》)

经过上述分析,同步复位和异步复位都有优缺点,那么是否能将连着结合、取长补短呢?

1.5 ··· 异步复位、同步释放

  • 其实,阅读到这里,
    不难看出异步复位、同步释放是同步释放和异步复位相结合的产物,
    而不是同步异步与复位释放两两相组合的结果。

  • 异步复位、同步释放,即
    复位信号的复位状态有效时不受时钟信号的同步控制,
    而在复位信号释放时(复位状态无效时)受到时钟信号的同步控制。

  • 异步复位、同步释放的目的是在于:防止复位信号释放时产生亚稳态,且节省逻辑资源。

1.5.1 ··· 总述

  • Verilog代码,如下:
input Clk;
input rst_N;
reg rst_N_d1,rst_N_d2;
always @(posedge Clk or negedge rst_N)if (!rst_N) beginrst_N_d1 <= 1'b0;rst_N_d2 <= 1'b0;end else beginrst_N_d1 <= 1'b1;rst_N_d2 <= rst_N_d1;
end
  • 其RTL视图为:
    在这里插入图片描述- 其综合后的电路为:
    在这里插入图片描述

1.5.2 ··· 机理

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

  • 同步释放:当复位信号释放时,由于加入了两级同步缓存器,复位状态不会立即释放,而是等到同步时钟的有效沿时再进行释放;且,rst_N的释放信号不会随着rst_N的撤销而撤销。

  • 同步释放的具体过程,如下:
    1 第一个有效时钟沿到来时:当异步复位信号rst_N释放时,用来同步的第二级寄存器 rst_N_d2 的数据仍然是0,因此第二级寄存器 rst_N_d2 是不会出现亚稳态的。即便第一级寄存器 rst_N_d1 可能会出现亚稳态,但这个亚稳态并不是直接经过第二级寄存器 rst_N_d2 进行输出 ,需要等待下一个时钟有效沿的到来,相当于被打了节拍。
    2 第二个有效时钟沿到来时:当第一级寄存器 rst_N_d1 上一个时刻的这个亚稳态经过第二级寄存器时,基本已经稳定下来了;即便稳定下来不为无效电平,那也就相当于复位信号的有效电平多持续了一个周期。因此我们可以看出,使用异步复位同步释放时,异步复位撤销后需要额外等待一个时钟周期。

简单理解:第2级DFF释放信号与时钟clk边沿同步,所以释放信号在clk上升沿后需经过Tco(Tsu+thd)才能到达下一级DFF的复位端口,所以可以满足下一级DFF的recovery time和removal time,从而不会出现亚稳态。(《异步复位同步释放》)

  • 思考:
    1、第一级触发器的输出,存在亚稳态的可能,这是毋庸置疑的,而且第一级触发器输出的亚稳状态是在逐渐衰减的,且可以持续一个时钟周期;正常情况下,第二级触发器的输出是非亚稳态。但是,如果在第二级触发器的采样时保持时间不够长,且这时第一级触发器的输出依旧处于亚稳态,那么,第二级触发器的输出也会是亚稳态的。不过,这属于小概率事件。
    2、在目前的同步化设计中,用两级触发器进行同步可以消除绝大部分可能的亚稳态了。那么,是不是三级同步操作,会使输出的复位信号更加稳定呢;当然,这样会多消耗一个触发器。
    3、《2级同步引发的思考》,关于两级触发器的思考,可以深入了解下。

既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。(《异步复位同步释放—关于复位的问题》)

不同的复位方式有各自的优缺点。但是在工程中,一般都用异步复位的方法,最好是异步复位同步释放的方法。(《异步复位,同步释放》)

1.5.3 ··· 复位网络

《异步复位 & 同步释放》提及到了复位分发技术,用两级触发器对复位信号打了两次节拍,这也算是异步复位、同步释放的应用了。
在这里插入图片描述

二、思考与补充

逛博客的时候,看到了一些有趣的问题与思考,截图放在文中了,供诸位道友参考学习。
也可以直接到 参考文献 这一章节,直接点击文章名称进行转跳。

2.1 ··· 复位信号是否被需要

在这里插入图片描述
实际上,在写Verilog代码时,写了过多的复位信号反而会对Fmax产生限制。
笔者感觉《同步复位和异步复位》这篇博客的这段解释,如下图所示,似乎更为细致。
在这里插入图片描述
同时,在一博客下面有看到对Xilinx官方文档《UltraFast Design Methodology Guide for FPGAs and SoCs (UG949)》的描述:
在这里插入图片描述

2.2 ··· 关于第一级触发器的数据端口

在这里插入图片描述

2.3 ··· 第二个dff是否存在亚稳态

《异步复位,同步释放的理解》,通过引用文献,对复位同步器得第二个dff是否存在亚稳态进行了解答,如下图所示。这也算是对本文章节《2.2.2 ··· 机理》中思考的一个解答吧。
在这里插入图片描述

2.4 ··· 异步复位去毛刺

《同步复位和异步复位》,这篇博客也有提到这么一个操作,截图给诸位道友看一下。
在这里插入图片描述

2.5 ··· PLL配置后的复位设计

文章《异步复位同步释放(Synchronized Asynchronous Reset)》中,提到了一种PLL配置后的复位设计,感觉有点眼熟,截个图放下面,供诸位道友观摩、讨论。

文字描述如下:
在这里插入图片描述代码综合后的RTL如下:
在这里插入图片描述

2.6 ··· 复位的消耗的资源比你想象的要多

以下截图出自博客《你真的会Xilinx FPGA的复位吗?》。
在这里插入图片描述
嗯,这部分实际上和前文中的 “复位信号是否被需要 ”这部分倒是挺相似的,道友们可以多留意下。
在这里插入图片描述

参考文献

1、《异步复位和同步释放》
2、《异步复位,同步释放》
3、《异步复位同步释放—关于复位的问题》
4、《异步复位 & 同步释放》
5、《异步复位,同步释放的理解》,这篇不错,安利一波。
6、《异步复位同步释放原理》
7、《同步复位和异步复位》
8、《异步复位同步释放》
9、《同步复位和异步复位》,这篇也不错。
10、《2级同步引发的思考》
11、《异步复位同步释放(Synchronized Asynchronous Reset)》
12、《xilinx FPGA复位浅析》
13、《你真的会Xilinx FPGA的复位吗?》,这篇也很不错。
14、《How do I reset my FPGA?》(笔者对这篇文章进行了翻译,《翻译:How do I reset my FPGA?》)
15、《RTL设计- 多时钟域按顺序复位释放》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git远程仓库如何修改

1.需要做的事情&#xff1a;把git的远程仓库修改掉&#xff0c;在git创建一个自己的仓库 如果你是私有化的话&#xff0c;可以生成一个自己token令牌也可以。到时候push的时候会让你登录你就可以输入你的token令牌和用户名。 2.查看当前仓库的远程地址是不是自己的 &#xff…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看数据库,删除数据库,使用数据库;

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…

【xcode 16.2】升级xcode后mac端flutter版的sentry报错

sentry_flutter 7.11.0 报错 3 errors in SentryCrashMonitor_CPPException with the errors No type named terminate_handler in namespace std (line 60) and No member named set_terminate in namespace std 替换sentry_flutter版本为&#xff1a; 8.3.0 从而保证oc的…

【回忆迷宫——处理方法+DFS】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 250; int g[N][N]; bool vis[N][N]; int dx[4] {0, 0, -1, 1}; int dy[4] {-1, 1, 0, 0}; int nx 999, ny 999, mx, my; int x 101, y 101; //0墙 (1空地 2远方) bool jud(int x, int y) {if…

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

⽤vector数组实现树的存储(孩⼦表示法)c++

在我们遇到的算法题中&#xff0c; ⼀般给出的树结构都是有编号的&#xff0c;这样会简化我们之后存储树的操作 &#xff0c;⼀般提供两个信息&#xff1b; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点&#xff0c;接下来8⾏&#xff…

C语言-内存管理

1、malloc()函数 用于动态分配一块指定大小的内存&#xff0c;并返回指向这块内存的指针。如果分配失败&#xff0c; 返回 NULL。 int* ptr (int*)malloc(sizeof(int) * 10); // 分配一个包含 10 个整数的内存 if (ptr NULL) {printf("Memory allocation failed!\n&q…

蓝桥杯lesson3---string的使用

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” string的概念 string字符串是一种更加高级的封装&#xff0c;string字符串中包含了大量的方法&#xff0c;这些方法使得字符串的操作变得更加简单&#xff0c;string的使用&…

进制之间转换

「 一、十进制 二进制 」 1.十进制转二进制&#xff1a;一直除以2直到商为0&#xff0c;再反向取余数。 例&#xff1a;13&#xff08;十进制&#xff09;转1101&#xff08;二进制&#xff09; 2.二进制转十进制:最后一位数开始是2^0&#xff0c;然后一直按照指数递增的方式…

3b1b线性代数基础

零、写在前面 3b1b之前没认真看&#xff0c;闲了整理整理。 一、向量 学习物理的时候&#xff0c;向量是空间中的箭头。由其方向和长度决定。 学习数据结构的时候&#xff0c;向量是有序的数字列表。向量的每一维度有着不同含义。 线性代数中&#xff0c;我们通常认为**向量…

Consul持久化配置报错1067---consul_start

报错都是文件写的有问题或者格式问题&#xff0c;直接复制我的这个改改地址就行 先创建文本文件consul_start.txt--->再复制代码保存---->再把.txt改成.bat 持久化存储的地址在&#xff1a;mydata 注&#xff1a;D:\consul\consul_1.20.2_windows_386改成自己consul的…

【Unity3D】Unity混淆工具Obfuscator使用

目录 一、导入工具 二、各种混淆形式介绍 2.1 程序集混淆 2.2 命名空间混淆 2.3 类混淆 2.4 函数混淆 2.5 参数混淆 2.6 字段混淆 2.7 属性混淆 2.8 事件混淆 三、安全混淆 四、兼容性处理 4.1 动画方法兼容 4.2 GUI方法兼容 4.3 协程方法兼容 五、选项 5.1 调…

JavaScript学习笔记(3)

一.BOM对象 BOM的全称是Browser Object Model,翻译过来是浏览器对象模型。也就 是JavaScript将浏览器的各个组成部分封装成了对象。我们要操作浏览器的部分功能&#xff0c;可以通过操作 BOM对象的相关属性或者函数来完成。例如&#xff1a;我们想要将浏览器的地址改为 http:/…

Hive之加载csv格式数据到hive

场景&#xff1a; 今天接了一个需求&#xff0c;将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移&#xff0c;只需要迁移ads表 解决方案&#xff1a; 拿到这个需求首先想到两个方案&#xff1a; 1、将数据通过insert into语句导出&#xff0c;然后运行脚本 …

stm32f103 单片机(一)第一个工程

先看一个简单的 系统上已经安装好了keil5 与ARM包&#xff0c;也下载好了STM32固件库 新建一个工程&#xff0c;添加三个组 加入如下文件 在options 里作如下配置 准备在main.c 中写下第一个实验&#xff0c;点亮一个小灯。 像51单片机一样直接对引脚赋值是行不通的 在…

ChromeOS 132 版本更新

ChromeOS 132 版本更新 1. 企业定制化 Chrome Web Store 管理员现在可以使用新设置定制 Chrome Web Store 以适应他们管理的用户&#xff0c;包括以下功能&#xff1a; 添加公司标志添加首页横幅和自定义公告策划扩展集合实施基于类别的控制 这些设置可以通过管理员控制台进…

绘制决策树的尝试1

代码复制 import pydotplus 复制 - 这一行代码用于导入pydotplus模块&#xff0c;这是一个用来在Python中创建图形的工具。2. python from IPython.display import Image 这一行代码用于从IPython显示模块中导入Image类&#xff0c;它允许我们在Jupyter笔记本中显示图像。…

知识图谱结合大模型用于聊天分析

知识图谱结合大模型在聊天分析中的应用主要体现在以下几个方面&#xff1a; 1. 提升对话理解和生成能力 知识图谱&#xff08;KG&#xff09;与大模型&#xff08;LLM&#xff09;的结合能够显著增强对话系统的语义理解能力和生成能力。例如&#xff0c;通过知识图谱的结构化…

堆的补充--Top-K问题

我们今天来学习二叉树的链式存储&#xff0c;但是在我们学习之前我们先来看一下我们昨天学习的顺序存储&#xff1a;二叉树&#xff1b; 我们之前说堆有两种方法&#xff1a; 1.向下调整建堆&#xff1a; 我们找到最后一个非叶子结点&#xff0c;把他作为起始下标&#xff1…

放大器版图绘制全流程

版图的构成主要分为四部分。对于一般的电路来说&#xff0c;重点关注前三部分第一部分是电路中所对应的mos管电容电阻这些基本器件&#xff0c;一般都是由工艺产商提供标准的元件版图&#xff0c;这部分是我们不需要太关心的。第二部分是对器件进行连线第三部分是衬底的连接&am…