引言:本文我们介绍下Xilinx SelectIO资源内部IDELAYE2资源应用。IDELAYE2原句配合IDELAYCTRL原句主要用于在信号通过引脚进入芯片内部之前,进行延时调节,一般高速端口信号由于走线延时等原因,需要通过IDELAYE2原语对数据做微调,实现时钟与数据的源同步时序要求。
1. IDELAYE2在SelectIO中的位置
7系列FPGA SelectIO中HR Bank和HP bank中都有IDELAYE2模块,其在SelectIO路径位置如下图所示。
图1:7系列FPGA HP Bank I/O Tile
图2:7系列FPGA HR Bank I/O tile
2. IDELAYE2延迟特性
Kintex-7器件DC and AC 开关特性手册中介绍了IDELAY延迟分辨率及最大工作时钟,如下表所示。
表1:IDELAY延迟分辨率及最大工作时钟
根据上图延迟分辨率,例如当参考时钟为200MHz时,根据公式计算:
平均抽头延迟单位为Tidelayresoluion=1/(32×2×200MHz)≈78ps。
需要说明的一点是:
当抽头系数Tap=0时,输入和输出延迟时间并非为0ps,而是600ps;
当抽头系数Tap=1~31时,TapDelayTime=600ps+Tidelayresoluion*Tap。
3. IDELAYE2原句
在Vivado Language Templates中搜索IDELAY,在Verilog目录中根据工程器件家族Kintex-7选择IDELAYE2原句模板,如下图所示。
图3:IDELAYE2原句模板
(* IODELAY_GROUP =IDATAIN为延时前的输入信号,DATAOUT为延时后的输出信号。REFCLK_FREQUENCY参数为IDELAYCTRL原语的参考时钟频率,一般为200Mhz,最大频率范围根据器件手册确定。IDELAY_VALUE参数用来设置延时的tap数,范围为1~31,每个tap数的延时时间和参考时钟频率有关。*) // 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 );
(* IODELAY_GROUP =*) // 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 );
5. IDELAYE2原句工程源码与仿真测试
5.1 开发环境
硬件平台:XC7Z035FFG676-2
软件环境:Vivado 2017.4
仿真软件:Vivado Simulator
5.2 软件代码
IDELAYE2工程源码:
module IDELAYE2_Test( input clk_in_50M, //时钟 input rst_n, //复位 input ld, input ce, input inc, input [4:0] tap_value_in, //设置延迟抽头系数 input data_in_from_pins, //输入Pins数据 output [4:0] tap_value_out, output delay_ctrl_rdy, //IDELAYCTRL 延迟校准ready信号 output data_in_from_pins_delay //输出Pins延迟数据 ); wire pll_locked; wire clk_200M; wire clk_50M; wire REFCLK; wire RST; //IDELAYCTRL 时钟及复位 assign REFCLK = clk_200M; assign RST = pll_locked ? ~rst_n : 1'b1; //复位DELAYCTRL原句 // ======== 例化PLL时钟 ======== clk_wiz_0 pll0 ( // Clock out ports .clk_out1(clk_200M), // output clk_out1 .clk_out2(clk_50M), // output clk_out2 // Status and control signals .locked(pll_locked), // output locked // Clock in ports .clk_in1(clk_in_50M)); // input clk_in1 // ======== 例化 IDELAYCTRL 和 IDELAYE2 ======== (* IODELAY_GROUP = "IODELAY_Test_IO" *) // 指定关联的IDELAY/ODELAY和IDELAYCTRL的组名 IDELAYCTRL IDELAYCTRL_inst ( .RDY(delay_ctrl_rdy), // 1-bit output: Ready output .REFCLK(REFCLK), // 1-bit input: Reference clock input .RST(RST) // 1-bit input: Active high reset input ); (* IODELAY_GROUP = "IODELAY_Test_IO" *) //指定关联的IDELAY/ODELAY和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("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择 .IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延迟Tap .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(tap_value_out), // 5-bit output: Counter value output .DATAOUT(data_in_from_pins_delay), // 1-bit output: Delayed data output .C(clk_50M), // 1-bit input: Clock input,该时钟用于驱动IDELAYE2内部控制信号 .CE(ce), // 1-bit input: Active high enable increment/decrement input .CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input .CNTVALUEIN(tap_value_in), // 5-bit input: Counter value input .DATAIN(1'b0), // 1-bit input: Internal delay data input .IDATAIN(data_in_from_pins), // 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(1'b0), // 1-bit input: Enable PIPELINE register to load data input .REGRST(RST) // 1-bit input: Active-high reset tap-delay input );
IDELAYE2 Testbench部分源码:
initial begin //1. 测试IDELAYE2模式为"FIXED"--------.IDELAY_TYPE("FIXED") #10000 data_in_from_pins = 1'b1; //输入脉冲 #20 data_in_from_pins = 1'b0; //2.测试IDELAYE2模式为"VARIABLE"--------.IDELAY_TYPE("VARIABLE") #200 ld = 1'b1; //控制信号 #50 ld = 1'b0; #20 //"VARIABLE"模式下,使能ce和inc,Tap=Current Value + 1 ce = 1'b1; inc = 1'b1; #40 ce = 1'b0; inc = 1'b0; #20 data_in_from_pins = 1'b1; //输入数据 #20 data_in_from_pins = 1'b0; //3.测试IDELAYE2模式为"VAR_LOAD"--------.IDELAY_TYPE("VAR_LOAD") #20 tap_value_in = 5'd5; //控制信号 #100 ld = 1'b1; //"VARIABLE"模式下,使能ld,Tap= CNTVALUEIN值 #50 ld = 1'b0; #20 data_in_from_pins = 1'b1; //输入数据 #20 data_in_from_pins = 1'b0; #20 //“VAR_LOAD”模式下,使能ce和inc,Tap=Current Value + 1 ce = 1'b1; inc = 1'b1; #40 ce = 1'b0; inc = 1'b0; #20 data_in_from_pins = 1'b1; //输入数据 #20 data_in_from_pins = 1'b0; end
5.3 仿真结果
1. IDELAY_TYPE="FIXED"时,仿真结果如下图所示。
图4:IDELAY_TYPE="FIXED"仿真结果
.IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择 .IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延迟Tap如图所示,当IDELAY_TYPE="FIXED"时: data_in_from_pins_delay信号延迟:TapDelayTime=600ps+78ps*9=1302ps
图5:IDELAY_TYPE="VARIABLE"仿真结果
.IDELAY_TYPE("VARIABLE"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择 .IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延迟Tap如图所示,当IDELAY_TYPE="VARIABLE"时,控制信号正向触发一次,Tap值=Current Value + 1,如图tap_value_out = 10,故:
图6:IDELAY_TYPE="VAR_LOAD"仿真结果
.IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择 .IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延迟Tap如图所示,当IDELAY_TYPE="VAR_LOAD"时,使能ld,Tap= CNTVALUEIN(tap_valude_in)值,如图tap_value_out = 5,故:
图7:IDELAY_TYPE="VAR_LOAD"仿真结果
.IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择 .IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延迟Tap如图所示,当IDELAY_TYPE="VAR_LOAD"时,使能ce和inc,Tap= Current Value + 1=6,如图tap_value_out = 6,故:
data_in_from_pins_delay信号延迟:TapDelayTime=600ps+78ps*6=1068ps.
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !