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;

posted @ 2015-08-15 23:35  暗海风  阅读(2030)  评论(0编辑  收藏  举报