LVDS系列9:Xilinx 7系可编程输入延迟(二)
使用IDELAYE2的同时,还必须要例化IDELAYCTRL原语,IDELAYCTRL原语为IDELAYE2原语提供时钟参考,同时持续校准各个延迟抽头,减少外部环境和器件对于延迟精度的影响;
IDELAYCTRL框图
IDELAYCTRL例化模板:
(* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYCTRL IDELAYCTRL_inst (
.RDY(RDY), // 1-bit output: Ready output
.REFCLK(REFCLK), // 1-bit input: Reference clock input
.RST(RST) // 1-bit input: Active high reset input
);
IDELAYCTRL使用:
RST:高电平异步复位,在上电配置后需复位,复位需要在参考时钟REFCLK稳定情况下至少52ns复位;
REFCLK:参考时钟,范围按上一节IDELAYE2的参考时钟范围190.0-210.0, 290.0-310.0选取即可,支持200MHz和300MHz,其中范围有加减10M的范围是原语允许的波动,且该时钟必须由全局BUFG或水平BUFH时钟缓冲器进行驱动;
RDY:准备就绪信号,高有效,指示IDELAY和ODELAY校准完毕。REFCLK如果出现异常如保持一个周期的1或0,RDY就会拉低,此时就需要重新复位该原语;
时序如下图所示:
RST复位后,等待一段时间,RDY拉高,表示校准完毕,当REFCLK出现持续的异常高时,RDY拉低。
IDELAYE2延时精度:
延时精度指延时抽头值每个tap表示的延迟时间,可以按下列式子计算:
T_tap = 1s/(322REFCLK)
当提供200MHz的参考时钟:
T_tap= 1000000000000ps/(322200000000) = 78.125ps ≈ 78ps
当提供300MHz的参考时钟:
T_tap= 1000000000000ps/(322300000000) = 52.083ps ≈ 52ps
这表示每递增(不环绕的情况下)一个抽头值,数据线的延迟比上一个抽头值的延迟时间增加78ps或52ps;
IDELAY延时值:
IDELAY延时 = 延时基准T_base + 抽头值tap_num*T_tap
其中延时基准T_base一般为600ps,表示数据线只要通过IDELAY原语,即使抽头值为0,也会被延时600ps;
IDELAYE2和IDELAYCTRL仿真测试:
Testbench代码:
Testbench简单生成测试的输入数据和参考时钟,后续在测试模块中修改参数和逻辑去查看原语的各种使用细节;
tb代码:
`timescale 1ns / 1ps
module tb;
reg clk_200m;
reg clk_300m;
reg clk;
reg rst;
reg load_trg;
reg data1;
reg data2;
wire dout;
initial begin
clk_200m = 0;
clk_300m = 0;
clk = 0;
rst = 1;
#200
rst = 0;
end
always #5 clk = ~clk;
always #(2.5) clk_200m = ~clk_200m;
always #(1.667) clk_300m = ~clk_300m;
initial begin
data1 = 0;
data2 = 0;
while(1)begin
#10
data1 = $random();
data2 = $random();
end
end
initial begin
load_trg = 0;
while(1)begin
#100
@(posedge clk)
load_trg = 1;
@(posedge clk)
load_trg = 0;
end
end
top_7series_idelay inst_top_7series_idelay (
.clk_ref_200m (clk_200m),
.clk_ref_300m (clk_300m),
.clk (clk),
.rst (rst),
.load_trg (load_trg),
.idatain (data1),
.datain (data2),
.dout (dout)
);
endmodule
FIXED模式使用:
Fixed模式下的测试模块代码:
module top_7series_idelay(
input wire clk_ref_200m,
input wire clk_ref_300m,
input wire clk,
input wire rst,
input wire load_trg,
input wire idatain,
input wire datain,
output wire dout
);
wire idelayctrl_rdy;
wire [4:0] cntvalueout;
// idelayctrl -------------------------------------------------
IDELAYCTRL IDELAYCTRL_inst (
.RDY(idelayctrl_rdy), // 1-bit output: Ready output
.REFCLK(clk_ref_200m), // 1-bit input: Reference clock input
.RST(rst) // 1-bit input: Active high reset input
);
// idelaye2 -------------------------------------------------
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(dout), // 1-bit output: Delayed data output
.C(0), // 1-bit input: Clock input
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(0), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(0), // 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(0), // 1-bit input: Increment / Decrement tap delay input
.LD(0), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(0), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(0) // 1-bit input: Active-high reset tap-delay input
);
Endmodule
此时idelayctrl使用外部的rst复位,当rdy拉高后我们查看延时情况;
此时使用IDATAIN端口的数据进行延时,选择200M参考时钟,其他模式的控制此时端口不用关注,因为fixed模式不使用动态控制;
可以看到上图中,此时IDELAY_VALUE设置为0,此时cntvalueout为0,表示此时原语正在工作的抽头值为0,idatain和dout的两个上升沿间隔了0.6ns,也就是之前所讲的200M的延时基准;
上图为将IDELAY_VALUE参数设置为30(0x1e),此时cntvalueout为0x1e,可以看到此时的idatain和dout的延时为2.94ns=0.6ns+30*78ps,与理论的延时时间相符;
如果将IDELAYCTRL模块的参考时钟改为300M的clk_ref_300m,将IDELAYE2的REFCLK_FREQUENCY参数改为300.0;
上图为IDELAY_VALUE参数设置为0的情况,可以看到300M参考时钟的情况下,延时基准还是保持为0.6ns;
上图为300M参考下,将IDELAY_VALUE参数设置为30(0x1e),可以看到此时的idatain和dout的延时为2.16ns=0.6ns+30*52ps,与理论的延时时间相符;
其他的VARIABLE模式、VAR_LOAD模式和VAR_LOAD_PIPE模式在下一节继续进行讲解;
本文章由威三学社出品
对课程感兴趣可以私信联系