FPGA设计中常用的约束主要分3类:时序约束、区域和位置约束以及其他约束。
(1)时序约束,用于规范设计的时序行为,满足要求的时序条件,指导综合和布局布线阶段的优化算法。
(2)区域和位置约束,指定I/O引脚位置,指导实现工具在芯片特定的物理区域进行布局布线。
(3)其他约束,指目标芯片型号、电气特性等约束属性。
Timing Analyzer是ISE中集成的静态时序分析(Static Timing Analysis,STA)工具,利用这个工具可以获取映射或布局布线后的时序分析报告,从而对设计的性能做出评估。时序约束分为3种:周期约束(为触发器到触发器组合逻辑路径提供约束)、偏移约束(为输入PAD到寄存器、寄存器到输出PAD的组合逻辑路径提供约束),静态路径约束(为输入PAD到输出PAD的组合逻辑路径提供约束)。常用的时序约束方法有直接编辑UCF文件、从Constraints Editor输入、在HDL代码或者原理图编辑器中附加Attribute、编辑Xilinx Constraints File等。
1.时钟周期约束
系统最高的工作频率,即最小的时钟周期为Tclk=Tcko Tlogic Tsetup Tclk_skew,其中Tclk_skew=Tckd2-Tckd1。Tcko是时钟输出时间,Tlogic是同步元件之间的组合逻辑延时,Tsetup是同步元件的建立时间,Tclk_skew是时钟信号之间的偏移。有两种方法对时钟网络附加时钟周期约束,分别为Simple Method和Preferred Method。
例如,NET clka PERIOD=50 ns HIGH 20 ns设置时钟clka的周期为50 ns,高电平持续时间为20 ns,该约束将被附加到clka所驱动的所有同步单元上。
2.Preferred Method方法,语法结构如下。
例如,首先在时钟网络clk上附加TNM_NET约束,把clk驱动的所有同步元件定义成一个分组,命名为sys_clk。
定义派生时钟的语法如下。
其中TSidentifier_2是要定义的派生时钟,TSidentifier_1是已经定义的时钟,factor为两个时钟之间大的倍数关系,为浮点数。phase_value指出两个时钟之间的相位关系,是一个浮点数。
例如,定义时钟clk0 TIMESPEC“TSclk0”=PERIOD"clk0"50 ns
定义派生时钟clk80的相位与主时钟相差180°。
2.偏移约束
偏移约束(Offset Constraint)包括OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE与OFFSET_OUT_AFTER四种,规定了外部时钟和数据输入/输出引脚之间的时序关系,只用于PAD相连的信号,不用于内部信号。通过设置偏移约束,告诉综合工具输入信号到达的时间和输出信号需要保持稳定的时间。偏移约束语法如下。
偏移约束用来定义一个外部时钟引脚和数据输入输出引脚之间的时序关系,这种时序关系也被称为器件上的Pad-to-Setup或Clock-to-Out路径。这些约束对与外部元器件相连的接口十分重要。
Pad-to-Setup:也被称为OFFSET IN BEFORE约束,用来保证外部输入时钟和外部输入数据的时序满足FPG内部触发器的建立时间要求。如图3-26所示,TIN_BEFORE约束使得 FPGA 在进行 DATA_IN 和 CLK_SYS 布线时努力保证 DATA_IN 相对于CLK_SYS的延时小于TIN_BEFORE。
图3-26 输入偏移约束时序参考图
Clock-to-Out:也被称为OFFSET OUT AFTER约束,用来满足下游器件建立保持(setup/hold)要求或输出时钟和数据之间时序要求,如图3-27所示。
图3-27 输出偏移约束时序参考图
OFFSET IN BEFORE或OFFSET OUT AFTER约束允许用户指定外部输入或输出引脚相对于时钟边沿到内部数据的延时。
OFFSET IN约束往往和VALID约束一起使用。OFFSET IN约束在建立时间分析中作为建立时间要求使用,而VALID约束在保持时间约束中作为保持时间要求使用。VALID约束指定了输入数据的持续时间。带有VALID约束的输入偏移约束如图3-28所示。
图3-28 带有VALID约束的输入偏移约束
UCF常用语句总结
(1)OFFSET根据芯片外围电路的时序特性约束了内部延时。
① OFFSET_IN约束输入信号
② OFFSET_OUT 约束输出信号
③ 例
说明:第二个例子好理解,第一个例子没有指明对象,表示所有受到“i_ref_clk”约束的信号都被施加了该约束。
(2)TNM是Timing Name的缩写,是一种grouping约束,用于把若干信号组合成一个特定的组以施加相同的约束。例如:
采用该方法后一些列信号都被列入名为“dbg_out”的组合,然后可以统一施加约束。如
(3)TIMESPEC用于对时钟周期和路径等进行约束,例如:
(4)TIG是Timing IGnore的缩写。表示忽略该对象上的时序约束。例如:
表示对于RESET信号,时序约束TS_fast和TS_even_faster无效。
案例:500MSPS的A/D转换器低压差分传送技术是基于低压差分信号(Low Voltage Differential Signaling,LVDS)的传送技术,从一个电路板系统内的高速信号传送到不同电路系统之间的快速数据传送都可以用低压差分传送技术来实现,其应用正变得越来越重要。低压差分信号相对于单端的传送具有较高的噪声抑制功能,其较低的电压摆幅允许差分对线具有较高的数据传输速率、较小的消耗功率以及能够产生更低的电磁辐射。
LVDS:低电压差分信号,如图3-29所示。
图3-29 LVDS示意图
LVDS传输支持速率一般在155Mb/s(大约为77MHz)以上。
LVDS是一种低摆幅的差分信号技术,它使得信号能在差分PCB线对或平衡电缆上以几百Mb/s的速率传输,其低压幅和低电流驱动输出实现了低噪声和低功耗。
ADC08D500是National Semiconductor公司的一款高速A/D采集芯片,为高速、低功耗、双路(I路和Q路)8位、500MSPS的A/D转换器,芯片引脚电平为LVDS形式。
ADC的SDR和DDR时序图见图3-30和图3-31。
图3-30 ADC的SDR时序图
图3-31 ADC的DDR时序图
设计中我们采用DDR模式。
DDR模式下建立时间和保持时间均为2 ns,见图3-32。
图3-32 DDR模式下建立时间和保持时间
Xilinx的Vertex系列FPGA均在IO端口集成了LVDS收发器。要采用LVDS差分标准传输信号,需要对FPGA的IO端口进行配置,从而使综合工具在FPGA布局布线流程中,将INDS驱动器结合到IO端口上。
根据3.10.4节LVDS电平处理方式将输入差分时钟和差分数据转为单端形式的,代码如下:
仿真波形图见图3-33。
图3-33 ADC上沿和下沿均采样数据
时钟约束界面见图3-34,我们为clk_p添加约束,由于时钟为125 MHz,周期时间设为8 ns,占空比设为50%。
图3-34 时钟约束界面
Input约束界面见图3-35和图3-36。
图3-35 Input约束界面1
图3-36 Input约束界面2
在图3-35中,接口类型选用源同步(Source Synchronous),Date rate选为双沿Double Data Rate(DDR)、clock edge为center aligned。
最终生成的文本格式的约束如下:
写完这些约束,读者要养成查看时序报告的习惯。时序报告会告诉这些时序满足或者不满足。在实际中,如果ISE的时序报告显示时序约束能够满足,而FPGA程序在实际运行时却存在时序问题,则说明在UCF中指定的时延关系并不正确!
初学者常犯的一个错误是,时序报告显示OFFSET IN约束无法满足,则去修改OFFSET IN的时延值,使得布线工具不再报时序错误;另一种错误是,以为把这个时延值写得越小,FPGA程序的时钟频率就能跑得越快。
因此,当清楚地知道OFFSET约束语句中这个时延值代表的真正含义时,就不会再做这两种无用功了。
项目的时序报告结果见图3-37。
图3-37 布局布线后时序分析报告结果
上面的例子中,约束了clk_p时钟信号的周期,如果不告诉ISE综合布线工具关于时钟周期的信息,OFFSET约束会被忽略。
很自然的,布线工具需要知道时钟信号的周期,这样它才能努力使得数据信号、时钟信号到达同步单元的相对延迟 FPGA外部本来的延时,不会超过一个时钟周期。
此外,说明一下:
High 50%,High表明了ISE在计算时延值时,是以时钟上升沿作为时间0点,50%也是用来计算时延时的(双沿时用得着)。并不是说要去约束FPGA内部这个时钟要达到50%的占空比,约束第一个进入的时钟是上升沿,并不是这个意思。
因此,定义了时间0点,也就存在before和after之说了,即时延的正值、负值。
如果OFFSET约束时序不满足怎么办?解决方法有两种,使用DCM的移相功能或使用IDELAY。
Xilinx自带的IP Core,如RocketIO/MIG等,都会用上IODELAY。对于一般用户自己写的代码,最常用的应该是采用DCM。相位的设置可以根据布线结果给出的时序余量来确定。相位值如果采用Fixed,无论怎么调可能都不一定能满足要求,毕竟修改了代码,每一次布线的结果不一定只改动了DCM部分。
DCM有动态调整相位的功能,可以派上用场。
DCM动态调相用到了PSEN、PSINCDEC、PSCLK、PSDONE这几个信号。
这些端口默认是灰色的,要选中VARIABLE_POSITIVE/CENTER等之后才会出现。
控制很简单,出一个PSEN单周期信号,如果PSINCDEC为低,则相位增加1个,反之降低一个相位。DCM的设置如图3-38所示。
图3-38 DCM设置图
,