设备时钟生成
在构建了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上使用,依此类推。 图3:单数据速率(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控制器通常很简单:只需生成
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