数字设计小思 - D触发器与死缠烂打的亚稳态
前言
本系列整理数字系统设计的相关知识体系架构,为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中,D触发器是最常用的器件,也可以说是时序逻辑的核心,本文根据个人的思考历程结合相关书籍内容和网上文章,聊一聊D触发器与亚稳态的那些事。
D触发器结构
由传输门和两个反相器组成一个循环电路(锁存器),再由前后两级锁存器按主从结构连接而成。分别用两个反相时钟控制 , 触发器在时钟有效沿的短期时间 “ 窗口” 采样数据。传输门起开关的作用,随着CLK的状态变化切换开关。从输出来看的话,前级的锁存器的值会有序传送给后级(随着时钟输入)。
D触发器的工作时序如下图,图中的D为上图D触发器输入端,Q为D触发器输出端。此处分析并不考虑时钟存在抖动偏移的情况,认为时钟是理想的,没有抖动偏移的。
时钟为低电平时,也即主锁存器工作时,D触发器的主锁存器进行锁存,在图中标号1为输入的信号。主锁存器经过传输门和反相器进行数据寄存;此时后级的从锁存器和前级隔开;从锁存器输出上一个时钟周期的数据。
时钟为高电平时,也即从锁存器工作时,D输入端和主锁存器断开,确保数据稳定,然后主锁存器将数据传输给从锁存器,然后输出到Q端。
标号2的虚线表示理想条件下(无延时)主锁存器的锁存边沿,实际上主锁存器稳定锁存需要时间,所以相比理想条件需要延时一段时间。标号3的虚线表示理想条件下(无延时)从锁存器的锁存边沿,实际上从锁存器稳定锁存需要时间,所以相比理想条件需要延时一段时间。根据主从锁存器的输出结果,可得到D触发器输出Q的波形。图中的标号4中的虚线表示理想条件下(无延时)从锁存器的锁存边沿,这里的延时是经过传输门 TG3 和反相器到输出端 Q 的延迟。
同时,当时钟由低电平变为高电平时,涉及到了两组传输门的切换,因为实际的物理模型开关切换都是需要时间的,并且每个开关进行开断时都有一定的时间偏差,所以在此时D端的输入改变就容易造成从锁存器的锁存错误,从而造成从锁存器的反相器环路想后级传递值时,给出错误的数据值,进而影响功能。
与主锁存器相关的建立时间
此时再回顾建立时间的定义,建立时间 (通常表示为tsu)指在时钟上升沿来临之前信号保持稳定的最小时间。结合前面的分析,建立时间的存在意义也就是于此。在时钟电平跳变前,主锁存器需要稳定锁存我们想要的数据,由于实际物理电路的延迟,需要提前一段时间进行将数据进行稳定。因此,建立时间,实质上是主锁存器锁存需要的时间,。
与从锁存器相关的保持时间
再回顾保持时间的定义,保持时间(通常表示为th)指在时钟上升沿来临之后信号保持稳定的最小时间。结合前面的分析,保持时间的存在意义也就是于此。当时钟进入高电平后,由于传输门关断需要一定的时间,因此输入D必须继续稳定一段时间才能够保证数据被稳定锁存。因此,保持时间,实质上是传输门切换至从锁存器锁存数据需要的时间。
简单来说,主锁存器决定了D触发器的建立时间,从锁存器决定了D触发器的保持时间,从上面的例子中可以很容易看到,同时说明一点上面的分析均基于理想时钟的情况下,同样的道理,时钟的抖动也会影响,数据正常锁存。
亚稳态理论引入
所以,根据前文D触发器模型的分析可知,当信号没有满足两个锁存器的锁存时间时(也即违背了触发器的建立和保持时间),就没法正常的让系统工作。设计中任何一个触发器都有特定的建立和保持时间,在时钟上升沿前后的这段时间窗口内,数据输入信号必须保持稳定。如果信号在这段时期发生了变化,那么输出将是未知的。这种有害状态的传播就叫做亚稳态。
亚稳态窗口
因此,可以定义触发器的建立时间和保持时间为亚稳态窗口( Metastability Window)。在亚稳态窗口内,如果信号发生变化,输出就可能变成亚稳态。建立时间和保持时间共同决定亚稳态窗口的宽度。
窗口越大,进人亚稳态的概率越高。在大多数情况下,较新的逻辑器件会有更小的亚稳态窗口,也就意味着器件进入亚稳态的概率会更小。
异步系统容易发生亚稳态
在同步系统中输入信号总是满足触发器的时序要求,所以不会发生亚稳态。但是,在异步系统中,由于数据和时钟的关系不是固定的,因此有时会出现违反建立和保持时间的现象。此时触发器的输出会因此而产生毛刺,或者暂时保持在不稳定状态而且需要较长时间才能回到稳定状态。
当触发器处在亚稳态时,输出会在高低电平之间波动,这会导致延迟输出转换过程,并超出所规定的时钟到输出的延迟值(tco)。亚稳态输出恢复到稳定状态所需的超出t的额外时间部分称为稳定时间(tMET)。并非所有不满足建立和保持时间的输入变化都会导致亚稳态输出。触发器是否进入亚稳态和返回稳态所需时间取决于生产器件的工艺技术与外界环境。一般来说,触发器都会在一个或者两个时钟周期内返回稳态。
当信号在一个时钟域( src_data_out)里变化,在另一个时钟域(dest_data_in)内采样时,就会导致输出变成亚稳态。这就是所谓的同步失败,会导致逻辑功能的异常。
平均无故障时间(MTBF)
当系统的故障率恒定时,MTBF ( Mean/ Average Time Between Failures,平均无故障时间)就是故障率的倒数。我们可以从中知道特定触发器发生故障的频率。
对于一个具有给定时钟频率和在该时钟周期内具有均匀概率密度的异步数据信号边沿的单级同步器,亚稳态事件的发生率可以用建立、保持时间窗口和时钟周期的比值乘以信号触发频率来计算。
$$
\begin{aligned}
\frac {1}{故障率}\ &= MTBF \ =\frac {e(t_r/\tau)}{Wf_cf_d}\
\end{aligned}
$$
t r : 允许超出器件正常传输延迟的解析时间 τ = 触发器的亚稳态 ( 解析 ) 时间常数 W = 亚稳态窗口 f c = 时钟频率 f d = 异步信号边沿频率 \begin{aligned} t_r&:允许超出器件正常传输延迟的解析时间\\ \tau&=触发器的亚稳态(解析)时间常数\\ W&=亚稳态窗口\\ f_c&=时钟频率\\ f_d&=异步信号边沿频率\\ \end{aligned} trτWfcfd:允许超出器件正常传输延迟的解析时间=触发器的亚稳态(解析)时间常数=亚稳态窗口=时钟频率=异步信号边沿频率
常数W和τ跟触发器的电气特性有关,会根据工艺技术而改变。所以,相同工艺生产出来的不同器件有着相似的W和τ值。
如何尽量避免亚稳态
每当违背建立、保持时间时,亚稳态就会出现,所以了解在何种情况下容易发生亚稳态,自然也就知道如何更好的避免亚稳态。在以下条件中,信号可能违背建立时间和保持时间的要求:
- 异步信号 :输入信号是异步信号。
- 时钟不稳定: 时钟偏移/摆动(上升/下降时间)高于容限值。
- 跨时钟域工作: 信号在两个不同频率或者相同频率但是相位和偏移不同的时钟域下跨时钟域工作。
- 组合延迟过大 使触发器的数据输入在亚稳态窗口内发生变化。
亚稳态会引起过多的传输延迟和系统故障,所有的触发器和寄存器都存在亚稳态可能。
亚稳态不能根除,但是可以减小亚稳态发生的概率。
在最简单的情况下,设可以通过确保时钟周期足够长来避免亚稳态(也即降低时钟频率),但这种方法很难再满足性能的要求。另一种避免亚稳态的方法就是使用同步器,这种同步器最好在单Bit信号的情况下使用。
使用多级同步器
避免亚稳态最常见的方法是在跨时钟域的信号上加上一个或者多个同步触发器,如下图所示。这种方法用一个完整的时钟周期来解决第一级同步触发器的亚稳态问题(不包括第二级触发器的建立时间)。但是这种方式增加了同步逻辑输入的延迟。
简而言之就是对于异步信号进行打拍处理,这个在数字系统设计中很常用。
使用时钟倍频电路的多级同步器
多级同步器的一个局限就是系统需要花费较长的时间去响应异步输入。解决这个问题的办法就是使用倍频时钟作为两个同步触发器的时钟输入。Altera的FPGA中具有这项称为时钟倍频的技术。
这种方法不仅能够让系统在一个系统时钟周期内响应一个异步输入,而且改善了MTBF。尽管这种倍频时钟能够降低MTBF,但是这个影响要超过两级触发器引起的偏移量。
两种方法都不能保证同步器阻止亚稳态传播下去,它们仅仅减少了亚稳态发生的概率。
同步器的类型
根据MTBF的计算公式 ,一个异步输入电路的MTBF和用于从亚稳态恢复的时间呈指数关系。 用同步器构成的时间缓冲器可以帮助从亚稳态中恢复。(这里参考的是《硬件架构的艺术》这本书,但是个人感觉翻译的笔者可能把这段搞混掉了,如果看了原书的人,可能没太能搞懂他说的两种同步器,图片和内容在我看来好像是存在不对应的情况,这里就依据个人理解对书中的内容进行勘误)。
在《硬件架构的艺术》这本书中介绍了两级同步器的两种不同的模式:模式A(慢时钟域转快时钟域)和模式B(快时钟域转慢时钟域)。
模式A(慢时钟域转快时钟域)
模式A是一个标准的电路,当异步输入信号比时钟周期大得多时最有效。(这里根据我的个人理解他可能想表达的就是常规在目的时钟域中打两拍的做同步,所以我这里暂且认定前面提到的多级同步器是他这里说的标准电路)
使用在目的时钟域打两拍的方式作为两级同步器,即使异步输入在建立时间区间之外稳定,它仍然需要由时钟驱动产生两个周期的延迟,否则FF1可能进入亚稳态。如果亚稳态在不到一个时钟周期内就解析了,FF2就会有稳定的输入,否则就需要级联更多的触发器作为同步器。
模式B(快时钟域转慢时钟域)
对于同步器的模式B,第一级触发器的输入D与Vcc相连,同时时钟信号是异步输入信号。另外两个触发器直接由系统时钟(clk)控制。一个短脉冲让q1变成高电平,这个高电平在经过两个时钟(clk)沿后从sync_out输出。
本节总结:
- 当信号存在跨时钟域工作或者为异步信号时,此时要采用同步器进行同步,确保工作稳定。
- 如果是慢时钟域转快时钟域的场景,可以进行打拍处理;如果是快时钟域转慢时钟域,就采用同步器的模式B。
面对亚稳态建议
在两个相互异步系统的交界面亚稳态是不可避免的。下面的几点建议可以明显减小亚稳态发生的概率。
工艺器件角度:
- 采用响应更快的触发器(缩短亚稳态窗口 Tw )。
- 使用亚稳态硬化触发器(专为高宽带设计并且减少为时钟域输入电路而优化的采样时间)。
设计角度:
- 采用同步器。
- 使用级联触发器(两个或者多个)作为同步器。如果一个触发器的亚稳态失败概率为P,那么N个触发器的亚稳态失败率就是P^{N}。
- 减少采样速率,或者说降低时钟频率。
- 避免使用dV/dt低的输入信号(电压突变较慢的输入信号)。
小思与总结
本文针对前面D触发器的分析没有进行考虑时钟的偏移情况,相关内容在后续介绍时序约束时进行整理;同时本文的同步方法建议在单Bit信号进行使用,多Bit信号或者单Bit信号处理的其他方法待后续进行整理。
为什么多Bit信号不能使用文中的同步器方式呢?在《硬件架构的艺术》书中提到了这样一句话:一个异步信号不应该被两个或者多个同步器所同步,这样做会存在多个同步器输出产生不同信号的风险。 这大概也就是这个问题的答案,具体分析将在后面关于跨时钟处理的文章中进行整理解答,笔者水平有限,如有错误,欢迎讨论。
reference
- CMOS的宽/长比、传输门与三态门、锁存器与触发器、简单版图、竞争与冒险
- 一文解决关于建立保持时间的困惑 - 知乎
- 硬件架构的艺术
相关文章:

