时序约束之Xilinx IDELAYE2应用及仿真笔记

作者:FPGA技术实战

引言:本文我们介绍下Xilinx SelectIO资源内部IDELAYE2资源应用。IDELAYE2原句配合IDELAYCTRL原句主要用于在信号通过引脚进入芯片内部之前,进行延时调节,一般高速端口信号由于走线延时等原因,需要通过IDELAYE2原语对数据做微调,实现时钟与数据的源同步时序要求。

1. IDELAYE2在SelectIO中的位置

7系列FPGA SelectIO中HR Bank和HP bank中都有IDELAYE2模块,其在SelectIO路径位置如下图所示。

1-2.JPG

2. IDELAYE2延迟特性

Kintex-7器件DC and AC 开关特性手册中介绍了IDELAY延迟分辨率及最大工作时钟,如下表所示。

表1.JPG

根据上图延迟分辨率,例如当参考时钟为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.JPG

 (* 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(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

   );

IDATAIN为延时前的输入信号,DATAOUT为延时后的输出信号。REFCLK_FREQUENCY参数为IDELAYCTRL原语的参考时钟频率,一般为200Mhz,最大频率范围根据器件手册确定。IDELAY_VALUE参数用来设置延时的tap数,范围为1~31,每个tap数的延时时间和参考时钟频率有关。

4. IDELAYCTRL原句
IDELAYE2或者ODELAYE2原句例化时,IDELAYCTRL原句也必须例化。IDELAYCTRL通过参考时钟REFCLK来校准IDELAY2每个tap的延时值,减少处理、电压和温度的影响。该模块使用REFCLK时钟精细校准。

(* 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

   );

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.JPG

.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
2. IDELAY_TYPE="VARIABLE"时,仿真结果如下图所示。

图5.JPG

 .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,故:

data_in_from_pins_delay信号延迟:TapDelayTime=600ps+78ps*10=1380ps
3. IDELAY_TYPE="VAR_LOAD"时,使能LD信号,仿真结果如下图所示。

图6.JPG

 .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,故:

data_in_from_pins_delay信号延迟:TapDelayTime=600ps+78ps*5=990ps
4. IDELAY_TYPE="VAR_LOAD"时,使能CE和INC信号,仿真结果如下图所示。

图7.JPG

  .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.

最新文章

最新文章