第一章 FPGA时序约束分享03_input delay约束
作者:潘文明
本文章探讨一下FPGA的时序input delay约束,本文章内容,来源于配置的明德扬时序约束专题课视频。
《FPGA时序约束分享01_约束四大步骤》概括性地介绍 了时序约束的四个步骤,对时序约束进行了分类,并得到了一个分类表。
《FPGA时序约束分享02_时钟约束》详细介绍了关于时钟的约束,根据时钟来源可以分成输入时钟约束、PLL等衍生时钟约束和自己分频的时钟约束等三种类型。这三种类型的约束方法均有所不同,读者需要掌握区分方法。
本文,笔者将详细介绍输入延时(input delay)的概念、场景分类、约束参数获取方法以及约束方法。
在高速输入设备与FPGA通信场合,设置输入延时(input delay)约束非常重要。
例如明德扬研发的高速ADC模块:mdyFmcAd9653,该模块集成了2个125M采样率、分辨率为16位的AD9653,采集数据时通过LVDS传输至FPGA上。该LVDS的时钟频率为125M,数据位宽为16位,FPGA接收时,需要进行输入延时(input delay)约束,将LVDS时钟和数据的相位关系告知FPGA,从而让FPGA能够正确接收,如果约束不正确,则会出现接收错误的情况。
还有一个常用场景,就是网络芯片的RGMII接口。RGMII接口用于网络芯片和FPGA之间的网络数据传输,网络芯片往FPGA发数据,即FPGA接收数据时,就需要设置输入延时(input delay)约束。RGMII接口务必要做时序约束,否则会出现偶发性的数据接收错误的情况,笔者在做“弱小信号采集系统项目”时,就在这里吃过亏。
开始正文,首先讨论并明确输入延时(input delay)的概念。
第1节 输入延时概念
上图是一个典型的输入延时的模型,该模型由一个上游器件source device以及一个FPGA组成。上游器件将数据传送给FPGA,FPGA接收数据。从FPGA角度来看,输入接口由时钟接口和数据接口组成,上图右边FPGA的输入管脚,上面即是数据接口,下面是时钟接口。
Din是由时钟clk产生的,理想情况下,Din的变化时刻一定是时钟的上升沿,即变化点和时钟上升沿对齐,如上图所示。
但在传输过程中,由于时钟和数据会存在延时差异,从而到达FPGA管脚是处于不同的时刻,数据和时钟之间会存在相位差,如下图所示。
上图描述了连续3个时钟下,数据接口din和时钟clk的相位差,第1个时钟相差了1ns,第2个时钟差了1.8ns,第3个时钟相差了1.3ns。相位差的变化有可能是延时原因,也有可能是上游器件的原因,总之,这些相位差数据是变化的,但它的变化应该在一个确定的范围,即肯定是存在一个最小值,同时存在一个最大值,相位差在这两个范围内变动。
将其变化范围汇总起来,制作成如下的一张图。
上图中的灰色区域,就是相位差的变化范围。
现在可以给出输入延时(input delay)的定义:数据相对于时钟的延时,即数据时间-时钟上升沿时间。
a. 注意是数据时间-时钟上升沿时间,这意味着输入延时可正可负。当延时在时钟右边时,输入延时是正的,当延时变化点在时钟上升沿左边时,输入延时是负的。
b. 输入延时通常是一个变化范围,其有两个参数,最小延时min和最大延时max。最小延时即上图中灰色区域最左边点,最大延时是灰色区域最右边点。
c. 输入的实际延时一定在最小和最大之间。约束时,需要设置好最小min和最大max的值。
d. 上图中的clk和din是指FPGA管脚的,非上游器件管脚的。
e. 牢记输入延时的概念定义,后面场景无论如何变化,万变不离其宗,都是按这个定义约束的。
第2节 约束语句
设置输入延时的约束语句,其语法非常简单,如下
set_input_delay -clock <clock_name> <delay> <objects>
Ø <objects>是想要设定input约束的端口名,可以是一个或数个port。
Ø -clock之后的clock_name,是时钟域的名字。
u 注意,这个clock_name是设置约束约束时定义的时钟域的名字,而非“时钟”名。
u 可以是一个真实存在的时钟