FPGA之跨时钟域问题
跨时钟域(Clock Domain Crossing, CDC)是指设计中存在着两个或两个以上异步时钟域,跨时钟域设计问题目前是逻辑设计者经常面临的问题,解决这类问题的方法被称为CDC技术,即跨时钟域技术。
时钟域
- 单一时钟域:所谓单一时钟域,是指只有一个独立的网络可以驱动整个设计中所有触发器的时钟端口。
- 时钟域:是指一组逻辑,这组逻辑中的所有同步单元(触发器、同步RAM块以及流水乘法器等)都使用同一网络作为时钟。
- 并不一定是FPGA只有一个外部时钟输入就是单时钟域了。例如逻辑门控可以产生时钟,同样PLL也可以产生多个时钟输出供内部逻辑使用,只不过PLL的输出时钟之间一般具有相关性。由于PLL产生了多个时钟输出,所以这样的设计也属于多时钟域设计。
- 上句话想表达的应该是输入给FPGA内部使用的时钟(由外部时钟分频或者门控等产生),如果是不同的时钟,那么就是多时钟域,如果只有一个时钟,那么就是单时钟域。
1、亚稳态及危害
- 对于沿触发的触发器来说,其输出存在两个有效的状态,即高和低(或者说逻辑1和逻辑0)。
- 触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口,如果触发器数据输入端口上的数据在这个时间窗口内发生变化(或者数据更新),那么就会产生时序违规。
- 存在这个时序违规是因为建立时间要求和保持时间要求被违反了,此时触发器内部的某个节点可能会在一个电压范围内浮动,无法稳定在逻辑0或者逻辑1状态。
- 从时序收敛的角度来说,两个触发器之间的组合逻辑延时要求小于最小的时钟周期,但这种亚稳态信号保持亚稳态的时间,本身就是变相增加了逻辑延时。
一般解决亚稳态有三种办法
1.相位控制
相位控制技术可以在一个时钟频率是另外一个时钟的整数倍,并且其中一个时钟可以由FPGA内部PLL或者DLL控制时使用。
2.多级寄存器
一般针对单bit控制信号跨越两个异步时钟传输,可以采用多级寄存器,俗称打拍。同步电路中的第一拍也许会产生亚稳态,但是信号有机会在其被第二级寄存器以及被其他逻辑看到之前稳定下来。常用的就是对单bit信号打两拍,这也是最简单、最常见的处理方式。
3.异步FIFO缓存
一般用于跨时钟域传输数据,写端和读端分别对应两个时钟域,由空/满信号控制着读写过程,实现数据的跨域传输。

常见的同步器是使用两级寄存器,即使用寄存器打两拍的方式进行同步。所谓的同步器就是采样一个异步信号,采样输出能够同步到到采样时钟的模块。
该方法一般用于同步慢速信号到快速时钟域,因为快时钟域是肯定可以采集到慢时钟域的数据的(如果快速时钟域的时钟频率是慢速时钟域的1.5倍以上,那么同步较慢的控制信号到一个快速时钟域通常来说不会有问题),所以需要解决的就是亚稳态的问题。
当然,仍然有可能级联的第二个寄存器输出还会表现为非稳定状态,但是这种双寄存同步器已经可以解决大部分亚稳态问题。在设计这种同步器的时候应当注意遵循以下原则:
级联的寄存器必须使用同一个采样时钟
发送端时钟域寄存器输出和接收端异步时钟域级联寄存器输入之间不能有任何其他组合逻辑。因为由于组合逻辑会产生毛刺,这样同步器很有可能采样到不需要的数据。



- 一个是开环解决方案,确保信号在无须确认的情况下可以被采集
- 另一个是闭环解决方案,即在跨时钟域边界时,信号需要接收端的反馈确认。



本文作者:大耳毛豆
本文链接:https://www.cnblogs.com/yjxmike/p/18726814
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期