生成设备时钟是FPGA与ASIC设计中连接外设的关键环节,不同协议对时钟频率、启停规则和相位偏移有截然不同的要求。以SDIO/eMMC为例,协议要求从400kHz启动,待链路建立后再逐步提升至25MHz、50MHz、100MHz甚至200MHz,而时钟还需要在数据缓冲区满时暂停,避免溢出。
背景与设计挑战
时钟生成的核心矛盾在于:FPGA环境允许事后修改设计匹配特定频率,但ASIC一旦流片就无法更改,必须提前覆盖所有目标工况。例如NOR flash控制器需要时钟在片选信号激活后暂停一个周期,交易完成后再停留若干周期才能释放——这类时序细节直接影响接口稳定性。HyperRAM设计则因为未正确处理返回时钟而失败,作者指出返回时钟的处理是高速设计(DDR、eMMC、NAND)的另一个关键课题。
对于DDR协议,数据在时钟双沿触发,因此需要时钟相位比数据偏移90度,确保每个时钟沿落在数据窗口中央,从而满足建立和保持时间。这一要求比传统SDR时钟复杂得多。
常见场景与适配方案
- NAND Flash:启动阶段必须使用慢时钟,连接建立后才能切到高速,且ASIC环境依赖模拟时钟生成器,但FPGA移植时缺乏相同组件。
- SDIO/eMMC:支持频率动态切换和时钟暂停,控制器需在SOC无法及时处理数据时暂停时钟,防止外设继续发送。
- Ethernet:10/100/1000M三种速率虽可共用时钟源,但真正的三模控制器需要额外设计。
- SDRAM:FPGA中仅需产生时钟,但关断时钟可以省电;I2S则要求产生任意频率的时钟。
作者最终在SDIO控制器中系统解决了分频问题:通过一个可编程时钟分频器,既能从低速启动,又能动态调整到高速,还能随时暂停——这套方案整合了NOR flash、HyperRAM、NAND等多个项目积累的经验。
编注:信源为Hacker News上的工程技术博客,材料为作者对多种设备时钟生成设计的经验总结,侧重FPGA与ASIC的差异及协议特性,未涉及具体代码实现。