跨时钟域为什么要双寄存器同步
随着设计规模的不断攀升,各种接口外设琳琅满目,时钟“满天飞”就不可避免(注意这里的“满天飞”不是滥用,意指时钟频率多、时钟扇出多)。而一个设计中,不同时钟频率之间你来我往更是在所难免。那么,这就出现了题目中的跨时钟域的同步问题?怎么办?十年不变的老难题。为了获取稳定可靠的异步时钟域送来的信号,一种经典的处理方式就是双寄存器同步处理(double synchronizer)。那为啥要双寄存器呢,一个不就够了吗?
先来看看,这张老得掉牙,经典得不能再经典的示意图。Aclk和bclk是两个不同的时钟域,bclk比aclk要稍微慢一点(哦,我的天哪,要用慢时钟采集快时钟的数据,又是一个难),与aclk同步的数据adat某个时钟周期拉高了(注意,只保持了1个时钟周期)。接下来,要用bclk时钟去采集只保持了一个aclk时钟周期的adat数据。理论上,这不符合奈奎斯特定律,很难成功,但是大家不要较真,这里重点不在这里。我们要关注的其实是那个不偏不倚bclk采样时(bclk时钟上升沿)正好对准了adat的下降沿(上升沿也类似),好开心,奈奎斯特老爷爷的定律被打破了。
数据采是采到了,但是不稳定,从模拟信号的角度看,bclk采集到的数据就是一个中间电平,到低最终判定是1还是0,很抱歉,看上去好像都不是。数字电路终归还是一个模拟电路搭起来的,真实世界都是骨感的(模拟的)。所以,你就看到,bclk时钟域的第一级采样时钟bq1_dat的输出波形起起伏伏,好在最终还是稳在了数字电平1或接近1的位置。如果bq1_dat直接在bclk时钟域被正常使用,后端就一个驱动扇出或许还好,可能就和示意图里第二级锁存bq1_dat的寄存器bq2_dat一样稳定了。但是,实际情况,可能我们要用这个bq1_dat去驱动多个扇出,那就十有八九要出问题,这个bq1_dat上的亚稳态恐怕还要继续传播给某些后级的寄存器,而这不是我们希望看到的。
那怎么办?解决方案有一个,用专门的寄存器bq2_dat对bq1_dat再锁存一拍,这么一来,就基本是稳定的了。还有一个问题,为啥就这么容易稳定了?前面提到了,bq1_dat的输出波形虽然起起伏伏,但最终一般还是会稳在要么接近0要么接近1的位置(在下一个时钟周期bq2_dat去锁存它的时候,更容易满足bq2_dat寄存器对建立和保持时间的要求),所以如果它本身的扇出路径单一的情况下,后级采样寄存器基本就能正常输出了。
另外,不得不再提一下MTBF(mean time between failures)的概念,一个基本的思想,就是同步寄存器级别越多,MTBF的概率越低,越不容易出问题。关于这个部分,大家可以去搜一下特权同学早期的文章,作为补充阅读。
https://www.eefocus.com/ilove314/blog/11-09/231565_715ed.html
最后,再来看看类似的跨时钟域的亚稳态在这2级寄存器同步后的个各种可能状况。
bq1_dat采样到adat的上升沿,最终bq1_dat稳定在0,bq2_dat也输出稳定的0。
q1_dat采样到adat的上升沿,最终bq1_dat稳定在1,bq2_dat也输出稳定的1。
1_dat采样到adat的下降沿,最终bq1_dat稳定在0,bq2_dat也输出稳定的0。
bq1_dat采样到adat的下降沿,最终bq1_dat稳定在1,bq2_dat也输出稳定的1。
最后,从特权同学的经验和实践的角度聊一下。
跨时钟域的信号同步到底需要1级还是2级,完全取决于具体的应用。如果设计中这类跨时钟域信号特别多,增加1级寄存器就等于增加逻辑资源,增加money。如果设计中的跨时钟域信号并非像前面的例子那样快速或实时变化,或者采样时钟频率远高于采样数据,并且我们也并不在意采样数据第1拍的取值,1级寄存器足矣。而对于控制信号,要特别谨慎,通常是比较建议采用2级寄存器同步。
另一个问题,按照判断应该采取2级寄存器的同步设计,设计中就用1级去实现,会怎样?一天、两天、一年、两年,或许都没有问题出现,如何解释?这本身是一个概率的问题,也和跨时钟域信号的故障敏感性有关(所谓故障敏感性,就是它真的出了问题,对系统的影响有多大,设计中是否有机制去检测)。但是,俗话说“常在河边走哪有不湿脚”,问题终究还是要暴露的,有时就像幽灵般转瞬即逝。
“鲁棒性”和“不过设计”都是一个优秀设计不可或缺的因素,我们还是建议认真审查设计,允许1级同步的就绝不堆料(浪费资源),需要2级同步的就不吝啬。
跨时钟域为什么要双寄存器同步相关推荐
- 跨时钟域信号传输问题之握手同步
所谓握手,即通信双方使用了专用控制信号进行状态指示,这个控制信号既有发送域给接受域的也有接收域给控制域的,有别于单向控制信号方式. 使用握手协议方式处理跨时钟域数据传输时,只需要对双方的 ...
- 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)
需要回答几个问题: 1.什么是异步FIFO,异步FIFO有什么功能? 跨时钟域的数据交换,防止亚稳态. 2.在产生写满与读空信号时需要进行跨时钟域如何做的,且如何能正确指示空满状态? 寄存器打两拍+格 ...
- 异步时钟引起的亚稳态问题和跨时钟域电路设计
本文总结由数字电路设计的异步时钟引起的亚稳态问题,并针对亚稳态问题提出的处理方法和跨时钟域电路设计方法.重点是分析由异步时钟引起的跨时钟域CDC问题,后续将会总结由复位引起的电路亚稳态问题. 一.亚稳 ...
- 同步电路与跨时钟域电路设计1——单bit信号的跨时钟域传输(同步器)
同步电路与全局异步电路 同步电路 同步电路的定义 即电路中的所有受时钟控制的单元(如触发器Flip Flop.寄存器Register),全部由一个统一的全局时钟控制. 例子: 两个触发器都受同一个时钟 ...
- 跨时钟域的数据同步,亚稳态,和相关电路设计方法
目录 同步时钟: 亚稳态: 双锁存器同步电路 单bit信号跨时钟域传播 边沿检测同步电路(慢时钟到快时钟) 脉冲同步器电路(快时钟到慢时钟) 结绳法1 结绳法2 结绳法3 多bit信号跨时钟域传播 多 ...
- 跨时钟域方法(同步器、异步FIFO、边沿检测器、脉冲同步器、同步FIFO)
目录 1.跨时钟域方法的原因 2.跨时钟处理的两种思路 3.跨时钟域分类--单比特信号跨时钟 3.1.1慢时钟---快时钟.(满足三边沿准则,有效事件可以被安全采样) 3.1.2慢时钟---快时钟.( ...
- 异步fifo_跨时钟域同步(异步FIFO)
本文使用 Zhihu On VSCode 创作并发布 跨时钟域同步(异步FIFO) 之前学习了跨时钟域下的单bit信号同步的方法,这些单bit信号多是作为控制信号或者标志信号来使用,再实际的项目中,处 ...
- FPGA跨时钟域异步时钟设计的几种同步策略
1 引言 基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免.如果对 ...
- FPGA笔记2——跨时钟域同步信号方法
亚稳态 触发器是FPGA设计中最常用的基本器件.触发器工作过程中存在数据的建立(setup)和保持(hold)时间.对于使用上升沿触发的触发器来说,建立时间就是在时钟上升沿到来之前,触发器数据端数据保 ...
最新文章
- 网络推广计划浅析外链发布要遵循的几点小技巧!
- 汇编指令 DUP指令
- 别找了,这才是 Pyecharts 的正确打开方式!
- Vue项目中使用svg文件
- linux通过c语言编程访问远程mysql
- Vue2.0项目中使用sass(踩坑之路)
- 基于SharePoint 的企业信息平台架构
- bzoj4974: [Lydsy1708月赛]字符串大师
- 【sklearn第二十八讲】验证曲线
- 数据结构一些自己没搞懂的点
- Axure 8 团队协作
- 关于音频EQ、DRC、等响度、3D环绕音、虚拟低音、变音、AEC、AGC、ANS等解释
- java 回调方法是什么意思_java什么是回调
- execl函数的用法
- 羊皮卷-选择的力量(二)
- 阿里云服务器被入侵执行MoneroOcean(门罗币)挖矿脚本
- chrome浏览器的下载地址
- HTML中em标签的用法
- 英特尔 CPU 惊天漏洞事件完全详解
- 因果分析系列7--分组和虚拟变量回归