目录

  • 跨时钟域处理

    • 1. 异步时序定义
    • 2. 亚稳态
    • 3. 同步策略
      • 方法一:双锁存器
      • 方法二:握手信号(结绳法)
      • 方法三:异步双口RAM+格雷码

跨时钟域处理

为了彻底理解跨时钟域问题,多方搜集资料,做个简单整理备忘。主要参考了如下几个资源:

  1. https://zhuanlan.zhihu.com/p/45186793 跟IC君一起学习集成电路
  2. https://www.cnblogs.com/PG13/p/10329678.html 新芯时代
  3. 格雷码 https://www.cnblogs.com/zhuruibi/p/8988044.html
  4. 主要参考来源:“ASIC 中的异步时序设计” 王夏泉 华中科技大学

1. 异步时序定义

异步时序设计指的是在设计中有两个或以上的时钟, 且时钟之间是同频不同相或不同频率的关系。而异步时序设计的关键就是把数据或控制信号正确地进行跨时钟域传输。

2. 亚稳态

每一个触发器都有其规定的建立(setup)和保持(hold)时间参数, 在这个时间参数内, 输入信号在时钟的上升沿是不允许发生变的。 如果在信号的建立时间中对其进行采样, 得到的结果将是不可预知的,即亚稳态。

触发器进入亚稳态的时间可以用参数 MTBF(mean time between failures)来描述, MTBF即触发器采样失败的时间间隔,其公式描述如下:

\[ MTBF = e^{t_r/\tau}/T_0fa\]

其中:

  • \(t_r\) = 分辨时间(时钟沿开始)
  • \(\tau,T_0\) = 触发器参数
  • \(f\) = 采样时钟频率
  • a = 异步事件触发频率

对于一个典型的 0.25µm 工艺的 ASIC 库中的一个触发器,我们取如下的参数:

tr = 2.3ns, τ = 0.31ns, T0 = 9.6as, f=100MHZ, a = 10MHZ, MTBF = 2.01 days

也就是说触发器以100MHZ工作,我们用10MHZ的频率去不停地采它的数据,则每两天就可能采集到一次亚稳态(个人理解,如有误请指正)。如果使用单锁存器同步:

b的时钟上升沿采集a的数据时很可能采到亚稳态数据。

3. 同步策略

方法一:双触发器

为了避免亚稳态,应该使得MTBF尽量大。采用双触发器可以改善这一问题:

当使用了双触发器以后, b_dat2 的MTBF由以下公式可以得出:
\[MTBF = e^{(tr/τ)}/ T_0fa × e^{(tr/τ)}/ T_0fa\]
如果我们仍然使用上一节所提供的参数,则b_dat2 的MTBF为 **9.57*109(years)**。由上述结果可以看出,双锁存器法可以消除亚稳态问题。

注意问题1

时钟域B两级同步的寄存器跟时钟域A的输出寄存器之间不能有组合逻辑。组合逻辑电路各个输入信号的不一致性以及组合逻辑内部路径的延时时间不一样,运算后的信号存在毛刺如图(2),我们无法预先知道CLKB 的上升沿何时会到来,CLKB 采样到的信号就无法预知。

因此,要想CLKB 能采到稳定的信号,时钟域A的信号必须是经过CLKA 敲过,在一个时钟周期内是稳定的信号,如图(3)所示:

注意问题2

Clock-gating enable 信号没有经过异步处理:

在下图中a_in 信号经过CLKA的DFF敲过,再送到两级DFF 同步器处理,完全没毛病。但是F2的使能信号EN是从时钟域A来的,当EN信号变化的时候,由于时钟域不一样,无法保证使能之后的CLKB信号采样数据时满足setup/hold time 要求,这时F2输出信号也就变得无法预测了。因此对clk gating的信号也要做处理。

方法二:握手信号(结绳法)

如果a_clk的频率比b_clk频率高,将可能会出现因为dat变化太快而使b_clk无法采到的问题。即在信号从快时钟域向慢时钟域过渡的时候, 如果信号变化太快, 慢时钟将可能无法对该信号进行正确采样, 如下图所示。 所以在使用双锁存器法的时候, 应该使原始信号保持足够长的时间, 以便另一个时钟域的锁存器可以正确的对其进行采样。

下面介绍一种“结绳法”,适合任何时钟域的过渡:

