zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【CDC 设计】FPGA 跨时钟域设计方法

方法 设计 FPGA 时钟 CDC
2023-09-14 09:16:20 时间

目录

跨时钟域介绍

建立时间和保持时间

建立时间

保持时间

局部同步设计概念

跨时钟域的问题

同步化

多时钟域设计的分类

亚稳态

什么是亚稳态

引起亚稳态的原因

亚稳态对系统可靠性的危害

如何减少亚稳态的风险

单一时钟域内信号

跨时钟域的信号

同步化技术

同步器

同步器的分类

电平同步器

边沿检测同步器

脉冲同步器

同步器设计推荐的做法

使用同步器需要注意的问题

总线信号跨时钟域

保持寄存器和握手

FIFO

FIFO 写满和读空标志的产生

总结


 

跨时钟域介绍

当模块 A 以时钟 Clka 和模块 B 以时钟Clkb,进行数据交互时,两模块的数据时钟不同,如果直接相互传递数据,很可能会导致数据据再传输过程中出现错误:比如数据错误、遗漏、重复等。这时候就需要跨时钟域处理,让数据准确传递。

683510ee3edd4265a6d789ef6394670d.png

建立时间和保持时间

建立时间

Setup Time:时钟信号上升沿到来之前,输入信号数据需要维持一定时间的稳定状态,这个“一定时间”就是建立时间。

保持时间

Hold Time:时钟信号上升沿到来之后,输入信号数据也需要保持一定时间的不变,这个“一定时间”就是保持时间。

局部同步设计概念

跨时钟域的问题

  • 亚稳态
  • 同步失败

同步化

  • 同步器
  • 保持寄存器和握手
  • 异步 FIFO 设计

多时钟域设计的分类

全同步设计

  • 只有一个时钟

全异步设计

  • 没有时钟

全局异步,局部同步设计

  • 多个独立时钟域,同一时钟域内同步
  • 这是我们关心的多时钟域设计
  • 不可避免,单一时钟不能满足设计的需求

亚稳态

  • 什么是亚稳态
  • 引起亚稳态的原因
  • 亚稳态对系统可靠性的危害
  • 如何减少亚稳态的风险

什么是亚稳态

如图所示,当sys_clk时钟信号上升沿踩到Rx信号的变化间隙时,此时输出的Rx_reg1信号就会出现亚稳态,其输出信号就会出现震荡、毛刺或者固定在某一电压值,而不是等于D端输入的值,经过震荡之后,Q端会输出0或者1。这就会产生亚稳态。

1fa28f33bdca4f1e925680a8eb925990.png

02fca5780a374bbf8e34a72b26f9feef.png

引起亚稳态的原因

再数据跳变期间采样,建立时间或保持时间不满足

  • 跨时钟域的信号和同步时钟之间的关系不能确定
  • 单一时钟域内工具确保建立时间、保持时间,不出现亚稳态

亚稳态对系统可靠性的危害

同步失败、系统失败,按概率出现:发生概率可能达到可靠性要求无法接受的程度。

15fcc2471e2a418e8a266e6335f4e29c.png

如何减少亚稳态的风险

单一时钟域内信号

  • 工具检查每个触发器的建立时间、保持时间,确保其不出现亚稳态

跨时钟域的信号

  • 没有工具可以保证其可靠性
  • 静态时序分析其应该设置 False Path 约束
  • 只能靠逻辑设计来保证:同步化设计

同步化技术

根据跨时钟域信号的特点来选择同步化方法:

  • 同步器:控制信号
  • 保持寄存器和握手:地址或数据总线信号
  • 异步 FIFO 设计:数据总线信号

同步器

为什么使用两级寄存器(接收时钟域)

因为两级寄存是一级寄存概率的平方,两级并不能完全消除亚稳态危害,但是提高了可靠性,减少亚稳态发生的概率

一级寄存大概率无法改善亚稳态,三级寄存相对于二级寄存改善不大,所以二级寄存是最好的选择

同步器的分类

  • 电平同步器
  • 边沿检测同步器
  • 脉冲同步器

电平同步器

下图是电平同步器的原理图,可以看到对于两个时钟 clk1、clk2,再处理两个时钟的直接按的数据传输时,使用了两级寄存器进行数据同步,但是电平同步器只能对两个频率相同、相位不同的时钟之间进行处理,对于频率不同的时钟就无法处理。

868c3a49e6f544bfa5ef76d67d465770.png

边沿检测同步器

下图是边沿检测同步器,用于慢时钟域(clk1)到快时钟域(clk2)的同步处理。慢到快可能会使数据重复采集。解决办法:取沿电路:把上升沿即数据的变化转化成脉冲,然后让输出与寄存的输出取反相与,这样就可以检测出上升沿并将上升沿转换成脉冲。

b1c1770ecef64ec3a85d1ae99cd9e6a3.png

脉冲同步器

下图是脉冲同步器,用于快时钟域(clk1)到慢时钟域(clk2)的同步处理,快到慢可能会使数据出现遗漏采集,和边沿检测同步器有着相类似的原理。

4d5b1848124441188fd6de89062e9d6d.png

同步器设计推荐的做法

  • 同步器单独成模块,引入两个独立时钟
  • 其他模块都设计为单一时钟模块,完全同步模块
  • 以时钟域作为信号命名的前缀
  • 静态时序分析的时候,对同步器模块异步输入信号的谁当false path:用通配符

使用同步器需要注意的问题

  1. 原时钟域的寄存器和新时钟域的两个寄存器之间都不能有组合逻辑
  2. 快时钟域到慢时钟域
  3. 多位控制信号跨时钟域
  4. 总线信号跨时钟域

总线信号跨时钟域

如果直接使用同步器会带来某些问题

正确方法

  • 保持寄存器加握手信号
  • 异步 FIFO 设计

以上两种方法都要使用同步器

保持寄存器和握手

0fb0236b7ed446dfa038c484f4e94fd9.png

FIFO

同步 FIFO:写时钟和读时钟为同一个时钟

异步 FIFO:写时钟和读时钟为独立时钟

跨时钟域的数据信号需要用到异步 FIFO,隔离时钟域,匹配读写速度

FIFO 写满和读空标志的产生

读写指针比较产生

  • 同步 FIFO 直接把读写时钟比较或运算产生
  • 异步 FIFO 由于读写指针不同时钟域,比较前指针必须同步化
  • 由于二进制的指针会出现多位同时跳变,直接由同步器进行同步化会有问题

异步 FIFO 设计

根据 full 和 empty 产生方法分为:

  1. Binary Code 结合保持握手
  • 二进制寻址,二进制同步化后比较产生空满标志
  1. Gary Code 结合同步器
  • 二进制寻址,Gary码同步化后,比较产生空满标志
  • Gary码制寻址,Gary码同步化后,比较产生空满标志

总结

多时钟域设计不可避免

减少亚稳态的风险

工具不能保证,只能靠设计来保证

同步化技术的选用要结合具体的情况

  • 同步器
  • 保持和握手
  • 异步 FIFO