在解析LVDS信号时,十分重要的一环就是LVDS输入信号线在经过PCB输入到FPGA中后,本来该严格对齐的信号线会出现时延,所以需要在FPGA内部对其进行延时对齐后再进行解析。
Xilinx 7系器件中用于输入信号延时的组件为IDELAYE2可编程原语,通过可以编程的32抽头延迟线、环绕式延迟实现信号延迟。
原语可用于组合输入路径、寄存器输入路径、FPGA逻辑直接访问;可以对单个输入引脚进行信号延迟。原语的抽头延迟分辨率也就是延时精度由IDELAYCTRL原语控制。
IDELAYE2框图:
IDELAYE2例化:
(* 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©, // 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
);
IDELAYE2例化端口:
端口列表如上图:
C:时钟输入,原语的所有控制输入(如REGRST、LD、CE、INC)都与该时钟输入同步。当该原语配置为VARIABLE, VAR_LOAD和VAR_LOAD_PIPE模式时,该端口必须连接有效时钟。且该时钟必须由全局或区域时钟缓冲器提供。
REGRST:寄存器同步复位信号,当复位置1时,将原语内部流水线寄存器置0,仅在
VAR_LOAD_PIPE模式下使用。
LD:加载抽头值,LD端口置1有效,且与输入时钟C同步;
在VARIABLE模式下,IDELAY置高LD端口会加载IDELAY_VALUE参数端口设置的抽头值作为新的延时值,此时LD端口可当作IDELAY的复位信号,拉高LD后延时抽头值将设置为IDELAY_VALUE参数的值。
在VAR_LOAD模式下,IDELAY会加载由CNTVALUEIN端口设置的抽头值作为新的延时值。
在VAR_LOAD_PIPE模式下,IDELAY会加载当前在流水线寄存器中的抽头值作为新的延时值。
CE:控制INC端口作为抽头值增量或减量的使能,就是CE有效,INC端口的值才能生效。且该端口只在VARIABLE, VAR_LOAD, VAR_LOAD_PIPE这三个模式下使用。
INC:抽头延迟的增量减量,搭配CE使用,只有当CE为高时,INC才有效,当CE为低时INC值不起作用,其中INC=1时抽头值递增,INC=0时抽头值递减,且INC和CE都与时钟C同步,且当CE保持高,每个C的时钟周期,根据INC的值设置,抽头值会在下一个时钟C的上升沿开始进行抽头值的递增递减操作;
IDELAYE2原语的可编程延迟抽头会执行环绕操作,原语的延迟抽头值为0~31共32个数,环绕是指当抽头值当前到达边界,如0或31,在0时如果递减,抽头值将变为31,在31时如果递增,抽头值将变为0;
且信号的延时也只有32个选项,例如对一个信号从延时抽头值0开始一直做INC递增的延时操作,当抽头值到达31,递增1后,抽头值到0,此时这个抽头值0的信号延时与最开始抽头值初始为0的延时是相同的,而不是指从31递增到0后,信号延时在延时抽头值31的延时基础上又往后延迟了一个抽头的延时,这就是该原语的环绕操作。
CINVCTRL:动态控制输入时钟C的极性,且在切换极性时,两个时钟周期内不要控制IDLEAY原语的控制端口。
CNTVALUEIN:用于动态切换加载的抽头值。
IDATAIN:IDATAIN端口输入来自IOB,该输入数据由IOB中的IBUF驱动,也就是FPGA的管脚输入的信号,对FPGA的外部输入信号作延时。
DATAIN:DATAIN端口输入来自FPGA逻辑,该端口为内部逻辑提供了可访问的延迟线。
LDPIPEEN:流水线寄存器加载,当该端口为1时,会把当前CNTVALUEIN引脚上的抽头值加载到管道寄存器中。
DATAOUT:来自两个数据输入端口的延迟数据,延时后的输出数据线可以连接到ILOGIC、ISERDES组件或是FPGA逻辑。
CNTVALUEOUT:该端口用于报告此时输出的延迟数据加载的延迟抽头值。
IDELAYE2例化参数:
上图为原语的例化参数:
IDELAY_TYPE:设置IDELAY原语的延迟的工作模式,有FIXED, VARIABLE, VAR_LOAD,
VAR_LOAD_PIPE四种可选模式;
设置为FIXED模式时,抽头延迟值由参数IDELAY_VALUE的值确定,且该值是预设的,配置后无法更改;
设置为VARIABLE模式时,抽头延迟可选,设置CE=1和INC=1增加抽头延迟,设置CE=1和INC=0减少抽头延迟,递增递减操作与C时钟同步;
设置为VAR_LOAD模式时,置高LD端口,原语将立即加载CNTVALUEIN端口的值作为新的抽头延迟值,同时支持CE和INC协同的递增递减操作;
设置为VAR_LOAD_PIPE模式时,置高LDPIPEEN端口,原语将立即将CNTVALUEIN端口的值加载到原语内部的流水线寄存器中暂存,当置高LD端口,原语将立即加载流水线寄存器中的抽头值作为新的抽头延迟值(该模式一般用于多通道同步修改延迟的情况,同步性强,优化时序),同时支持CE和INC协同的递增递减操作。
DELAY_SRC:选择原语的输入数据源端口,可选值为IDATAIN和DATAIN,设置为IDATAIN时原语使用IDATAIN端口作为输入数据,数据来自IO引脚,设置为DATAIN时原语使用DATAIN端口作为输入数据,数据来自FPGA内部逻辑。
IDELAY_VALUE:指定了初始的抽头延迟数量,默认为0,可设置为0~31之间任意整数;
FIXED模式下,IDELAY_VALUE参数指定原语的抽头延时值;
VARIABLE模式下,IDELAY_VALUE值将作为延迟线的初始延时值,LD置高将会将原语的延迟重置为IDELAY_VALUE的值;
VAR_LOAD和VAR_LOAD_PIPE模式下,IDELAY_VALUE参数不被使用。
HIGH_PERFORMANCE_MODE:高性能模式选择参数,可选值为TRUE和FALSE,
TRUE模式降低抖动,降低抖动将会略微增加功耗,适用于高速场景,
FALSE降低功耗但抖动增加,适用于低速场景。
SIGNAL_PATTERN:数据输入的信号类型,可选值为DATA和CLOCK,由于时钟信号和数据信号有不同的电器特性,时钟信号具有周期性,而数据信号是随机的,两者在延迟链中积累的抖动量也不同,所以选择DATA(输入数据为数据信号)和CLOCK(输入数据为时钟信号),原语将会根据时钟和数据的电气特性的不同执行不同的抖动优化策略。
REFCLK_FREQUENCY:参考时钟频率,与IDELAYCTRL原语参考时钟需严格匹配,否则将会校准失败,范围为(190.0-210.0, 290.0-310.0),默认使用200.0,设置为200MHZ即可。
CINVCTRL_SEL:时钟动态反相的使能,输入时钟端口C是否可以反相,改参数搭配CINVCTRL端口使用,当参数设置为TRUE的同时将CINVCTRL端口置1可以将时钟C反相,当参数设置为FALSE时,时钟不会反相,CINVCTRL端口也将无法使用。
PIPE_SEL:仅在VAR_LOAD_PIPE模式下工作,控制流水线寄存器是否使用,设置为TRUE时启用流水线寄存器,FALSE时不启用流水线寄存器。
例化约束:
Vivado的例化模板中IDELAYE2原语还有一行约束:
(* IODELAY_GROUP = <iodelay_group_name> *)
该约束可以定义IDELAYE2原语的组,可以将多个IDELAYE2和ODELAYE2原语与一个IDELAYCTRL原语绑定,确保它们共享同一个参考时钟并物理相邻,减少时钟偏差;
使用时同一组的IDELAYE2和ODELAYE2和IDELAYCTRL原语都约束指定为一个相同的组名即可。
IDELAY工作模式:
IDELAY_TYPE参数设置工作模式,有FIXED, VARIABLE, VAR_LOAD,VAR_LOAD_PIPE:
FIXED固定延迟模式:
IDELAY_VALUE参数值将配置为延时值,配置后无法更改;
VARIABLE可变延迟模式:
由上表,该模式下,LD置1将加载IDELAY_VALUE参数值作为延时值;
CE和INC搭配执行当前延时值的递增递减操作,CE=1,INC=1递增,CE=1,INC=0递减;
其他输入延时值保持不变;
上图为VARIABLE模式下,IDELAY_VALUE参数值为0的时序:
时刻1,LD置1,原语加载为IDELAY_VALUE参数值,延时值DATAOUT变为tap0,
时刻2,CE=1,INC=1,延时值从0递增到1,从tap0变为tap1;
VAR_LOAD可加载变量延迟模式:
由上表,该模式下,
CE和INC搭配执行当前延时值的递增递减操作,同上条;
此时LD置1将加载CNTVALUEIN端口值作为延时值;
其他输入延时值保持不变;
上图为VAR_LOAD模式下的时序,
时刻1,LD置1,加载CNTVALUEIN端口的值2,延时值DATAOUT变为tap2,
时刻2,CE=1,INC=1,延时值从2递增到3,从tap2变为tap3,
时刻3,LD置1,加载CNTVALUEIN端口的值10,延时值DATAOUT变为tap10,
VAR_LOAD_PIPE可加载变量流水线寄存延迟模式:
该模式与VAR_LOAD模式类似,
CE和INC执行递增递减;
不同的是LD的操作,该模式下LD置1将加载内部流水线寄存器值作为延时值,
流水线寄存器则是在LDPIPEEN端口置1时,将CNTVALUEIN端口的值加载到寄存器中;
下节讲解IDELAYCTRL原语和IDELAYE2的搭配使用;
本文章由威三学社出品
对课程感兴趣可以私信联系