XILINX IO资源 介绍
Input Delay Reasource (IDELAY):
先来说说IDELAYCTRL资源:
借鉴了这位博主对它的描述:(https://blog.csdn.net/haoxingheng/article/details/50320145)
在电压、温度等因素变化时,可能会影响到系统的时序,此时IDELAYCTRL模块就可以连续补偿时钟域内所有个体的delay taps (IDELAY/ODELAY)。如果使用了IOB上的IDELAY或ODELAY资源,那么就必须使用IDELAYCTRL资源。请注意,整个IO BANK里面只有一个IDELAYCTRL。
IDELAYCTRL很重要的一个输入项就是参考时钟REFCLK,补偿时钟域内所有模块的时序参考,这个时钟必须由BUFG或BUFH驱动。REFCLK必须保证在FIDELAYCTRL_REF+IDELAYCTRL_REF_PRECISION(MHz)ppm才能保证IDELAY/ODELAY的延时分辨率:
(TIDELAYRESOLUTION=1/(32x 2 x FREF))
再来说IDELAYE2资源:
然后贴一张UG471的图镇楼
IDELAYE2就是这么个模块,接口信号就是这么多。
再看看原语代码具体长什么样子:
哈哈,这个配色够骚吧。
然后再看它接口信号都是些什么意思:(参考了这位博主的内容:https://blog.csdn.net/haoxingheng/article/details/50320145)
端口名 |
方向 |
位宽 |
描述 |
C |
I |
1 |
当使用VARIABLE, VAR_LOAD或 VAR_LOAD_PIPE模式下的时钟输入,必须是由BUFG或BUFR驱动,当使用SelectIO资源时,必须和它的时钟源相同。 |
REGRST |
I |
1 |
复位pipeline寄存器,仅在VAR_LOAD_PIPE模式下有效 |
LD |
I |
1 |
VARIABLE模式:使能预编程值; VAR_LOAD模式:使能CNTVALUEIN值作为延迟tap; VAR_LOAD_PIPE模式:使能当前pipeline寄存器的值。 |
INC |
I |
1 |
INC/DEC增加,减少的Tap数 |
CE |
I |
1 |
使能INC和DEC功能,只在VARIABLE, VAR_LOAD或 VAR_LOAD_PIPE模式下有效;当CE保持为高的时候,每一个C周期都增加或减少一个TIDELAYRESOLUTION的时延。 |
CINVCTRL |
I |
1 |
动态翻转C的极性,当使用该功能时,需禁止IDELAY control引脚2个cycle。 |
CNTVALUEIN |
I |
5 |
来自FPGA逻辑的动态Tap值 |
IDATAIN |
I |
1 |
来自IBUF的数据输入,输出可驱动FPGA逻辑、ILOGICE和ISERDESE |
DATAIN |
I |
1 |
来自FPGA逻辑的数据输入,输出不可驱动IOB |
LDPIPEEN |
I |
1 |
使能pipeline寄存器加载数据 |
DATAOUT |
O |
1 |
延时输出的数据 |
CNTVALUEOUT |
O |
5 |
Tap值输出,用于FPGA监测 |
再看看原语里面的parameter都代表什么意思:
这里圈出来的是本篇要重点说明的点:
IDELAY_TYPE: FIXED表示固定延迟
IDELAY_VALUE:表示延迟多少tap,这里要重点说一下这个tap,它的这个延迟单位tap到底多长时间,好。那就先看这个REFCLK_FREQUENCY,
一般我们设置默认200MHZ,T=5ns tap=2.5ns/32 ,因为这里可以设置0-31个tap,大约就是0.078ns。
好了,接口和parameter都介绍完了。
来看看我怎么用它:
先说这个VAR_LOAD模式:
时序图就是这样了,这个时序图是对上面表2-7的完美解释了。LD拉高的时候把CNTVALUEIN加载进去,INC和CE同时拉高的时候tap递增。
上面是UG471对这种模式用法的描述,简而言之就是当在这种模式下的时候,LD信号拉高就把延迟的tap值通过CNTVALUEIN加载进去了,具体配置上图中贴出来的代码就是了。
重点是看仿真波形:
默认延迟为0.6ns,我设置CNTVALUENIN为5'b10,可以看到输入时刻为2500ns,输出时刻为2500.756ns。延迟为2个tap(0.078ns)
这里要说明一下,LD信号拉高一个clk即可,多拉高几个clk也没用,延迟还是2个tap。因为CNTVALUENIN始终是2’b10,仿真我也试过了。
FIXED模式就更简单了。后面会持续的更新其他io资源的理解和仿真。