zoukankan      html  css  js  c++  java
  • OFFSET IN 使用举例

    本文将结合具体实例阐述OFFSET IN的使用方法。注意:这是我第一次写OFFSET IN约束,本文仅供参考。阅读本文前需要了解时序收敛的基本概念,OFFSET IN和Period的相关知识,可先阅读时序收敛:基本概念OFFSET约束(OFFSET IN 和OFFSET OUT)这两篇内容。

    系列目录 

        时序收敛:基本概念

        建立时间和保持时间(setup time 和 hold time)

        OFFSET约束(OFFSET IN 和OFFSET OUT)

        Clock Skew , Clock uncertainly 和 Period

        特殊约束From To

        OFFSET IN 使用举例

        Achieving Timing Closure

    1. 分析

        某器件(Device)有信号RXD0-RXD15,RKLSB,RKMSB需要输入到FPGA内,同时有与数据同步的RXCLK,数据为SDR输入。如下图所示,这是一个典型的源同步输入方式,需要给出OFFSET IN约束。

    clipboard[4]

        OFFSET IN的相关参数可以到与器件对应的Datasheet内寻找,该器件的输入满足以下关系。RXD0-RXD15,RKLSB,RKMSB在RXCLK上升沿到达前3ns有效,同时在上升沿之后保持3ns。(这一情况对应TXCLK=80MHz,TXCLK = RXCLK)

    clipboard[5]

    clipboard[6]

        综合这两点考虑,RXD0-RXD15,RKLSB,RKMSB的OFFSET IN Before 是 3ns(80MHz),同时数据的有效时间为tsu+th = 6ns(80MHz)。

    2. 建立时序约束

        可以之间在UCF文件中写时序约束,也可以通过软件指定生成。这里介绍后一种方法,采用ISE开发环境,首先打开工程,点击Create Timing Constraints。

    clipboard[10]

        由于RXD0-RXD15,RKLSB,RKMSB满足的OFFSET IN是一致的,这里先定义TIMEGRP。点击左侧Grop Constraints by Instance,出现如下界面。由于RXD0-RXD15,RKLSB,RKMSB都是输入pad,选择Input Pads,建立Time name为tlk1_rxd,选择对应的RXD0-RXD15,RKLSB,RKMSB完成即可。(注:该工程中有两个器件,这里对应tlk1_dclkin为RXCLK,tlk1_rklsb为RKLSB,tlk1_rkmsb为RKMSB,tlk1_rxd[15:0]为RXD0-RXD15.)

    clipboard[12]

        之后选择OFFSET IN,定义OFFSET IN约束。打开界面,选择源同步,SDR方式,Clock edge为Center aligned(这个可以通过右侧的时序图确定)。点击下一步。(注,tlk1_dclkin在FPGA内部作为时钟,需要先写时序约束,这里假设频率为100MHz,占空比1:1。)

    clipboard[16]

        之后确定相关参数,Input clock pad为tlk1_dclkin(时钟约束已经写好),输入pad为tlk1_rxd。第1节分析结果可得在135MHz下offset in为2.5ns,数据有效时间为5ns。这里采用这一数值,填入对应方框中,确认保存即可。

    clipboard[18]

    3. 结果

        生成约束后,可以打开UCF文件,观察生成结果如下所示。首先是tlk1_dclkin的周期约束,同时定义了占空比为1:1。之后确定了TIMEGRP,最后指定了OFFSET IN约束。

    NET "tlk1_dclkin" TNM_NET = tlk1_dclkin;

    TIMESPEC TS_tlk1_dclkin = PERIOD "tlk1_dclkin" 10 ns HIGH 50%;

    TIMEGRP "tlk1_rxd" = PADS("tlk1_rxd<15>") PADS("tlk1_rxd<0>") PADS("tlk1_rxd<1>") PADS("tlk1_rxd<2>") PADS("tlk1_rxd<3>") PADS("tlk1_rxd<4>") PADS("tlk1_rxd<5>") PADS("tlk1_rxd<6>") PADS("tlk1_rxd<7>") PADS("tlk1_rxd<8>") PADS("tlk1_rxd<9>") PADS("tlk1_rxd<10>") PADS("tlk1_rxd<11>") PADS("tlk1_rxd<12>") PADS("tlk1_rxd<13>") PADS("tlk1_rxd<14>") PADS("tlk1_tklsb") PADS("tlk1_tkmsb");

    TIMEGRP "tlk1_rxd" OFFSET = IN 2.5 ns VALID 5 ns BEFORE "tlk1_dclkin" RISING;

  • 相关阅读:
    python3.5+flask+mysql
    Python魔法师
    Redis
    Socket
    Python线程
    Python全栈之路--Django ORM详解
    基本算法
    Python_Select解析
    如何做好一名DBA【转】
    解决MySQL忘记root密码
  • 原文地址:https://www.cnblogs.com/sea-wind/p/4733366.html
Copyright © 2011-2022 走看看