本文转载自:FPGA入门到精通
时钟规划是FPGA设计初期必须完成的关键工作,它与芯片选型紧密相关。
一个清晰的时钟规划方案能够有效降低设计复杂度,并为后续的时序收敛奠定良好基础。
在进行时钟规划时,需要注意以下几个核心问题:
· 设计中实际需要的时钟个数。
· 每个时钟的具体频率。
· 各时钟之间的相位关系。
· 外部时钟输入的管脚位置与电平标准。
一、 基本原则:时钟数量越少越好
尽管目前主流的FPGA芯片(如Xilinx系列)内部集成了多个MMCM/PLL,每个管理单元都能生成多个不同频率的时钟,且芯片拥有丰富的全局时钟缓冲器资源,但在设计中仍应遵循一个黄金准则:时钟个数越少越好。
过多的时钟域会显著增加跨时钟域路径的数量,从而提升设计风险与验证难度。
设计中部分时钟往往与芯片内部的特定硬核(Hard IP)绑定,一旦硬核的指标和物理位置确定,相应的时钟频率和位置便随之锁定。例如,高速收发器(GT)的参考时钟就属于此类。
二、 时钟缓冲器(BUFG)的使用
对于FPGA内部逻辑使用的时钟,若需由外部晶振输入并经MMCM/PLL生成,则必须确保外部时钟信号从芯片专用的全局时钟管脚(MRCC/SRCC)进入。
· 自动插入:在Vivado中,对于时钟网线,工具通常会自动插入全局时钟缓冲器(BUFG)。
· 手动实例化:如果设计中需要额外的时钟缓冲器或特殊类型的缓冲器。
module diff_clk_bufg_demo
(
input wire clk_p, // 差分时钟P端
input wire clk_n, // 差分时钟N端
input wire rst_n,
output wire clk_glb // 最终全局时钟
);
// 1. 差分输入缓冲 IBUFDS
wire clk_ibufds_out;
IBUFDS u_ibufds_clk
(
.I(clk_p),
.IB(clk_n),
.O(clk_ibufds_out)
);
// 2. 全局时钟缓冲 BUFG
BUFG u_bufg_clk
(
.I(clk_ibufds_out),
.O(clk_glb)
);
endmodule
三、 MMCM/PLL的使用规范
Clocking Wizard IP是生成时钟的核心工具,它不仅能控制输出时钟的频率,还能精细管理输出时钟的相位和占空比。
在使用MMCM/PLL时,还需特别注意以下几点:
1、避免输入管脚悬空
任何输入管脚均不应悬空。
不同综合工具对悬空管脚的处理方式(接地或拉高)可能存在差异,这会导致不可预知的问题。
2、复位管理
如果输出时钟是断续存在的(仅在特定工作时段有效),复位端口应由用户逻辑控制,不可直接接地。
如果输出时钟持续存在且频率恒定,复位端口应恒接地(或在使用Clocking Wizard IP时不勾选复位端口)。
3、LOCKED信号处理
可将MMCM/PLL的LOCKED输出信号用作内部逻辑的复位信号。
4、层次化设计位置
建议将MMCM/PLL例化在设计的顶层。
这样可以确保生成时钟能够通畅地分发至各个底层子模块,避免时钟信号在层级间穿梭带来的不便。
四、 设计中应避免的时钟生成方式
尽管门控时钟在ASIC中常用于降低功耗,但在FPGA设计中应尽量避免直接使用门控时钟或由寄存器/LUT生成的分频时钟作为时钟源。
1、门控时钟问题
Vivado不会对门控时钟自动插入BUFG,且常规的时钟周期约束无法有效覆盖相关路径,易导致时序违例。
2、门控时钟转换
Vivado综合选项中提供了 -gated_clock_conversion 开关,将其设置为 on 时,工具会尝试将门控时钟逻辑转换为等效的时钟使能(Clock Enable) 信号。
注意这个设置选项并非100%生效。
如果代码中包含 KEEP_HIERARCHY、DONT_TOUCH 或 MARK_DEBUG 等综合属性且作用于门控时钟相关逻辑,可能会干扰转换过程。
对于复杂场景,推荐转化为时钟使能逻辑。
3、局部时钟问题
应避免使用非专用资源生成的“局部时钟”(如计数器分频输出直接作为时钟)。
这类时钟偏移(Skew)通常较大,会给时序收敛带来极大压力。
如果设计中确实需要极低频时钟且MMCM无法生成(需参考对应芯片MMCM的最小输出频率),且该时钟的负载极低(建议不超过30个),可通过手工布局将负载约束在极小区域内使用,但风险较高,需谨慎评估。