1. 多时钟系统设计导论

在FPGA工程中,只要系统里存在两个及以上彼此独立或频率、相位不同的时钟源,并且这些时钟域之间需要交换数据,这个系统就属于多时钟系统。它并不等同于“用了多个时钟引脚”这么简单:真正的判定标准是时钟域之间是否存在信号跨越。如果两个时钟各自驱动完全隔离的逻辑、互不通信,那么它们只是并存的单时钟子系统;一旦有数据、控制或状态信号从A时钟域进入B时钟域,跨时钟域(CDC,Clock Domain Crossing)问题就出现了。

多时钟系统的典型来源包括:外部晶振与PLL倍频/分频输出、不同接口协议自带的恢复时钟(如以太网RGMII的RX_CLK、视频接口的像素时钟)、低速管理总线时钟与高速数据通路时钟、以及为降低功耗而动态切换的时钟。以常见的视频采集系统为例,摄像头输出像素时钟约74.25 MHz,DDR缓存控制器工作在200 MHz,配置寄存器走50 MHz的Avalon-MM总线,三者构成一个典型的三域系统。

Quartus开发流程中的时钟规划

在Quartus Prime中,时钟不是“写完代码再想”的事,而应在工程建立阶段就完成规划。规划的核心动作有三步:定义时钟源、约束时钟、验证时钟。

第一步是定义时钟源。使用PLL(如Altera PLL IP)时,需要明确输入参考时钟频率、目标输出频率、相位偏移和占空比。例如输入50 MHz,通过PLL生成100 MHz系统时钟和25 MHz低速时钟,需要在MegaWizard中设置c0为100 MHz、c1为25 MHz,并确认PLL的VCO频率落在器件允许范围内(如Cyclone IV的VCO范围为600~1300 MHz)。

第二步是约束时钟。在SDC(Synopsys Design Constraints)文件中,用create_clock声明每个输入时钟,用create_generated_clock声明PLL输出时钟。这一步直接决定TimeQuest时序分析器如何看待你的设计。示例:

create_clock -name clk_50m -period 20.000 [get_ports clk_50m]
create_clock -name clk_74m -period 13.468 [get_ports clk_74m]
derive_pll_clocks
derive_clock_uncertainty

第三步是验证时钟。编译后打开TimeQuest,检查Report Clocks是否列出了所有预期时钟,Report CDC是否报告了未约束的跨时钟路径。如果某个时钟域的信号被另一个时钟采样却没有同步器,TimeQuest会给出警告,这正是CDC风险的第一道防线。

跨时钟域挑战概览

跨时钟域的核心风险来自亚稳态。当一个触发器的输入在时钟边沿附近变化时,输出可能在一段时间内处于既非0也非1的中间电平,这就是亚稳态。亚稳态不会永久持续,但它的消退时间不确定,如果被下游逻辑采样,可能传播为错误值。多时钟系统中,亚稳态无法被完全消除,只能通过同步器把MTBF(平均无故障时间)提高到可接受水平。

常见的CDC场景分为三类:单比特控制信号、多比特数据总线、复位信号。单比特信号常用两级触发器同步器;多比特数据不能简单打两拍,因为各比特到达时间不同,会采到中间态,通常采用异步FIFO、握手协议或格雷码计数器;复位信号则需要异步复位、同步释放。

此外,CDC还会带来数据丢失和数据重复问题。如果源时钟域的信号只保持一个源时钟周期,而目的时钟域频率更低,就可能完全采不到;反之,如果目的时钟域采样过快,同一个信号可能被采多次。这些都不是靠“多打几拍”能解决的,必须根据信号性质选择正确的同步策略。

多时钟系统时钟域与跨时钟域路径示意 外部晶振 50 MHz 摄像头像素时钟 74.25 MHz PLL c0: 100 MHz c1: 25 MHz c2: 200 MHz VCO 600–1300 MHz 相位偏移可配置 域A:100 MHz 系统控制逻辑 状态机 / 寄存器 域B:74.25 MHz 视频数据通路 像素处理 域C:200 MHz DDR缓存控制器 高速数据搬运 CDC CDC CDC 两级触发器同步 单比特控制信号 异步FIFO 多比特数据总线 握手协议 低速控制交互 关键约束: create_clock 声明输入时钟 → derive_pll_clocks 推导PLL输出 → set_clock_groups 隔离异步域 → 检查 Report CDC 未约束路径 注:图中频率为教学示例参数,实际工程需根据器件手册与接口协议确定。

课程实战项目介绍

本课程围绕一个可综合、可上板验证的多时钟视频采集与缓存系统展开。系统包含三个时钟域:74.25 MHz像素时钟域负责接收摄像头数据并做格式转换;100 MHz系统时钟域负责状态机控制、参数配置和帧计数;200 MHz DDR时钟域负责将帧数据写入外部缓存并读出。三个域之间通过异步FIFO和两级同步器交换数据。

项目将分阶段推进:先建立单时钟版本并验证功能,再引入PLL生成多时钟,然后逐步加入CDC同步逻辑,最后用TimeQuest做时序约束与CDC检查,并通过SignalTap观察跨域信号的实际波形。每个阶段都有明确的观察点和判断依据,例如异步FIFO的wrusedw和rdusedw计数是否在安全范围内、同步器输出是否出现亚稳态传播导致的错误状态跳转。

本课程所有示例参数(如50 MHz输入、74.25 MHz像素时钟、200 MHz DDR时钟)均为教学假设值,用于说明设计方法。实际工程中应以器件数据手册、接口协议和板级时钟树为准。