在 FPGA 设计中,时钟分频是最常见、也是最基础的功能之一。根据应用需求的不同,实现时钟分频的方法也有所区别。对于简单的整数分频,通常可以通过逻辑电路中的计数器来实现;而对于更复杂的需求,例如倍频或小数分频,则往往需要借助 锁相环(PLL) 或 混合模式时钟管理器(MMCM) 等专用时钟管理模块。

在之前的讨论中,我们已经介绍过两种利用专用时钟资源进行分频的方法:在 7 系列 FPGA 中可以使用 BUFGCE 实现时钟分频,而在 UltraScale 架构 中则可以通过 BUFGCE_DIV 完成类似功能。这类方案的优势在于,它们能够在不占用额外逻辑资源、也无需使用 PLL 或 MMCM 的情况下完成时钟分频,从而为设计提供一种更加高效、简洁的实现方式。

然而,我们尚未研究的一种时钟资源是 BUFR,它在 7 系列器件中也提供了时钟分频功能。
在了解 BUFR 的用途之前,有必要快速回顾一下 7 系列时钟架构。
7系列时钟区域
每个 7 系列 FPGA 内部都被划分为多个时钟区域。每个时钟区域通常有 50 行 CLB,包含专用时钟资源以及逻辑和专用模块,例如 IO、ISERDES、OSERDES、BRAM 和 DSP 元件。
我们在之前探讨基于 BUFG 的时钟划分时已经了解过全局时钟网络,它能够将时钟分配到器件的所有时钟区域。为了支持多时钟设计,FPGA提供了多种全局时钟网络。
这些全局时钟可能源自:
具备时钟功能的 I/O 引脚
时钟管理模块(MMCM 或 PLL)
区域时钟缓冲器
Fabric logic
每个时钟区域内还有几种可用的区域时钟资源:
BUFIO –一种用于为高速 I/O 逻辑提供时钟的 I/O 时钟缓冲器。BUFIO 可以驱动 ISERDES 和 OSERDES 等 I/O 结构,但不能驱动 CLB 逻辑。它通常用于源同步接口,在这些接口中,I/O 必须以高于结构逻辑的频率运行。
BUFH –水平时钟缓冲器,能够在单个时钟区域内驱动水平时钟主干。
BUFR –一个区域时钟缓冲区,能够将时钟分发到整个时钟区域内的资源。
BUFR 时钟分频
BUFR 提供了一个有用的功能:它可以将输入时钟按 1 到 8 之间的因子进行分频。
这种功能对于源同步接口尤其有用,因为一旦数据被解串行化,IO 就可以以更高的频率运行,而Fabric Logic则以分频时钟速率运行。
为了探索这种行为,我们可以创建一个简单的设计,实例化几个 BUFR 原语,每个原语都配置为不同的除法比率。
当我们仿真该设计时,我们可以观察到每个分频比产生的输出时钟。

首先也是最明显的观察结果是,对于偶数分频比,所得时钟的占空比为 50:50。
然而,对于奇数分频比,占空比并非完全对称。时钟周期的一半包含一个额外的输入时钟周期,导致占空比略微不对称。
BUFR旁路模式BUFR 的另一个重要应用是旁路模式。
乍一看,这似乎相当于将除数配置为除以 1,但实际上行为略有不同。
当 BUFR 配置为旁路模式时,分频器将被完全跳过,并且 CE(时钟使能)和 CLR(清除)控制信号将被忽略。在此模式下,BUFR 充当一个简单的区域时钟缓冲器。
当配置为 1 分频时,时钟不会被分频,但 CE 和 CLR 控制仍然有效。
由于在旁路模式下分频逻辑被完全旁路,时钟路径的延迟略低。虽然差异很小,但在使用高速接口时却可能很重要。
分发 BUFR 时钟
虽然 BUFR 主要用于驱动 区域时钟网络(regional clock network),但如果需要将该时钟分布到整个 FPGA 器件中,也可以将 BUFR 的输出连接到全局时钟缓冲器(BUFG)。
通过这种方式,就可以把 BUFR 分频后的时钟 转发到 全局时钟网络,从而在 本地时钟区域之外的逻辑中使用该时钟。
总结
在 7 系列 FPGA 中,BUFR 是一种非常实用但经常被忽视的时钟资源。它内置的时钟分频功能,使得设计人员可以在 时钟区域内部轻松生成较低频率的时钟。
这种方法具有明显优势:
不会消耗 fabric logic资源
不需要使用 MMCM 或 PLL
实现简单且效率高
因此,在需要进行 区域时钟分频 的设计中,BUFR 往往是一种非常值得考虑的解决方案。
和往常一样,本文的示例代码可以在GitHub上找到。

扫码加微信直接与工作人员沟通