你的位置:EETOP 赛灵思(Xilinx) 社区 >> >> 全部 >> 详细内容

MicroZed开发板笔记,第70部分:约束——时序介绍以及时钟定义

发布者:jackzhang 时间:2015-03-30 19:43:42


By Adam Taylor

之前在博客发表的文章中,我已经介绍了在Vivado环境下的基本约束,这篇文章将着重介绍时序约束。

在FPGA里的底层,我们利用时钟来提供的时序参考,据此来传输和接收数据。如果我们想要对时钟进行分析,我们需要考虑时钟周期,建立时间(Tsu)和保持(Thd)时间,和Tclk-Q,并要保证他们的时序没有冲突。

尽管我们可以手工检查某一个寄存器的时序,但对于包含数百万触发器和非理想时钟树的复杂的设计来说,手工检查是不可能的。因此必须依靠EDA工具(本例中为Vivado设计套件)来自动处理时钟的抖动和偏移。

为了理解Vivado环境下的时序约束,我们必须理解用来约束的相关术语,这部门在Vivado Design Suite User Guide: Using Constraints中有更详细的介绍。


术语
  • 发射沿是指发射数据源时钟的活动沿
  • 捕获沿是指在捕获数据目标时钟的活动沿
  • 源时钟也被称为发送时钟
  • 目标时钟也被称为捕获时钟
  • 建立条件是发射沿和捕获沿之间用来定义最严格的建立约束的关系
  • 建立关系是指时序分析工具所验证的建立检查
  • 保持条件是指发射沿和捕获沿之间用来定义最严格的保持约束的关系
  • 保持关系是指时序分析工具所验证的保持检查
  • 上述这些术语可以帮助我们理解和定义FPGA设计的时序行为。

    在我们考虑怎么定义这些约束之前,我觉得有必要具体的解释一下什么是建立和保持条件。其他的术语看起来都很直观,很好理解。

    这个建立时间定义了在下一个时间沿出现前,寄存器里的数据必须保持稳定不变的时间。注意到,此时我们可能正在处理多个时钟。发射时钟和发射数据源相关联。捕获时钟和捕获数据的目的触发器相关联。建立要求等于时钟的捕捉边沿时间减去发射边沿时间。注意:这些时钟可能不一样——它们可能有不用的相位或者不同的时钟周期。如果使用了不同的发射和捕获时间,那么当你考虑两个时钟间最坏的关系时,建立条件取这两时钟中较小的那一个。

    保持时间是指在捕获了时钟沿后数据必须保持稳定不变的时间。这个保持时间是当前捕获沿减去下一个发射沿的较大者。如果发射和捕获时间不一样,那么必须考虑时钟间最糟糕情况下的时序。

    Vivado可以分析建立和保持时间,并且提供这些分析的结果。结果报告显示了设计松弛度。正的松弛度意味着在寄存器有错误的值和趋于稳定时,定时器将不会计时。负的松弛度意味着由于时序冲突,这时稳定度是个问题。

    当然为了进行时序分析,我们需要定义时钟以及提供包含合适设计信息的设计工具。为了在XDC(Xilinx Design Constraints赛灵思设计约束)中定义一个时钟,我们需要提供最基本的定义。

  • 时钟名
  • 以纳秒为单位的时钟周期
  • 以绝对时间定义的波形定义
  • 对于时钟,Vivado包含了三种概念,它们之间的定义稍微的差别。

  • 主时钟——那些通过I/O管脚的时钟
  • 生成时钟——那些通过内置的锁相环或者通过设计(例如,通过一个触发器来2分频)自动产生的时钟。利用产生的时钟,我们可以描述主时钟(不管是最初的或者其他产生的时钟)是怎么改变波形的。
  • 虚拟时钟——没有连接到任何设计中的网表,仅仅可以被IO时序所使用。
  • 利用下面的命令来生成主时钟和虚拟时钟:
    create_clock –period –name –waveform [source objects]

    例如,如果想在一个输入管脚上定义一个10纳秒输入、占空比为50%的时钟,我们可以用下面这行命令:
    create_clock – period 10ns –name sys_clk –waveform {0 5} [get_ports sys_clk]

    这个行命令中有意思的地方是“–waveform {0 5}”,它用来限定波形沿的跳变点在0和5纳秒,因此10ns的时钟,占空比为50%。如果想要设计不同占空比的波形,比如30:70,我们可以用“–waveform {3 10}”。(注:此时跳变点为3ns和10ns,因此占空比为30%)

    利用下面这个命令生成产生时钟:
    create_generated_clock –name –source –edges –divide_by –multiply_by –duty_cycle –edge_shift –master_clk –combinatorial

    例如为了产生2分频的时钟,我们可以用如下命令:
    create_generated_clock –name clk_div2 –divide_by 2 –source [get_ports sys_clk] [get_pins divider_out]

    在下一期博客中,将依旧研究时序约束,例如时钟组,不确定性和异常。

    点击这里,你可以访问到MicroZed开发板笔记之前的部分。

    原文链接:
    http://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chro...

    ©Copyright 2014 Xilinx Inc
    如需转载,请注明出处

    最新课程

    • 深入浅出玩儿转FPGA

      本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念

    • 从零开始大战FPGA基础篇

      本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“

    • Verilog基础及典型数字

      课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了