数字设计小思 - D触发器与死缠烂打的亚稳态
前言 本系列整理数字系统设计的相关知识体系架构,为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中,D触发器是最常用的器件,也可以说是时序逻辑的核心,本文根据个人的思考历程结合相关书籍内容和网上文章,聊一聊D…...

Notes/Domino 11.0.1FP7以及在NAS上安装Domino等
大家好,才是真的好。 目前HCL在还是支持更新的Notes/Domino主要是三个版本,V10、11和12,这不,上周HCL Notes/Domino 11.0.1居然推出了FP7补丁包程序。 从V10.0.1开始,Domino的FP补丁包程序主要是用来修复对应主要版本中的一些问…...

【VM服务管家】VM4.x算子SDK开发_3.3 模块工具类
目录 3.3.1 位置修正:位置修正算子工具的使用方法3.3.2 模板保存:实现模板自动加载的方法3.3.3 模板匹配: 获取模板匹配框和轮廓点的方法3.3.4 模板训练:模板训练执行完成的判断方法3.3.5 图像相减:算子SDK开发图像相减…...

Aspose.Pdf使用教程:在PDF文件中添加水印
Aspose.PDF 是一款高级PDF处理API,可以在跨平台应用程序中轻松生成,修改,转换,呈现,保护和打印文档。无需使用Adobe Acrobat。此外,API提供压缩选项,表创建和处理,图形和图像功能&am…...

