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

news2024/11/26 8:52:31

前言

本系列整理数字系统设计的相关知识体系架构,为了方便后续自己查阅与求职准备。在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. 硬件架构的艺术

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

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

相关文章

Hudi数据湖技术之数据中心案例实战

目录 1 案例架构2 业务数据2.1 客户信息表2.2 客户意向表2.3 客户线索表2.4 线索申诉表2.5 客户访问咨询记录表 3 Flink CDC 实时数据采集3.1 开启MySQL binlog3.2 环境准备3.3 实时采集数据3.3.1 客户信息表3.3.2 客户意向表3.3.3 客户线索表3.3.4 客户申诉表3.3.5 客户访问咨…

微信小程序 WebSocket 通信 —— 在线聊天

在Node栏目就讲到了Socket通信的内容,使用Node实现Socke通信,还使用两个流行的WebSocket 库,ws 和 socket.io,在小程序中的WebSocket接口和HTML5的WebSocket基本相同,可以实现浏览器与服务器之间的全双工通信。那么本篇…

SSH 服务器、NFS 服务器、TFTP 服务器详解及测试

文章目录 前言一、SSH 服务器1、SSH 能做什么?2、安装 SSH 服务器3、测试 SSH 服务4、用 SecureCRT 测试 二、NFS 服务器1、NFS 能做什么?2、安装 NFS 软件包3、添加 NFS 共享目录4、启动 NFS 服务5、测试 NFS 服务器 三、TFTP 服务器1、TFTP 能做什么&a…

轻松掌握mysql事务的四大特性ACID及实现原理

1、介绍 要实现这四大特性,我们先了解下mysql中的缓冲池和数据页 2、保证原子性和一致性 1、通过undo log保证数据的原子性和一致性 undo log保证了事务的原子性和一致性。 3、保证隔离性 1、并发事务产生时容易产生的隔离性问题 脏读 不可重复读 幻读…

【数据库复习】第四章数据库保护 1

数据库安全性: 数据库的一大特点是数据可以共享 数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享 用户标识与鉴别 用户名和口令易被窃取,每个用户预先约定好一个计算过程或者函数 存取控制 常用存取控制方法 自主存…

电子电气架构——车辆E/E架构常识

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人只有在举棋不定,无从把握的时候才感到疲惫。只有去行动就能获得解放,哪怕做的不好也比无所作为强! 本文主要介绍车辆E/E架构常识,主要涉及E/E架构面临…

LNMP、Tomca

构建Nginx服务器 使用源码包安装nginx软件包 [rootproxy ~]# yum -y install gcc pcre-devel openssl-devel #安装依赖包 [rootproxy ~]# useradd -s /sbin/nologin nginx [rootproxy ~]# tar -xf nginx-1.17.6.tar.gz [rootproxy ~]# cd nginx-1.17.6 [rootproxy …

【Shell编程之循环语句与函数】

目录 一、for循环语句示例:示例1示例2 示例3 二、跳出循环举例 转义符三、while 语句的结构示例: 四、until语句的结构1、基本格式 五、seq命令 一、for循环语句 读取不同的变量值&#xff0c;用来逐个执行同一组命令 #!/bin/bash for(( i0;i<5;i ))i0 定义for循环i变量初…

【逻辑位移和算数位移】

<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时&#xff0c;会将x的所有位右移x位&#xff0c;同时左边高位补0 显而易见&#xff0c;运算结束后&#xff0c;值为1 。 可知右移n位&#xff0c;结果就是 x / 2^n&#xff1a;7 / 2 ^2 1;…

运行vue项目报DONE Build complete. The dist directory is ready to be deployed.解决办法

一、问题描述 今天在运行一个vue项目时发现运行途中报这样一个错误&#xff0c;经过查阅相关资料可知&#xff0c;这是dist文件夹下 二、解决办法 根据官方文档&#xff0c;目录需要启动一个 HTTP 服务器来访问 (除非你已经将 publicPath 配置为了一个相对的值)&#xff0c;所…

flex垂直方向布局与overflow结合使用

主要是需要留意 flex布局和overflow 之间的关系&#xff0c; 最外面的container 和 里面的main-box 之间分别使用了flex布局 和 overflow:hiddenmain-box 和 里面的main-body 之间分别使用了 flex布局 和 overflow:auto 有点类似于聊天的窗口布局 <!DOCTYPE html> <h…

zabbix监控远程主机

zabbix监控远程主机 在Zabbix服务器上安装Zabbix代理程序 在远程主机上安装Zabbix代理程序。安装方式取决于操作系统&#xff0c;可以从Zabbix官网上下载相应的安装包进行安装。 监控agent1 在agent1上安装agent yum install zabbix-agent另外在zabbix server上要关闭防火…

【前端知识】内存泄漏与垃圾回收机制 (上)

【前端知识相关分享】内存泄漏与垃圾回收机制 &#xff08;上&#xff09; 1. 内存的生命周期1.1 内存生命周期的一般流程1.2 C&#xff0c;JS和python内存分配和释放的区别 2. JS中的内存管理2.1 两种数据类型与两种内存一个思考2.2 两种内存空间的区别对比 3. 内存泄漏的定义…

HMM理论学习笔记-隐马尔可夫模型的三个元素、假设和问题

文章目录 概率论基础条件概率全概公式边缘概率联合概率联合概率与边缘概率的关系贝叶斯公式&#xff08;条件联合概率&#xff09;马尔科夫链的概念 HMM简述HMM的三个元素符号定义1、状态转移概率矩阵A2、观测概率矩阵B3、初始状态概率向量π HMM的三个假设1、齐次马尔可夫假设…

netstat命令解析

一、linux系统中netstat命令的帮助信息 └──╼ $netstat -h usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}netstat [-vWnNcaeol] [<Socket> ...]netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }-r, --route …

VMware12安装图解

目录 一、介绍VMware虚拟机 二、安装VMware12虚拟机 三、VMware虚拟机内部新建虚拟机 清理磁盘 一、介绍VMware虚拟机 VMware是一个虚拟机。 什么是虚拟机&#xff1f;字面意思‘虚拟’&#xff0c;那就不算是真的&#xff1b;‘机’可以理解为一台电脑或者一个电脑系统。…

SimpleDateFormat以及Date的使用

Date Date currentTime new Date(); 获取当前的时间 输出&#xff1a; System.out.println(currentTime); 就会以这样的格式输出 那我们不想要这样的格式&#xff0c;而是输出格式怎么办呢&#xff1f; SimpleDateFormat闪亮登场 食用方法&#xff1a; SimpleDateForma…

前端埋点采集到的数据怎么发送到服务端?

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 1. Image请求 2. Ajax请求 3. WebSocket 连接 1. Image请求 1. 通过 Image请求将采集的数据发送到服务器。这种方式比较适合少量数据的采集&#xff0c;因为 lmage请求不需要返回任何数据…