1. 时钟周期约束:对时钟的周期进行约束。

2. vivado中时钟约束指令:

  • create_clock

使用create_clock来创建时钟周期约束,使用方法:

create_clock -name <name> -period <period> -waveform {<rise_time> <fall_time>} [get_ports <input_port>]

值得注意的是,这里的时钟必须是主时钟 primary clock。主时钟通常有两种情况:一种是由外部时钟源提供,另外一种是告诉收发器的时钟提供。

  • 如何查看主时钟?
  1. 综合、布局布线之后
  2. 打开综合设计或者布局布线设计
  3. 两种方式查看主时钟:第一种,report_clock_networks -name mainclock,可以直接查看主时钟。第二种,check_timing -override_defaults no_clock,可以查看没有被约束的主时钟
  • 当主时钟之间的相位关系确定时,则通过-waveform参数进行约束

如上图所示的两个主时钟,进行如下约束:

create_clock -name clk0 -period 10.0 -waveform {0 5} [get_ports clk0]
create_clock -name clk1 -period 8.0  -waveform {2 8} [get_ports clk1]

数字单位默认是ns。如果不写waveform参数,则默认占空比是50%且第一个上升沿在0时刻。

  • 一般来说,如果输入时钟是差分的,只需要对P端进行约束即可
  • create_generated_clock

约束在FPGA内部产生的衍生时钟,使用方法如下:

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>

  • 因为是衍生时钟,所以有-source参数,指明衍生时钟从哪里来的,后面就是源时钟名字,master clock,叫上一级时钟,区别于primary clock。它可以是primary clock 也可以是其他衍生时钟。
  • 这个命令并不是设定周期和波形,而是描述时钟电路如何对上级时钟的转换:
  1. 简单的频率分频、倍频
  2. 频率和分频组合,获得非整数的比例,通常由MMCM或PLL完成
  3. 相移或波形反相
  4. 占空比改变
  • set_clock_groups

使用方法:

set_clock_groups -asynchronous -group <clock_name_1> -group <clock_name_2>
set_clock_groups -physically_exclusive -group <clock_name_1> -group <clock_name_2>

第一种用法:来指定两个主时钟是异步关系,使用asynchronous。

create_clock -period 10 -name clk1 [get_ports clk1]
create_clock -period 8 -name clk2 [get_ports clk2]
set_clock_groups -asynchronous -group clk1 -group clk2

第二种用法:当我们需要验证同一个时钟端口在不同时钟频率下能否获得时序收敛时使用。       比如有两个异步主时钟clk1和clk2,需要验证在clk2频率为100MHz,clk1频率分别为50MHz、100MHz和200MHz下的时序收敛情况,我们就可以这样写。

create_clock -name clk1A -period 20.0 [get_ports clk1]
create_clock -name clk1B -period 10.0 [get_ports clk1] -add
create_clock -name clk1C -period 5.0  [get_ports clk1] -add
create_clock -name clk2 -period 10.0 [get_ports clk2]
set_clock_groups -physically_exclusive -group clk1A -group clk1B -group clk1C
set_clock_groups -asynchronous -group "clk1A clk1B clk1C" -group clk2

第三种用法:当我们使用BUFGMUX时,会有两个输入时钟,但只会有一个时钟被使用。           比如MMCM输入100MHz时钟,两个输出分别为50MHz和200MHz,这两个时钟进入了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]]
  • 虚拟时钟

虚拟时钟通常用于设定对输入和输出的延迟约束,这个约束其实是属于IO约束中的延迟约束。虚拟时钟和前面讲的延迟约束的使用场景不太相同。顾名思义,虚拟时钟,就是没有与之绑定的物理管脚。
虚拟时钟主要用于以下三个场景:

  • 外部IO的参考时钟并不是设计中的时钟

  • FPGA I/O路径参考时钟来源于内部衍生时钟,但与主时钟的频率关系并不是整数倍

  • 针对I/O指定不同的jitter和latency

  简而言之,之所以要创建虚拟时钟,对于输入来说,是因为输入到FPGA数据的捕获时钟是FPGA内部产生的,与主时钟频率不同;或者PCB上有Clock Buffer导致时钟延迟不同。对于输出来说,下游器件只接收到FPGA发送过去的数据,并没有随路时钟,用自己内部的时钟去捕获数据。

比如:如下图所示,在FPGA的A和B端口分别有两个输入,其中捕获A端口的时钟是主时钟,而捕获B端口的时钟是MMCM输出的衍生时钟,而且该衍生时钟与主时钟的频率不是整数倍关系。

这种情况下时序约束如下:

create_clock -name sysclk -period 10 [get_ports clkin]
create_clock -name virclk -period 6.4
set_input_delay 2 -clock sysclk [get_ports A]
set_input_delay 2 -clock virclk [get_ports B]

可以看到,创建虚拟时钟用的也是create_clock约束,但后面并没有加get_ports参数,因此被称为虚拟时钟。

再举个输出的例子,我们常用的UART和SPI,当FPGA通过串口向下游器件发送数据时,仅仅发过去了uart_tx这个数据,下游器件通过自己内部的时钟去捕获uart_tx上的数据,这就需要通过虚拟时钟来约束;而当FPGA通过SPI向下游器件发送数据时,会发送sclk/sda/csn三个信号,其中sclk就是sda的随路时钟,下游器件通过sclk去捕获sda的数据,而不是用自己内部的时钟,这是就不需要虚拟时钟,直接使用set_output_delay即可。