其中标明_clk1 的信号表示该信号属于 clk1 时钟域, 同理标明_clk2 的信号表示该信号属于 clk2 时钟域。在两次src_req_clk1 之间被 src_vld_clk1“ 结绳” (pluse2toggle),在将src_vld_clk1 用双锁存器同步以后, 将该信号转换为 dst_req_clk2(toggle2pluse)。同理,用dst_vld_clk2 将 dst_req_clk2“结绳”, dst_vld_clk2 表明在 clk2 时钟域中, src_dat_clk1 已经可以进行正确采样了。 最后将 dst_vld_clk2 转换为 dst_ack_clk1(synchronizer and toggle2pluse), dst_ack_clk1 表明 src_dat_clk1 已经被 clk2 正确采样了, 此后 clk1 时钟域就可以安全地传输下一个数据了。 可以看出,“结绳法” 关键是将信号结绳以后, 使其保持了足够长的时间,以便另一个时钟可以正确地采样。

电路图如下:

上图描述了握手协议的完整流程,其中三角带横线的符号是异或门。同时给出了两个脉冲之间结绳信号(vld信号)的产生方法。

  • 优点:“结绳法” 可以解决快时钟域向慢时钟域过渡的问题, 且其适用的范围很广。
  • 缺点:实现较为复杂,特别是其效率不高,在对设计性能要求较高的场合应该慎用。

下图是一种更加直观的描述:

脉冲信号一般是通过上升沿采样实现的。

方法三:异步双口RAM+格雷码

处理多bit数据的跨时钟域,一般采用异步双口RAM。假设我们现在有一个信号采集平台,ADC芯片提供源同步时钟60MHz,ADC芯片输出的数据在60MHz的时钟上升沿变化,而FPGA内部需要使用100MHz的时钟来处理ADC采集到的数据(多bit)。

在这种类似的场景中,我们便可以使用异步双口RAM来做跨时钟域处理。先利用ADC芯片提供的60MHz时钟将ADC输出的数据写入异步双口RAM,然后使用100MHz的时钟从RAM中读出。

但我们读出RAM中的数据时,肯定不是一上电就直接读取,而是要等RAM中有ADC的数据之后才去读RAM。这就需要100MHz的时钟对RAM的写地址进行判断,当写地址大于某个值之后再去读取RAM。

在这个场景中,其实很多人都是使用直接用100MHz的时钟对RAM的写地址进行打两拍的方式,但RAM的写地址属于多bit,如果单纯只是打两拍,那不一定能确保写地址数据的每一个bit在100MHz的时钟域变化都是同步的,肯定有一个先后顺序。如果在低速的环境中不一定会出错,在高速的环境下就不一定能保证了。所以更为妥当的一种处理方法就是使用格雷码转换。

格雷码简介

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。格雷码(Gray Code)又称Grey Code、葛莱码、格莱码、戈莱码、循环码、反射二进制码、最小差错码等。

格雷码有多种编码形式

十进制数 4位自然二进制码 4位典型格雷码 十进制余三格雷码 十进制空六格雷码 十进制跳六格雷码 步进码
0 0000 0000 0010 0000 0000 00000
1 0001 0001 0110 0001 0001 00001
2 0010 0011 0111 0011 0011 00011

表中典型格雷码具有代表性。若不作特别说明,格雷码就是指典型格雷码,它可从自然二进制码转换而来。

二进制格雷码的生成方法有很多,具体可自行搜索或见:

https://www.cnblogs.com/zhuruibi/p/8988044.html

回到刚才的问题,多比特利用双寄存器打两拍在高速场合不再适用,而使用格雷码可以将这种多比特变为单比特传输(格雷码每次变化只有一位会变)如果先将RAM的写地址转为格雷码,然后再将写地址的格雷码进行打两拍,之后再在RAM的读时钟域将格雷码恢复成10进制。这种处理就相当于对单bit数据的跨时钟域处理了。

异步FIFO

使用异步双口ram的场合其实用异步fifo也是一样的。

使用场景:在有大量的数据需要进行跨时钟域传输, 并且对数据传输速度要求比较高的场合 。

一个异步 FIFO 一般由如下部分组成:
1. Memory, 作为数据的存储器;
2. 写逻辑部分,主要负责产生写信号和地址;
3. 读逻辑部分,主要负责产生读信号和地址;
4. 地址比较部分,主要负责产生 FIFO 空、满的标志。

异步FIFO代码可以参考我的另一篇文章:

https://blog.csdn.net/darknessdarkness/article/details/104726798

