FPGA 项目设计中,通常会遇到多时钟处理,例如,多个外部时钟源或一个 PLL 输出多个时钟,根据条件选择合适的时钟用作系统时钟。下面给出 3 种常见的解决方案及各自的优缺点。
方案一:MUX 选择
外部晶振时钟进入 PLL,由 PLL 输出多个时钟,MUX 根据外部条件选择时钟输出做为系统使用。
设计时需要注意,根据 Xilinx 家的官方文档描述,推荐 MUX 使用专用的 BUFG 源语,而不应该使用组合逻辑实现。即使使用组合逻辑实现的,也要注意 case 语句中 default 选项必须有输出,否则会出现锁存器。
另外,这种方案的时序约束就比较麻烦:除了使用 creat_clock 命令约束 PLL 输入时钟,使用 creat_generate_clock 约束 PLL 输出时钟外(Vivado 中 IP 为自动生成相应约束),还要根据 PLL 输出的多个时钟之间的关系,使用 set_clock_groups 约束。set_clock_groups:
- asynchronous 表示时钟同时有效,但没有相位关系。
- exclusive 表示时钟是互斥的
- group,group 之内的时钟相关,group 之间的时钟互不相关。
此方案在时钟频率比较低的情况下是可行的。当输出时钟频率较高时,这种设计使得时钟约束变得繁琐,时序变得紧张。
同时 PLL 输出时钟后使用 MUX 进行选择输出,会增加时钟布线延时,高速情况下并不可靠。
方案二:重配置 PLL
在高速情况下,应该更改设计,提高电路速度。Xilinx 及 Altera 两家的 FPGA 均支持 PLL 重配功能。可根据条件对 PLL 进行重配。
调用 Xilinx/Altera 提供的 PLL 重配模块,根据官方资料,可以动态的对 PLL 重新配置。这样 PLL 输出时钟直接驱动系统模块,将多时钟域转换到单时钟域上。不需要添加附加约束电路都可以正常工作。
方案三:高频时钟
第三种方案,这里稍微介绍一下。
PLL 输出一个高频时钟 HCLK,其他时钟作为 HCLK 的使能端,用 HCLK 采样其他时钟,这也是一个可以考虑的方案,这个方案也不会造成多时钟处理及约束。但此方案也有限制,要求 HCLK 时钟频率至少是 PLL 输出其他时钟最高频率的两倍以上,这样才能满足采样定理,即奈奎斯特定理。在时钟频率比较低时,亦可以考虑此方案。
扫码关注尚为网微信公众号
原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1283.html