在FPGA设计中经常会处理数据对齐以及数据与时钟对齐等问题。正确设置及应用IO delay可以提高系统性能,在某些应用中可以弥补硬件设计的缺陷,因此能正确使用和设置IO delay在FPGA系统设计中也是非常重要的环节。下文就IDELAY与ODELAY的配置信息及应用作详细介绍。
2. IDELAY的配置与应用
每个IO BLOCK都有可编程的DELAY资源IDELAY2,这些输入延迟可以连接在ILOGICE2/ISERDESE2或ILOGICE3/ISERDESE2与IOB之间,为每个IOB提供可编程的延迟。
-
IDELAY 原语
原语的使用,可以在点击Vivado的文本编辑器的language template(灯泡状图标),打开原语使用界面,如图1,

图1 原语选择界面
在图1中找到使用Device primitive instantiation –>Artix-7–.>I/o components–>I/o Delay components。 其中包含两项内容分别Delay Calibration(IDELAYCTRL)和 Input Delay Element (IDELAYE2)。
-
输入延迟资源
输入延迟模块提供31级延迟,在Xilinx 7系列的FPGA器件中每级的延迟时间与提供的校准时钟有密切关联,一般平均每一级延迟约78ps/200M, 52ps/300M ,39ps/400M。延迟资源块如图2所示,

图2 延迟资源块
-
延迟资源块原语
(* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYE2 #(
.CINVCTRL_SEL(“FALSE”), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC(“IDATAIN”), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE(“FALSE”), // Reduced jitter (“TRUE”), Reduced power (“FALSE”)
.IDELAY_TYPE(“FIXED”), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(0), // Input delay tap setting (0-31)
.PIPE_SEL(“FALSE”), // Select pipelined mode, FALSE, TRUE
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
.SIGNAL_PATTERN(“DATA”) // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
.DATAOUT(DATAOUT), // 1-bit output: Delayed data output
.C(C), // 1-bit input: Clock input
.CE(CE), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(CINVCTRL), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(CNTVALUEIN), // 5-bit input: Counter value input
.DATAIN(DATAIN), // 1-bit input: Internal delay data input
.IDATAIN(IDATAIN), // 1-bit input: Data input from the I/O
.INC(INC), // 1-bit input: Increment / Decrement tap delay input
.LD(LD), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(LDPIPEEN), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(REGRST) // 1-bit input: Active-high reset tap-delay input
);
原语中属性部分描述如表1
表1
| 属性名称
Attribute Name |
值
Value |
默认值
Default Value |
描述
Description |
| IDELAY_TYPE | FIXED,
VARIABLE, VAR_LOAD, VAR_LOAD_PIPE |
FIXED | Sets the type of tap delay line.
FIXED delay: sets a static delay value. 设置静态的延迟参数0-31,如IDELAY_VALUE=25,表示延时为25级,一旦配置就固定下来,后续不能更改。 VARIABLE delay: dynamically adjusts the delay value. 动态调整延迟参数,可以由输入管脚的值决定,并于时钟C同步。 CE=1,INC=1,自加1。 CE=1,INC=0,自减1。 初始值由IDELAY_VALUE决定, VAR_LOAD: dynamically loads tap values. 动态加载延迟参数0-31。 在该模式下使用LD装载输入端将CNTVALUEIN[4:0]的值载入。使用CE和INC输入端可以实现加减1。并与时钟端C同步。 CE=1,INC=1,自加1。 CE=1,INC=0,自减1。 VAR_LOAD_PIPE: is similar to VAR_LOAD mode with the ability to store the CNTVALUEIN value ready for a future update 与VAR_LOAD类似,可以将延迟参数预先存储在流水线寄存器中用于将来更新。 使用CE和INC输入端可以实现加减1。并与时钟C同步。 CE=1,INC=1,自加1。 CE=1,INC=0,自减1。 |
| DELAY_SRC | String: IDATAIN, DATAIN | IDATAIN, | IDATAIN: IDELAY chain input is IDATAIN
延迟的源为输入端口 DATAIN: IDELAY chain input is DATAIN 延迟源为FPGA内部逻辑 |
| IDELAY_VALUE | Integer:
0 to 31 |
0 | Specifies the fixed number of delay taps in fixed mode or the initial starting number of taps in VARIABLE mode (input path). When IDELAY_TYPE is set to VAR_LOAD, or VAR_LOAD_PIPE mode, this value is ignored and assumed to be zero
指定在fixed模式下的延迟级数,或者是在VARIABLE模式下的初始值。 在 VAR_LOAD,VAR_LOAD_PIPE模式下,该值自动或略,并假定为0 |
| HIGH_PERFORMANCE_MODE
高性能模式 |
Boolean: FALSE or TRUE | TRUE | When TRUE, this attribute reduces the output jitter. The difference in power consumption is quantified in the Xilinx Power Estimator tool.
如果选择TRUE,可以降低延迟后信号的 jitter,但会增加功耗。 |
| SIGNAL_PATTERN
信号模式 |
String: DATA,
CLOCK |
DATA | Causes the timing analyzer to account for the appropriate amount of delay-chain jitter in the data or clock path.
主要用于时序分析软件对jitter的评估, DATA:是对数据jitter的评估 CLOCK:将jitter的评估结果计入时钟路径 其实就是告诉延迟模块,当前延迟输入是时钟还是数据。 |
| REFCLK_FREQUENCY
参考时钟 |
Real:
190 to 210, 290 to 310, 390 to 410 |
200 | Sets the tap value (in MHz) used by the timing analyzer for static timing analysis. The ranges of 290.0 to 310.0 and 390 to 410 are not available in all speed grades.
See the 7 series FPGA data sheets. |
| CINVCTRL_SEL
时钟极性选择 |
Boolean: FALSE or TRUE | FALSE | Enables the CINVCTRL_SEL pin to dynamically switch the polarity of the C pin.
是将时钟极性取反 |
| PIPE_SEL | Boolean: FALSE or TRUE | FALSE | Selects pipeline mode. This attribute should only be set to TRUE when using the VAR_LOAD_PIPE mode of operation.
选择流水线模式,如果使用VAR_LOAD_PIPE模式,则PIP_SEL=TRUE |
- IDELAY2的输入输出
IDELAY2输入输出的描述见表2
| 名称 | 方向 | 位宽(width) | 功能描述 |
| C | Input | 1 | Clock input used in VARIABLE, VAR_LOAD, or VAR_LOAD_PIPE mode
时钟,用于VARIABLE, VAR_LOAD, VAR_LOAD_PIPE模式动态数据同步。 |
| REGRST | Input | 1 | Reset for the pipeline register. Only used in VAR_LOAD_PIPE mode.
复位流水线寄存器,将寄存器的值清零,只用于VAR_LOAD_PIPE模式 |
| LD | Input | 1 | Loads the IDELAYE2 primitive to the pre-programmed value in VARIABLE mode. In VAR_LOAD mode, it loads the value of CNTVALUEIN. In VAR_LOAD_PIPE mode it loads the value currently in the pipeline register.
在VARIABLE模式下,将IDELAY_VALUE的属性值装载。 在VAR_LOAD模式下,将输入CNTVALUEIN装载 在VAR_LOAD_PIPE模式下,将当前存储在流水线寄存器的值装入。 |
| CE | Input | 1 | Enable increment/decrement function
使能加减计数,动态改变延迟级数 |
| INC | Input | 1 | Increment/decrement number of tap delays.
加/减延迟计数,CE=1,INC=1加 CE=1,INC=0减 |
| CINVCTRL | Input | 1 | Dynamically inverts the clock (C) polarity
动态改变输入时钟C的极性。时钟极性改变后,至少延迟两个时钟周期,时钟才能稳定。 |
| CNTVALUEIN | Input | 5 | Counter value from FPGA logic for dynamically loadable tap value.
输入端口,接收FPGA内部逻辑值用于动态装载IDEKLAY2的延迟级数 |
| IDATAIN | Input | 1 | Data input for IDELAY from the IBUF
数据/时钟输入端,待延迟FPGA输入端经过IBUF的信号 |
| DATAIN | Input | 1 | Data input for IDELAY from the FPGA logic.
被延迟的信号来自FPGA内部逻辑 |
| LDPIPEEN | Input | 1 | Enables the pipeline register to load data.
使能流水线寄存器装载到IDELAY2的延迟级数值,只在VAR_LOAD_PIPE模式下有效 |
| DATAOUT | Output | 1 | Delayed data from one of two data input ports (IDATAIN or DATAIN).
延迟后的信号输出 |
| CNTVALUEOUT | Output | 5 | Counter value going to FPGA logic for monitoring tap value.
实际延迟级数输出,用于FPGA内部监测 |
2. 延迟矫正Delay Calibration(IDELAYCTRL)
Delay Calibration是伴随IDELAY2或ODELAY2的,如果例化了IDELAY2或ODELAY2,则Delay Calibration也要一起例化。Delay Calibration的作用是将不间断的矫正IDELAY2或ODELAY2,将误差限制在一定的区域,在电压、温度等环境参数变化时,可以减少系统的处理过程。校准时钟(REFCLK)是用户提供的时钟。IDEALYCTRL模块如图3所示。

