数字设计小思 - D触发器与死缠烂打的亚稳态

前言

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

D触发器结构

由传输门和两个反相器组成一个循环电路(锁存器),再由前后两级锁存器按主从结构连接而成。分别用两个反相时钟控制 , 触发器在时钟有效沿的短期时间 “ 窗口” 采样数据。传输门起开关的作用,随着CLK的状态变化切换开关。从输出来看的话,前级的锁存器的值会有序传送给后级(随着时钟输入)。

D-FF电路结构

D触发器的工作时序如下图,图中的D为上图D触发器输入端,Q为D触发器输出端。此处分析并不考虑时钟存在抖动偏移的情况,认为时钟是理想的,没有抖动偏移的。

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信号的情况下使用。

使用多级同步器

避免亚稳态最常见的方法是在跨时钟域的信号上加上一个或者多个同步触发器,如下图所示。这种方法用一个完整的时钟周期来解决第一级同步触发器的亚稳态问题(不包括第二级触发器的建立时间)。但是这种方式增加了同步逻辑输入的延迟。

N级同步器

简而言之就是对于异步信号进行打拍处理,这个在数字系统设计中很常用。

使用时钟倍频电路的多级同步器

多级同步器的一个局限就是系统需要花费较长的时间去响应异步输入。解决这个问题的办法就是使用倍频时钟作为两个同步触发器的时钟输入。Altera的FPGA中具有这项称为时钟倍频的技术。

时钟倍频电路的多级同步器

这种方法不仅能够让系统在一个系统时钟周期内响应一个异步输入,而且改善了MTBF。尽管这种倍频时钟能够降低MTBF,但是这个影响要超过两级触发器引起的偏移量。

两种方法都不能保证同步器阻止亚稳态传播下去,它们仅仅减少了亚稳态发生的概率。

同步器的类型

根据MTBF的计算公式 ,一个异步输入电路的MTBF和用于从亚稳态恢复的时间呈指数关系。 用同步器构成的时间缓冲器可以帮助从亚稳态中恢复。(这里参考的是《硬件架构的艺术》这本书,但是个人感觉翻译的笔者可能把这段搞混掉了,如果看了原书的人,可能没太能搞懂他说的两种同步器,图片和内容在我看来好像是存在不对应的情况,这里就依据个人理解对书中的内容进行勘误)。

在《硬件架构的艺术》这本书中介绍了两级同步器的两种不同的模式:模式A(慢时钟域转快时钟域)和模式B(快时钟域转慢时钟域)。

模式A(慢时钟域转快时钟域)

模式A是一个标准的电路,当异步输入信号比时钟周期大得多时最有效。(这里根据我的个人理解他可能想表达的就是常规在目的时钟域中打两拍的做同步,所以我这里暂且认定前面提到的多级同步器是他这里说的标准电路)

模式A同步器

使用在目的时钟域打两拍的方式作为两级同步器,即使异步输入在建立时间区间之外稳定,它仍然需要由时钟驱动产生两个周期的延迟,否则FF1可能进入亚稳态。如果亚稳态在不到一个时钟周期内就解析了,FF2就会有稳定的输入,否则就需要级联更多的触发器作为同步器。

模式B(快时钟域转慢时钟域)

对于同步器的模式B,第一级触发器的输入D与Vcc相连,同时时钟信号是异步输入信号。另外两个触发器直接由系统时钟(clk)控制。一个短脉冲让q1变成高电平,这个高电平在经过两个时钟(clk)沿后从sync_out输出。

模式B同步器

本节总结:

  1. 当信号存在跨时钟域工作或者为异步信号时,此时要采用同步器进行同步,确保工作稳定。
  2. 如果是慢时钟域转快时钟域的场景,可以进行打拍处理;如果是快时钟域转慢时钟域,就采用同步器的模式B。

面对亚稳态建议

在两个相互异步系统的交界面亚稳态是不可避免的。下面的几点建议可以明显减小亚稳态发生的概率。

工艺器件角度:

  1. 采用响应更快的触发器(缩短亚稳态窗口 Tw )。
  2. 使用亚稳态硬化触发器(专为高宽带设计并且减少为时钟域输入电路而优化的采样时间)。

设计角度:

  1. 采用同步器。
  2. 使用级联触发器(两个或者多个)作为同步器。如果一个触发器的亚稳态失败概率为P,那么N个触发器的亚稳态失败率就是P^{N}。
  3. 减少采样速率,或者说降低时钟频率。
  4. 避免使用dV/dt低的输入信号(电压突变较慢的输入信号)。

小思与总结

本文针对前面D触发器的分析没有进行考虑时钟的偏移情况,相关内容在后续介绍时序约束时进行整理;同时本文的同步方法建议在单Bit信号进行使用,多Bit信号或者单Bit信号处理的其他方法待后续进行整理。

为什么多Bit信号不能使用文中的同步器方式呢?在《硬件架构的艺术》书中提到了这样一句话:一个异步信号不应该被两个或者多个同步器所同步,这样做会存在多个同步器输出产生不同信号的风险。 这大概也就是这个问题的答案,具体分析将在后面关于跨时钟处理的文章中进行整理解答,笔者水平有限,如有错误,欢迎讨论。

reference

  1. CMOS的宽/长比、传输门与三态门、锁存器与触发器、简单版图、竞争与冒险
  2. 一文解决关于建立保持时间的困惑 - 知乎
  3. 硬件架构的艺术

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

函数-函数递归及练习

目录 1、什么是递归? 2、递归的两个必要条件 3、递归的练习 3.1 接受一个整型值(无符号),按照顺序打印它的每一位 3.2 编写函数不允许创建临时变量,求字符串的长度 3.3 求第n个斐波那契数 3.4 字符串逆序&…

