设备时钟生成 (2025)

2026-06-12 1 阅读 mfiguiere
在构建了 CPU、用于处理总线互连的实用程序、多个 DMA 和内存控制器之后,我经常发现自己的时间集中在构建设计和外部外设之间的接口上。这似乎是我大部分业务的落脚点。通常,这些外设需要来自设计的时钟输出,因此我想花一些时间来描述如何生成这样的“设备”时钟。图 1. 带外设的基本 SOC 在使用现代高速外设设计时,实际上有两个主题需要讨论。其中之一是生成要发送到外设的时钟,如上面的图 1 所示。第二个涉及处理从外设返回的时钟,如下图 2 所示。这是 DDR 内存、eMMC、HyperRAM 甚至 NAND 闪存协议等高速设计的关键组件。我们稍后需要再讨论第二个主题。图 2. 使用时钟返回的数据 今天,我想讨论如何生成时钟来控制设备交互。我第一次遇到这个问题是在构建 NOR 闪存控制器时,首先基于 SPI 接口,后来又基于 Quad SPI 接口。我的控制器是为 FPGA 设计的,因此可以使用单一频率构建时钟。这种设计增加了复杂性,即时钟需要不时暂停。具体来说,当没有发生任何事情时,需要关闭时钟。同样,在降低(即激活)片选引脚后需要关闭时钟一个周期,以及在事务完成后但在升高(停用)片选引脚之前关闭时钟几个周期。在控制 HyperRAM 时,我必须处理类似的问题,但是……当我(尚未)准备好正确处理返回时钟时,该设计失败了。我确实说过这本身就值得一篇文章,不是吗?正确处理返回时钟上的数据可能是一个挑战。然后我为 ASIC 平台构建了类似的设计。与 FPGA 不同,最终时钟速度只有在运行时才能知道。设计可能以较慢的时钟速度开始,后来在运行时加速到全速率。与可以稍后修复的 FPGA 不同,ASIC 工作确实没有失败的余地。至少对于 FPGA,如果我的主板不支持特定频率,我可以根据它支持的时钟频率重建设计。然而,这对于 ASIC 来说不起作用,因为当您决定将其连接到比您设计的部件慢的部件时,稍后重建设计的成本往往会过高。我的下一个设计是 NAND 闪存设计。 NAND 闪存可能是一个挑战,因为协议要求您以较慢的频率启动,只有在建立连接后才允许更改为更快的频率。这种特殊的设计是为 ASIC 环境构建的,因此它依赖于生成我需要的所有时钟的模拟组件。这种方法非常有效,直到有人想要购买该设计以在 FPGA 上运行,然后另一个人希望它在 FPGA 上运行,然后还有人希望它能在 FPGA 上运行,等等。图 3. 单数据速率 (SDR) 与双数据速率 (DDR) SDR DDR 问题更加复杂,许多协议需要在时钟的两个边沿进行数据转换,这种协议通常称为“双数据速率”(DDR)。与上述其他设计不同,这些设计通常需要与数据偏移 90 度的时钟,以便每个时钟转换发生在每个数据有效窗口的中间,而不是在窗口的边缘。这种“偏移”时钟对于保证从外设内的建立和保持时间是必要的。图 3 显示了 DDR 所需的时钟和数据关系的示例,而不是传统的“单数据速率”(SDR) 时钟。当我到达 SDIO/eMMC 控制器时,我想我终于解决了时钟分频问题。 SDIO 控制器需要以 400kHz 的速度启动 SD 卡,然后根据卡、PCB 和控制器的不同,速度可能会提高到 25MHz、50MHz、100MHz 甚至 200MHz。当没有任何内容可发送或接收时,或者当 SOC 无法将数据加载或卸载到控制器时,时钟也可能会停止。例如,您可能要求 SD 卡读取并生成许多数据块,然后将这些块中的前两个读入内部缓冲区,却发现 CPU 耗尽这些缓冲区的速度很慢。在这种情况下,您需要在外部卡尝试向您发送无处可去的第三个数据块之前停止接口时钟。其他设备需要用户可编程设备时钟控制器,例如: 10M/100M/1Gb 以太网控制器 虽然每种速度可能使用单个时钟,但构建真正的三模控制器需要一些额外的工作。 (DDR) SDRAM 控制器 从 FPGA 的角度来看,SDRAM 控制器往往很简单:只需生成一个