图3 Delay Calibration ( IDEALYCTRL)
- Delay Calibration的输入/输出
复位(RST)
FPGA 配置后,Delay Calibration必须复位,直到REFCLK稳定。RST是异步复位脚,复位的高电平宽度须满足TIDELAYCTRL_RPW。
参考时钟REFCLK,这个时钟必须是BUFG或BUFH驱动的时钟。为了更好的矫正REFCLK的频率需要一定的精度(IDELAYCTRL_REF_PRECISION)。
- IDEALYCTRL位置
在每个clock region 的I/O colunm都有IDEALYCTRL,IDEALYCTRL在每个clock region内矫正IDELAY2或ODELAY2, 关于clock region(时钟区域)的详细资料,可以参照附件文档ug472_7Series_Clocking.pdf。
老师好,阅读本篇文章时遇到一点问题,请老师解答:
1、”IDELAY2″的命名表示“两接”的含义,那么“ILOGICE3、ISERDESE3″是代表”三接“的含义吗?
2、”IDELAY2″所处的位置结构是“ILOGICE2IDELAY2IOBPAD(管脚)”,对吗?
1. 文中指的是“连接”,如下图所示:

2.是的,如上图所示。
老师,clock region 的I/O在Device怎样查看具体在那个位置吖,因为Device没有查找功能
请参照文章Xilinx FPGA 7系列时钟资源