Go语言-数据结构与算法

go语言之专业数据结构与算法 20.4 稀疏 sparsearray 数组 20.4.1 先看一个实际的需求  编写的五子棋程序中,有存盘退出和续上盘的功能 稀疏数组的处理方法是 : 1) 记录数组一共有几行几列,有多少个不同的值 2) 思想:把具有不同值…

【五一创作】【Midjourney】Midjourney 连续性人物创作 ② ( 获取大图和 Seed 随机种子 | 通过 seed 随机种子生成类似图像 )

文章目录 一、获取大图和 Seed 随机种子二、通过 seed 种子生成类似图像 一、获取大图和 Seed 随机种子 注意 : 一定是使用 U 按钮 , 在生成的大图的基础上 , 添加 信封 表情 , 才能获取该大图的 Seed 种子编码 ; 在上一篇博客生成图像的基础上 , 点击 U3 获取第三张图的大图 ;…

STL常用梳理——VECTOR常用接口及其迭代器实现

Vector篇 Vector介绍Vector实现1、定义默认构造函数使用实现 2、迭代器Iterator迭代器使用 3、空间增长问题使用实现 迭代器迭代器介绍迭代器实现 Vector介绍 vector是STL中容器之一,特性如下: vector是表示可变大小数组的序列容器。就像数组一样&#…

Python基础合集 练习21 (错误与异常处理语句)

‘’‘try: block1 except[ExceptionName]: block2 ‘’’ block1:执行代码,表示可能会出现错误的代码块 ExceptionName: 表示要捕获的异常名称,为可选参数.如果不指定异常名称,则表示捕获所有异常 block2:表示发生异常时执行的代码块 while True: try: num int(input(请输…

设计模式——工厂模式

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、工厂模式介绍 2、披萨项目需求 3、传统方式 4、非静态简单工厂模式 5、静态简单工厂模式 6、工厂方法模式 7、抽象工厂模…

spass modeler

课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…

目标检测模型量化---用POT工具实现YOLOv5模型INT8量化

POT工具是什么 POT工具,全称:Post-training Optimization Tool,即训练后优化工具,主要功能是将YOLOv5 OpenVINO™ FP32 模型进行 INT8 量化,实现模型文件压缩,从而进一步提高模型推理性能。 不同于 Quantiz…

MYSQL-数据库管理(上)

一、数据库概述 一、数据库基本概念 1.1 数据 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的。…

Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址:http://arxiv.org/abs/2112.01527 项目地址:https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成: 主干特征提取器&#xff…

【Java笔试强训 29】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥求正数数…

UNIX环境高级编程——进程关系

9.1 引言 本章详细说明进程组以及会话的概念,还将介绍登录shell(登录时所调用的)和所有从登录shell启动的进程之间的关系。 9.2 终端登录 9.3 网络登录 9.4 进程组 每个进程除了有一进程ID之外,还属于一个进程组,进…

chatgpt 数据相关应用论文策略简介

hatGPT等预训练大模型,一个核心能力就是经过海量语料的训练加上强化学习的引导,其具有强大的接近人类的文本生成能力。这个能力的一大用途,就是可以为我们生产数据或者标注数据,再基于这些数据训练我们自己的模型。 On the Feasi…

如何让ChatGPT成为科研工作中的小助手?(附使用指南)

大家好,我是带我去滑雪! 从2022年年底发布叫ChatGPT的人工智能聊天机器人以来,逐渐强势进入了各行各业,一夜火爆全网,它使用自然语言处理技术来与用户进行交互和沟通,可以回答用户关于知识、娱乐、生活等方…

【计算机专业漫谈】【计算机系统基础学习笔记】W1-计算机系统概述

利用空档期时间学习一下计算机系统基础,以前对这些知识只停留在应试层面,今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC,参考书籍也是袁老师的教材,这是我的听课自查资料整理后的笔记,…

上市公司碳排放测算数据(1992-2022年)

根据《温室气体核算体系》,企业的碳排放可以分为三个范围。 范围一是直接温室气体排放,产生于企业拥有或控制的排放源,例如企业拥有或控制的锅炉、熔炉、车辆等产生的燃烧排放;拥有或控制的工艺设备进行化工生产所产生的排放。 范…

第十五章 角色移动旋转实例

本章节我们创建一个“RoleDemoProject”工程,然后导入我们之前创建地形章节中的“TerrainDemo.unitypackage”资源包,这个场景很大,大家需要调整场景视角才能看清。 接下来,我们添加一个人物模型,操作方式就是将模型文…

基于GWO灰狼优化算法的城市路径优化问题GWO-TSP(MATLAB程序)

资源地址: 基于GWO灰狼优化算法的城市路径优化问题GWO-TSP(MATLAB程序)资源-CSDN文库 主要内容: 主要采用灰狼优化算法对城市间的路径进行规划。城市分布图如图所示。 部分代码: % 产生问题模型 model CreateModel(Oliver30.…

kafka常见问题QA(六)

六、常见问题QA 6.1 无消息丢失如何配置 producer 调用方式 (1)网络抖动导致消息丢失,Producer 端可以进行重试。 (2)消息大小不合格,可以进行适当调整,符合 Broker 承受范围再发送。 不要使用…

【C++】STL标准库之vector

STL标准库之vector vector类的简介常用的vector类的接口构造容量遍历及访问增删查改迭代器迭代器失效问题 vector类的简介 vector是大小可变数组的序列容器,与string相比,vector中可以存任何类型的数据,而string中存储的只能是字符类型。 因为…