解析FPGA跨时钟域处理方法
扫描二维码
随时随地手机看文章
只要FPGA设计中的所有资源不全属于一个时钟域,那么就可能存在跨时钟域问题,因为异步逻辑其实也可以看做一种特殊的跨时钟域问题。发生跨时钟域问题的必要条件是不同时钟域之间存在信息交互,如果一个FPGA设计中存在多个时钟域的话,这几乎是无法避免的,否则各个时钟域互不相关,那么就相当于把原设计分解为多个独立的小设计,这样的话FPGA设计的功能就无法通过协作来扩展。
那么当两个不同时钟域之间进行信息交互的时候,到底会存在什么问题呢?
首先介绍亚稳态:
触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口,如果触发器的数据输入端口上数据在这个时间窗口内发生变化(或者数据更新),那么就会产生时序违规。存在这个时序违规是因为建立时间要求和保持时间要求被违反了,此时触发器内部的一个节点(或者要输出到外部的节点)可能会在一个电压范围内浮动,无法稳定在逻辑0或者逻辑1状态。换句话说,如果数据在上述窗口中被采集,触发器中的晶体管不能可靠地设置为逻辑0或者逻辑1对应的电平上。所以此时的晶体管并未处于饱和区对应的高或者低电平,而是在稳定到一个确定电平之前,徘徊在一个中间电平状态(这个中间电平或许是一个正确值,也许不是)。
在 FPGA 设计 中,如果一个工程包含多个时钟,正确的时钟匹配和跨时钟域处理至关重要,否则可能会导致亚稳态问题、数据损坏或系统错误。以下是几种常见的方法来处理多个时钟:
1. 确定各个时钟的关系
首先,需要分析时钟之间的关系:
同步时钟(有共同的时钟源,如 PLL 产生的不同时钟):可以直接在时序约束中定义多时钟域。异步时钟(无共同源,例如不同模块由不同时钟驱动):需要跨时钟域处理。2. 处理多个时钟的方法
方法 1:使用 PLL / MMCM 进行时钟同步
适用于多个时钟频率相关的情况(如 100MHz 和 50MHz 来源于同一 200MHz PLL)。
使用 PLL(Phase-Locked Loop)或 MMCM(Mixed-Mode Clock Manager) 生成多个相关时钟,并确保它们是同步的。在时序约束(SDC 文件或 XDC 文件)中正确指定多时钟域。使用 时钟缓冲器(BUFG, BUFGCE, BUFHCE) 以减少时钟偏斜(Clock Skew)。方法 2:跨时钟域信号处理(CDC 处理)
适用于异步时钟(不同来源)的情况
① 单比特信号:使用双/多级寄存器同步
用于跨时钟域的单个信号(如复位、使能信号等)
原理:使用两个或多个级联的 D 触发器(DFF) 进行同步,以消除亚稳态。② 多比特数据:使用 FIFO 进行数据缓冲
适用于异步时钟域之间的数据传输
FIFO(First-In-First-Out 缓冲器) 具有独立的 写时钟 & 读时钟,适用于跨时钟域传输数据。例子:写端口 用 clk_A 作为时钟,写入数据。读端口 用 clk_B 作为时钟,读取数据。FPGA 里常用的 FIFO:Xilinx: xpm_fifo_asyncIntel (Altera): scfifo③ 跨时钟域握手机制(Handshake)
适用于小数据量但需高可靠性的跨时钟通信
双时钟握手协议:发送方等待接收方的 ack 信号,确保数据已被正确接收。Gray Code(格雷码):用于跨时钟域的 地址传输,避免跳变时数据错误。3. 时序约束(Timing Constraints)
在 FPGA 设计中,必须正确设置多时钟的时序约束,否则可能会导致不稳定的行为。
处理时钟域跨越问题的方法
1. 同步器
双边沿触发器同步器:将异步信号转换为与目标时钟对齐的双边沿触发器信号。
三态同步器:通过三态门实现信号跨域同步。
2. 握手协议:使用握手协议确保数据在跨越时钟域传输时的正确性,如使用握手信号来控制数据的有效性和接收阶段。
3. FIFO缓冲区:在不同时钟域之间使用FIFO缓冲区进行数据传输,以平衡不同时钟频率带来的速度不匹配。
4. 时钟插补:使用时钟插补技术,通过插入额外的时钟周期来调整不同时钟域之间的时序关系,缓解时钟域跨越问题。
5. 异步FIFO:异步FIFO可以在不同时钟域之间进行高效的数据传输,通过自适应的方式解决不同时钟频率之间的速度差异。
6. 严格的规范约束:制定严格的时序分析和布线规则,避免设计中出现时序失真,减少时钟域跨越问题的可能性。
应用举例
串口通信:处理串口数据传输时,需要处理串口接收和处理时钟信号的时钟域跨越问题。
多核处理器:在多核处理器系统中,不同核心的时钟频率可能不同,需要处理时钟域跨越问题。
深度学习加速器:在人工智能领域的FPGA设计中,处理神经网络计算单元与整体时钟域的同步问题。
时钟域跨越问题是复杂FPGA设计中常见的挑战之一,需要仔细设计和有效的解决方案来确保系统的稳定性和正确性。通过合理的设计和采用适当的技术手段,可以有效地处理时钟域跨越问题,提高FPGA系统的可靠性和性能。
在实际应用中,工程师需要深入理解各种时钟域跨越问题的原因和可能导致的后果,结合具体的设计需求和约束条件选择合适的解决方案。同时,进行严格的时序分析、仿真验证和布局布线规划也是避免时钟域跨越问题的重要步骤。