FPGA中的时钟域问题
一、时钟域的定义
所谓时钟域,就是同一个时钟驱动的区域。这里的驱动,是指时钟刷新D触发器的事件,体现在verilog中就是always的边沿触发信号。单一时钟域是FPGA的基本组成部分,但是随着设计规模扩大,多时钟域的设计是必要的。维持庞大的单时钟域对时钟源的要求是极为苛刻的。数字电路系统一般采用时钟分区和时钟网络来保证时钟到达每个单元的时间基本一致,但是,随着设计规模的扩大,时钟网络也变得极为复杂,且同步效果变差。所以,进行多时钟域设计是必要的。
二、Altera中PLL的时钟管理
Altera中可以使用PLL将输入时钟分为多个时钟域,以便实现不同时钟域的驱动。门控时钟也可以产生不同的时钟域(虽然不推荐,但是在简单的设计中是可以实现的)。在TimeQuest中默认所有时钟都是关联的,对于无数据交换的时钟域,需要设置伪路径来满足时序条件。对于PLL的输出时钟,可以使用多周期路径约束,就是对输入时钟约束后对PLL所有输出时钟进行约束。
三、单比特信号跨时钟域
(1)跨时钟域(CDC)技术
在不同的时钟域之间设计需要使用CDC技术,其难点在于EDA工具无法发现这个问题,STA进行独立的时钟域分析,需要伪路径或者多周期路径实现关联后才能实现跨时钟域的分析。这就要求设计者在设计之初就很好的考虑这个问题。
(2)亚稳态及其危害
时钟边沿前有建立时间,后有保持时间,一旦违反两个要求之一,就发生时序违规。违规的后果就是产生亚稳态,即电平处于逻辑0和1之间的状态,可能产生逻辑错误。亚稳态持续的时间和具体的时钟有关。
(3)亚稳态的解决方法1-双触发
在跨时钟域的设计中,有两种情况:
保证数据精确识别,牺牲部分数据;
保证数据完整识别,牺牲部分时间。
两种情况都需要同步器。常用的同步器就是两级级联寄存器。第一级寄存器将采样变化数据的信号缓存,有第二级寄存器读出亚稳态的信号。实际上,亚稳态并没有由于同步器消除,只不过降低了亚稳态出现逻辑错误的可能。
(4)三级触发器
亚稳态出现错误的间隔时间(MTBF)是对同步器性能的描述。故障间隔时间越长,同步效果越好。使用三级触发器要比二级触发器的效果要好。
(5)如何同步快速信号到慢速信号
前面的多级触发器同步器可以有效处理从低速信号传输到高速信号,但是对于高速信号传输到低速信号,则需要其他的结构实现同步。
1️⃣开环方案,即将高速信号展宽,大于低速信号的1.5倍为好。该方案无需握手,是用于时钟频率固定且信号可分析的设计中。
2️⃣闭环方案,将时钟域之间做成握手通信模型,优势在于保证信号采样正确,缺点在于时间等待长,需要信号保持足够长的时间。
四、多比特信号跨时钟域
(1)融合多比特信号为单比特信号
某些多比特信号之间存在关联性,使用单比特信号即可满足设计的要求。这时候对信号进行融合,可以有效地保证信号的稳定性。
(2)多周期路径规划
就是加入同步信号,保证数据完整读取的时机是正确的,进而确保数据完整。是一个单向握手模型。
五、使用fifo处理多比特跨时钟域信号
异步fifo支持不同周期的时钟写入和读取,可以将多比特信号暂存后在读取,保证数据完整。使用异步fifo需要考虑写入速率、读取速率和最大序列尺寸。
六、多时钟域设计分区
设计分区,就是将不同时钟域划分为不同的区域,分别进行时序分析。同步器单独作为一个分区,不做时序分析(存在时序违规,但是可以自我调整的模块)。这样可以加快时序分析的效率和时序报告的明确性。
分区后的时序分析也是基于这个方案的,注意在设计时忽略同步器的路径时序。
七、门控时钟行波时钟的处理
(1)行波时钟和门控时钟
行波时钟:寄存器驱动的时钟
门控时钟:组合逻辑生成的时钟
(2)处理原则
尽量不适用衍生时钟,使用PLL锁相环或者数字锁相环实现时钟产生。
实在使用了就尽量不要有跨派生时钟域的数据同步。
Altera器件出现保持时间问题可以利用软件自动布线延时来保证保持时间的合理。
Altera中可以使用ALTCLKCTRL这类的时钟处理IP实现时钟的派生,可以避免派生时钟的时序问题。
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:绿叶落秋风,专注FPGA技术分析和分享,转载请注明原文链接:https://www.cnblogs.com/electricdream/p/13620863.html,文中资源链接如下:
1. GITHUB开源仓库