注意,虚拟时钟必须在约束I/O延迟之前被定义。

  • max/min delay的约束平时用的相对少一些,因为在跨异步时钟域时,我们往往会设置asynchronous或者false_path。对于异步时钟,我们一般都会通过设计来保证时序能够收敛,而不是通过时序约束来保证。

FPGA时序约束理论之时钟周期约束(5)相关推荐

  1. 4 FPGA时序约束理论篇之时钟周期约束

    时钟周期约束   时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束.   下面我们讲一些Vivado中时钟约束指令. 1. Create_cloc ...

  2. 3 FPGA时序约束理论篇之IO约束

    I/O约束   I/O约束是必须要用的约束,又包括管脚约束和延迟约束. 管脚约束   管脚约束就是指管脚分配,我们要指定管脚的PACKAGE_PIN和IOSTANDARD两个属性的值,前者指定了管脚的 ...

  3. 6 FPGA时序约束理论篇之xdc约束优先级

    xdc约束优先级   在xdc文件中,按约束的先后顺序依次被执行,因此,针对同一个时钟的不同约束,只有最后一条约束生效.   虽然执行顺序是从前到后,但优先级却不同:就像四则运算一样,±x÷都是按照从 ...

  4. 1 FPGA时序约束理论篇之建立保持时间

    读万卷书–时序约束理论篇 周期约束理论   首先来看什么是时序约束,泛泛来说,就是我们告诉软件(Vivado.ISE等)从哪个pin输入信号,输入信号要延迟多长时间,时钟周期是多少,让软件PAR(Pl ...

  5. 2 FPGA时序约束理论篇之时序路径与时序模型

    时序路径   典型的时序路径有4类,如下图所示,这4类路径可分为片间路径(标记①和标记③)和片内路径(标记②和标记④).   对于所有的时序路径,我们都要明确其起点和终点,这4类时序路径的起点和终点分 ...

  6. 5 FPGA时序约束理论篇之两种时序例外

    两种时序例外 多周期路径   上面我们讲的是时钟周期约束,默认按照单周期关系来分析数据路径,即数据的发起沿和捕获沿是最邻近的一对时钟沿.如下图所示.   默认情况下,保持时间的检查是以建立时间的检查为 ...

  7. FPGA时序约束理论篇之IO约束

    参考来源–知乎–张大侠 I/O约束 I/O约束是必须要用的约束,又包括管脚约束和延迟约束. 管脚约束 管脚约束就是指管脚分配,我们要指定管脚的PACKAGE_PIN和IOSTANDARD两个属性的值, ...

  8. FPGA时序约束理论(基于Vivado)

    引言        FPGA的时序约束是非常重要的,它在FPGA的综合和实现过程中扮演了一个非常重要的角色.最近在公众号中看到了一系列关于FPGA时序约束相关的内容,觉得写的非常好,非常全面,深入浅出 ...

  9. FPGA时序约束理论之伪路径(7)

    1. 什么是伪路径? 伪路径指的是该路径存在,但该路径的电路功能不会发生或者无须时序约束.如果路径上的电路不会发生,那Vivado综合后会自动优化掉,因此我们无需考虑这种情况. 2. 为什么要创建伪路 ...

最新文章

  1. eclipse插件 android模拟器,关于eclipse:ADT插件中的android模拟器没有运行
  2. TechED 2005 博客园兄弟合影
  3. laravel(二):laravel基本入门 看到Hello Laravel
  4. 知识归纳,程序猿必备的21张(神经网络、线性代数、可视化等)数据挖掘速查表
  5. Unix/Linux操作系统中如何在sqlplus/rman中使用方向键
  6. 实时获取滚动条的高度_适用于星上快速处理的雷达高度计有效波高反演技术
  7. java循环遍历类属性_java循环遍历类属性 get 和set值方法
  8. 在Golang中使用Protobuf
  9. android 画中画模式自定义,Android 8.0 Oreo 画中画模式
  10. RDB 和 AOF 持久化的原理是什么?我应该用哪一个?它们的优缺点? 1
  11. linux里用cmake安装的软件要怎么卸载?
  12. autojs今日头条急速脚本
  13. linux系统中使用百度云盘
  14. 记录一个小程序 input输入框格式手机号方法
  15. 机器学习基石1 学习笔记
  16. python 函数调用问题
  17. 三菱PLC GXWORKS编程之1新建
  18. Oracle 存储过程中,解决变量使用 in条件时,查询无效问题
  19. 推荐一个好用的在线pdf压缩工具
  20. 模拟电子技术(一)半导体二极管和三极管

热门文章

  1. 读书笔记:Effective Java-第11章 并发Concurrency
  2. 基于区块链的供应链金融
  3. AndroidMaterialDesign动画之Curved Motion
  4. sklearn实现KNN分类算法
  5. 利用matlab进行函数大小比较_巧用二次函数的性质比较数值大小
  6. clock_gettime函数详解
  7. dmp如何导入mysql_oracle如何导入dmp
  8. 扫码排号测试用例_测试用例:水杯、电梯、发红包、朋友圈点赞、支付的测试用例等等...
  9. 多进程爬取豆瓣电影前100,将数据导出为Excel表
  10. Android广告Banner实现