FPGA时序约束--进阶篇(衍生时钟约束)

FPGA设计中,时序约束对于电路性能和可靠性非常重要。在上一篇的文章中,已经详细介绍了FPGA时序约束的主时钟约束。

本文将详细介绍衍生时钟约束和时钟分组约束设置,给出了详细的约束命令和示例介绍。

一、衍生时钟约束

衍生时钟(Generated Clocks),也叫生成时钟,是从FPGA的主时钟信号派生出来的子时钟信号。

这些子时钟信号可以在FPGA内部的不同区域使用,以满足不同模块的需求。通常是由MMCM或PLL或由组合逻辑生成的倍、分频时钟信号。

衍生时钟与源时钟的关系如下:

  • 简单的频率分频

  • 简单的频率倍频

  • 频率倍频与分频的组合,获得一个非整数的比例

  • 相移或波形反相

  • 占空比改变

  • 上述所有关系的组合

衍生时钟的约束,需要可以在时钟树中加入生成的时钟,可以使用create_generated_clock命令来定义衍生时钟的时钟约束。其语法如下:

create_generated_clock -name <generated_clock_name> \
                                       -source <master_clock_source_pin_or_port> \
                                       -multiply_by <mult_factor> \
                                       -divide_by <div_factor> \
                                       -master_clock <master_clk> \
                                       <pin_or_port>

参数

含义

-name

时钟名称

-source

源时钟

-multiply_by

相对于源时钟的倍频系数

-divide_by

相对于源时钟的分频系数

pin_or_port

物理节点

通过create_generated_clock命令,我们就可以非常灵活地定义衍生时钟的时序约束,并将其与主时钟相结合,保证电路的稳定性和正确性。

创建时钟示例:

create_clock -name clk_24m -period 10 [get_ports sys_clk]

create_generated_clock -name clkdiv2 -source [get_ports clk_24m] -divide_by 2 \ [get_pins REGA/Q]

衍生时钟通常有两种情况:“FPGA开发软件自动推导的衍生时钟”和“用户自定义的衍生时钟”

对于FPGA开发软件自动推导出来的衍生时钟,比如MMCM和PLL分频输出来的时钟,可以不用写入时序约束,只需要对输入MMCM和PLL的主时钟做时序约束即可。

用户自定义的衍生时钟,通常指的是用户通过组合逻辑构建的分频时钟,这就需要我们自己来写衍生时钟约束。

二、时钟分组约束

FPGA电路中除了主时钟以外,还有很多其他衍生时钟,如DFF的时钟、时钟分频器的时钟等。

这些时钟对于电路性能和可靠性非常重要。

所以需要将这些衍生时钟和主时钟分组,并定义它们之间的层次关系,以确保电路的稳定运行。

在Vivado中可以使用set_clock_groups命令来定义时钟分组。其语法如下:

set_clock_groups -name <group_name>
-group <group_type> <async_port_list> <sync_port_list\> [-logically\_exclusive]

参数

含义

-name

时钟分组命名

-group

时钟分组的类型

aysnc_port_list

异步端口列表

sync_port_list

同步端口列表

-logically_exclusive

用于指定是否为逻辑独立分组

1、两个主时钟是异步关系

create_clock -period 12 -name clk1 [get_ports clk1]
create_clock -period 6 -name clk2 [get_ports clk2]
set_clock_groups -asynchronous -group clk1 -group clk2

2、验证同一个时钟端口下,不同时钟频率的时序是否收敛

create_clock -name clkA -period 20.0 [get_ports clk]
create_clock -name clkB -period 10.0 [get_ports clk] -add
create_clock -name clkC -period 5.0 [get_ports clk] -add
create_clock -name clk0 -period 10.0 [get_ports clk0]
set_clock_groups -physically_exclusive -group clkA -group clk1B -group clkC
set_clock_groups -asynchronous -group "clkA clkB clkC" -group clk0

3、BUFGMUX

通过MMCM生成有两个时钟输入BUFGMUX时,只有一个时钟会被使用,这时设置的时序约束为:

set_clock_groups -logically_exclusive \
                             -group [get_clocks -of [get_pins inst_mmcm/inst/mmcm_adv_inst/CLKOUT0]] \
                              -group [get_clocks -of [get_pins inst_mmcm/inst/mmcm_adv_inst/CLKOUT1]]

三、总结

本文详细介绍了衍生时钟约束和时钟分组约束,这两个是在时序约束中常见的写法,大家在学习时序约束时,可以对照着学习理解。


本文将不断定期更新中,码字不易,点⭐️赞,收⭐️藏一下,不走丢哦

本文由FPGA入门到精通原创,有任何问题,都可以在评论区和我交流哦

学习资料分享,github开源代码:“FPGA知识库

您的支持是我持续创作的最大动力!如果本文对您有帮助,请给一个鼓励,谢谢。

猜你喜欢

转载自blog.csdn.net/mengzaishenqiu/article/details/131036749
今日推荐