跨时钟域处理方法总结相关推荐

  1. FPGA跨时钟域处理方法延迟法

    1.1 FPGA跨时钟域处理方法延迟法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA跨时钟域处理方法延迟法: 5)结束语. 1.1.2 本节引言 " ...

  2. FPGA跨时钟域处理方法FIFO

    1.1 FPGA跨时钟域处理方法FIFO 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA跨时钟域处理方法FIFO: 5)结束语. 1.1.2 本节引言 &quo ...

  3. 跨时钟域电路设计方法

    在数字电路设计过程中 ,难免会遇到某个信号需要跨越不同时钟域的情况. 如果对跨时钟域的信号不做妥善的处理,跨越时钟域后,信号可能发生亚稳态,传播亚稳态,导致电路工作异常.并且,由跨时钟域处理不当引发的 ...

  4. 【读书笔记】Verilog的亚稳态现象和跨时钟域处理方法

    书※目:FPGA深度解析_第七章_樊继明著     高级FPGA设计结构.实现和优化_第六章_孟宪元译 文章目录 一.亚稳态 (1)跨时钟域的亚稳态现象 (2)亚稳态的多径传输 二.跨时钟域处理 2. ...

  5. FPGA跨时钟域处理的三大方法

    跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课.如果是还在校的本科生,跨时钟域处理也是面试中经常常被问到的一个问题. 在本篇文章中,主要介 ...

  6. FPGA笔记2——跨时钟域同步信号方法

    亚稳态 触发器是FPGA设计中最常用的基本器件.触发器工作过程中存在数据的建立(setup)和保持(hold)时间.对于使用上升沿触发的触发器来说,建立时间就是在时钟上升沿到来之前,触发器数据端数据保 ...

  7. 跨时钟域(CDC)设计方法之多bit信号篇(一)

    写在前面 本博客所有CDC相关的内容:跨时钟域(CDC)设计汇总 1.跨时钟域处理方法的分类 信号的跨时钟域传输可能会引入亚稳态问题,那么就需要想办法对其进行处理,从而降低亚稳态发生的概率(即提高MT ...

  8. 解决跨时钟域问题的三大方法

    跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课.如果是还是在校的学生,跨时钟域处理也是面试中经常常被问到的一个问题. 在本篇文章中,主要介 ...

  9. 异步fifo_数字IC校招基础知识点复习(五)——跨时钟域涉及part2(异步FIFO)

    1.跨时钟域设计(CDC)-part 2 在上一篇中我们主要关注的是单比特的控制信号,而对于多比特信号的跨时钟域传输则需要一些其他的手段. 首先需要明确的是,一般不采用对多比特信号中的每个比特单独使用 ...

最新文章

  1. 光伏产业链遭致命伤:补贴下调或结束暴利
  2. python (3.5)字符串 持续更新中………………
  3. (JAVA学习笔记) 类的继承,super,方法的重写,多态
  4. linux 压缩文件小,技术|在 Linux 上压缩文件的 5 种方法
  5. ASP.NET技巧(收集)
  6. study of javaserver faces lifecycle
  7. 深信服何朝曦:托管云为用户上云提供第三种选择
  8. android模拟器默认位置的修改
  9. [ZT]firefox实现ie的方法和属性)
  10. python可以体现数学中映射概念的是_【课时27+集合+在我的世界里+你就是唯一】 - #1...
  11. oracle中常用的时间格式转换
  12. ireport交叉报表 crosstab排序_质性数据分析软件NVivo教程:交叉表查询
  13. vsftp客户端_vsftp 如何登陆?
  14. 在Windows XP中如何释放并重新获得一个IP地址?
  15. QQ音乐sign解密以及排行榜完整歌曲数据
  16. Lombok插件下载与离线安装
  17. L2-016 愿天下有情人都是失散多年的兄妹 (25分)
  18. WEB-QTP随想录—李密的猜想
  19. 典型的DOS攻击技术
  20. op手机计算机记录怎么找回,怎么定位被盗的oppo手机并查看其位置

热门文章

  1. JAVA SE基础知识总结
  2. 2013校园招聘-阿里巴巴-笔试真题
  3. 英语基础语法(10) 直接引语和间接引语
  4. 【原创】关于西门子S120 的电气图纸设计
  5. dva + antd 报错
  6. 2008 云南大学软件学院创新软件大赛
  7. angularjs实现行事历
  8. BUU pingpingping WP
  9. JAVA+SQL办公自动化系统(源代码+论文+外文翻译)
  10. 姚期智:呼之欲出的量子计算机,和它漫长的最后一英里(全文)