此篇是我在学习中做的归纳与总结,其中如果存在版权或知识错误或问题请直接联系我,欢迎留言。
PS:本着知识共享的原则,此篇博客可以转载,但请标明出处!
每个I/O模块都包含了一个可编程的延迟原句,称作IDELAYE2。IDELAY可以连接到ILOGICE2/ISERDESE2或者ILOGICE3/ISERDESE2模块。IDELAY2是一个可编程的31阶延迟原句,延迟参数可以参考7系列FPGA对应器件家族的器件手册。它既可以应用于组合逻辑也可以应用于时序逻辑或者同时用于两者。另外,它也可以直接被FPGA逻辑访问。IDELAY允许即将输入的信号在各自的输入管脚上做延迟处理,该延迟由IDELAYCTRL原句控制,延迟参考时钟频率在7系列器件手册有明确定义。
IDELAYE2:
IDELAYE2逻辑是一个31抽头的循环延时补偿模块,对输入的信号进行指定分辨率的延时,FPGA可以直接访问。Tap延时分辨率由IDELAYCTRL的参考时钟提供持续补偿。图(1)是IDELAYE2接口示意图,表(1)是对这些接口的描述。
引脚说明:
在IDELAYCTRL中,对于IDELAY2使用的时钟做了说明,它的工作时钟区域有(190-210MHz)和(290-310MHz)两个。
IDELAY模式:
IDELAY主要有四种操作模式,下面我们分别来介绍主要使用的三种模式。
1.固定延迟模式(IDELAY_TPYE=FIXED)
在该模式下数据延迟由属性IDELAY_VALUE设置,且延迟固定,不可更改。在该模式下,IDELAYCTRL原句必须例化。
2.可变延迟模式(IDELAY_TPYE=VARIABLE)
在该模式下,延迟值可以在配置后通过CE和INC端口进行动态配置。同样,在该模式下,IDELAYCTRL原句也必须例化。该模式下的逻辑控制对应关系如表2-6所示。
3.可加载可变延迟模式(IDELAY_TYPE=VAR_LOAD)
该模式下功能与VARIABLE模式下类似,只不过可以通过CNTVALUEIN加载延迟节拍数。多了一种延迟加载方法。当LD端口有效时可以加载新的延迟CNTVALUE值到控制模块。该模式下逻辑功能关系如表2-7所示。
官方参考代码:
(* IODELAY_GROUP = "ADC_DCLK_DELAY" *) // 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("TRUE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(5'h0E), // 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("CLOCK") // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT( ), // 5-bit output: Counter value output
.DATAOUT( ), // 1-bit output: Delayed data output
//.C( 1'b1 ), // 1-bit input: Clock input a_adc_clk_bufio_div_4
.C( ), // 1-bit input: Clock input
.CE(1'b0), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(cntvaluein), // 5-bit -input: Counter value input
.DATAIN(1'b0), // 1-bit input: Internal delay data input
.IDATAIN( ), // 1-bit input: Data input from the I/O
.INC(1'b0), // 1-bit input: Increment / Decrement tap delay input
.LD( LD ), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(1'b0), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(~RDY) // 1-bit input: Active-high reset tap-delay input
);