H.264/AVC加密----选择加密
文献学习: 《Data Hiding in Encrypted H.264/AVC Video Streams by Codeword Substitution》 期刊:IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY 简介 通过分析H.264/AVC编解码器的特性,提出了三个敏感部分(IPM、MVD和残差系…...
WuThreat身份安全云-TVD每日漏洞情报-2023-04-26
漏洞名称:Google Android 命令注入漏洞 漏洞级别:高危 漏洞编号:CVE-2023-20964,CNNVD-202303-538 相关涉及:None 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-05794 漏洞名称:OpenSSL RSA 解密时间差异 漏洞级别:中危 漏洞编号:CVE-2022-4…...
剑指 Offer第二版:1~n 整数中 1 出现的次数、51. 数组中的逆序对、56 - II. 数组中数字出现的次数 II
剑指 Offer第二版 43. 1~n 整数中 1 出现的次数51. 数组中的逆序对56 - II. 数组中数字出现的次数 II 43. 1~n 整数中 1 出现的次数 题目:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 例如,…...

云原生-k8s核心概念(pod,deploy,service,ingress,configmap,volume)
Gitee-k8s学习 云原生实战-kubernetes核心实战 namespace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离 Pod Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。 De…...

他工作10年,老板却让他走人
大家好,我是五月,一个编程街溜子。 二狗被裁了,他在公司待了快十年,他想留下来,老板却让他走。 我和他一样困惑。 他985毕业,工作中有从0开始一个项目直到日活过千万,也有过参与顶级产品核心…...
vpp怎么写node
VPP(Vector Packet Processing)是一个高性能的数据平面开源项目,用于构建网络功能虚拟化(NFV)和软件定义网络(SDN)解决方案。它由Cisco开发,并在Apache 2.0许可下发布。 在VPP中&am…...

【4. ROS的主要通讯方式:Topic话题与Message消息】
【4. ROS的主要通讯方式:Topic话题与Message消息】 1. 前言1.1 王者解释结点通讯:1.2 通讯小结 2. 灵活的Topic话题图解2.1 话题注意细节2.2 外延补充 3. Message消息图解3.1 消息类型3.2 查看标准消息类型std_msgs 4. 使用C实现Publisher发布者4.1 发布…...

【react全家桶学习】react中组件定义及state属性(超详/必看)
函数式组件定义及特点 定义(核心就是一个函数,返回虚拟dom): import React from reactexport default function index() {return <div>index</div> }特点: 1、适用于【简单组件】的定义2、是一个函数&a…...

如何以产品经理思维打造一所高品质学校?
学校的建设与管理真不是一件容易事。2023年03月17日,山东菏泽市曹县一家长投诉某中学课业繁重,孩子经常写作业到半夜;2023年4月4日,张先生在华龙网重庆网络问政平台投诉万州区某中学伙食差,指出“发灰的洋葱࿰…...
根治Spring中使用Mongo时报错InvalidMongoDbApiUsageException
文章目录 And Or迷惑原因 告别InvalidMongoDbApiUsageException问题简单解决根本解决修改源码 代码(省流,可以直接看这里) And Or 很多时候都需要进行逻辑的与或操作,但是spring当中自带的操作并不好用,于是做了相关的改进&#…...

【计算机组成原理】数据的表示和运算·进位计数制
🚩 本文已收录至专栏:计算机基础 我们可以通过显示屏看到各种形式的数据信息,但数据是如何在计算机中表示呢?运算器又是如何实现数据的算数、逻辑运算? 十进制数是最适合我们日常使用的一种计数方式,除此之…...
C++ Primer第五版_第十四章习题答案(21~30)
文章目录 练习14.21练习14.22头文件CPP文件 练习14.23头文件CPP文件 练习14.24头文件CPP文件 练习14.25练习14.26练习14.27练习14.28练习14.29练习14.30 练习14.21 编写 Sales_data 类的 和 运算符,使得 执行实际的加法操作而 调用。相比14.3节和14.4节对这两个运…...
服务器性能调优
硬件 如果是硬件瓶颈就换硬件 (包括CPU、内存、网卡) 软件 如果是方案架构设计有问题就换方案,比如mysql、redis方案有问题 建议先 top 看下软件瓶颈在哪,CPU、内存、网络(netstat),哪个进程占…...

带你深入学习k8s--(三) pod 管理
目录 一、简介 1、什么是pod 2、为什么要有pod 二、pod的分类 0、pod常用命令命令 1、准备镜像 2、自主式pod 3、控制器创建pod 4、扩容pod数量 5、通过service暴露pod(负载均衡,自动发起) 6、更新应用版本 三、编写yaml文件 四、Pod生命周期…...

前端系列11集-ES6 知识总结
ES Module 优点 静态分析 浏览器和 Node 都支持 浏览器的新 API 能用模块格式提供 不再需要对象作为命名空间 export 用于规定模块的对外接口 输出的接口与其对应的值是动态绑定关系可以取到模块内部实时的值 import 用于输入其他模块提供的功能 具有提升效果,会提升…...

连接分析工具箱 | 利用CATO进行结构和功能连接重建
导读 本研究描述了一个连接分析工具箱(CATO),用于基于扩散加权成像(DWI)和静息态功能磁共振成像(rs-fMRI)数据来重建大脑结构和功能连接。CATO是一个多模态软件包,使研究人员能够运行从MRI数据到结构和功能连接组图的端到端重建,定制其分析并…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...