威三电子  

               威三电子

LVDS系列10:Xilinx 7系可编程输入延迟(三)

2026-07-03 09:23:33

浏览:

这节继续讲解IDELAYE2和IDELAYCTRL的VARIABLE模式、VAR_LOAD模式和VAR_LOAD_PIPE模式的仿真测试; Ø  VARIABL

                                                 

这节继续讲解IDELAYE2IDELAYCTRLVARIABLE模式、VAR_LOAD模式和VAR_LOAD_PIPE模式的仿真测试;

 

Ø  VARIABLE模式使用:

VARIABLE模式需要使用INCCE端口控制抽头值的递增递减变化;

测试代码如下:

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;

reg                                                ce=0;

reg                                                cinvctrl=0;

reg      [4:0]                   cntvaluein=0;

reg                                                inc=0;

reg                                                ld=0;

reg                                                ldpipeen=0;

reg                                                regrst=0;

 

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

always @(posedge clk) begin

              if (rst) begin

                            inc <= 0;

                            ce <= 0;

              end

              else if (load_trg==1) begin

                            inc <= 1;

                            ce <= 1;

              end

              else begin

                            inc <= 0;

                            ce <= 0;

              end

end

 

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('VARIABLE'),           // 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(clk),                     // 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

 );

endmodule

 

incce设置为,当load_trg拉高一次,load_trg每隔100ns触发一次,就触发一个时钟周期的inc=1ce=1

可以看到上图,load_trg到来一次,cntvalueout实时抽头值就增加1,到31后,再次递增则就又回到了0

且从上图可以看到,抽头值为30时,延时时间也正确;

 

incce设置为,当load_trg拉高一次,就触发一个时钟周期的inc=0ce=1,且将IDELAY_VALUE参数设置为20

从上图可以看到,IDELAY_VALUE参数设置为20后,原语上电默认的抽头值为20,当每次loag_trg到来,抽头值递减,从20递减到0,当抽头值为0后,再一次递减则又回到31

 

之前load_trg是间隔100ns拉高一个clk时钟周期,现在这次将load_trg一直保持为高,

可以看到,ce保持为1inc保持0cntvalueout每个clk时钟周期就变化一次,

具体到上图中,抽头值显示在clk100M)连续两个周期从8变到7的情况下,查看在抽头值8时延时为1.224ns,抽头值为7时延时为1.146,其中1.224=0.6ns+8*78ps1.146=0.6ns+7*78ps,都符合抽头值对应的延时;

 

且在该模式下,这里将ce拉高后触发ld拉高,可以看到,ldVARIABLE模式下拉高后,将会把抽头值重置为IDELAY_VALUE设置的值,这里设置的值为20

 

 

Ø  VAR_LOAD模式使用:

VAR_LOAD模式使用LDCNTVALUEIN端口控制抽头值,同时也可以使用INCCE端口控制抽头值的递增递减变化;

在上一个模式的基础上,修改ldcntvaluein的控制:

always @(posedge clk) begin

              if (rst) begin

                            inc <= 0;

                            ce <= 0;

              end

              else if (load_trg==1) begin

                            inc <= 0;

                            ce <= 0;

              end

              else begin

                            inc <= 0;

                            ce <= 0;

              end

end

 

always @(posedge clk) begin

              if (rst) begin

                            ld <= 0;

                            cntvaluein <= 0;

              end

              else if (load_trg==1) begin

                            ld <= 1;

                            cntvaluein <= cntvaluein + 1;

              end

              else begin

                            ld <= 0;

              end

end

每个load_trg触发使用ldcntvaluein加载一次抽头值,

可以看到在ld使能后的下一个clk时钟周期,cntvaluein就加载成功,cntvalueout输出的抽头值就变为了cntvaluein的值;

修改下incce的逻辑,可以看到在VAR_LOAD模式下incce能够工作;

 

incld两种控制逻辑同时使能时,修改控制代码如下:

always @(posedge clk) begin

              if (rst) begin

                            inc <= 0;

                            ce <= 0;

              end

              else if (load_trg==1) begin

                            inc <= 1;

                            ce <= 1;

              end

              else begin

                            inc <= 0;

                            ce <= 0;

              end

end

 

always @(posedge clk) begin

              if (rst) begin

                            ld <= 0;

                            cntvaluein <= 0;

              end

              else if (load_trg==1) begin

                            ld <= 1;

                            cntvaluein <= cntvaluein + 8;

              end

              else begin

                            ld <= 0;

              end

end

 

从上图中可以看到,VAR_LOAD模式下,inc=1/ce=1ld同时使能时,ld控制的cntvaluein端口值成功写入,inc/ce的递增操作未生效,说明在该模式下ld控制的优先级较高,但是在使用改模似时,尽量避免出现控制逻辑冲突的情况;

 

 

Ø  VAR_LOAD_PIPE模式使用:

VAR_LOAD_PIPE模式,使用LDPIPEENCNTVALUEIN端口值加载到流水线寄存器中,再使用LD端口将流水线寄存器中的抽头值加载到线上使用,同时也可以使用INCCE端口控制抽头值的递增递减变化;

 

测试代码:

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;

reg                                                ce=0;

reg                                                cinvctrl=0;

reg      [4:0]                   cntvaluein=0;

reg                                                inc=0;

reg                                                ld=0;

reg                                                ldpipeen=0;

reg                                                regrst=0;

reg      [3:0]                   ldpipeen_dly;

 

// idelayctrl -------------------------------------------------

 

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

 

always @(posedge clk) begin

              if (rst) begin

                            inc <= 0;

                            ce <= 0;

              end

              else if (load_trg==1) begin

                            inc <= 0;

                            ce <= 0;

              end

              else begin

                            inc <= 0;

                            ce <= 0;

              end

end

 

always @(posedge clk) begin

              if (rst) begin

                            ldpipeen <= 0;

              end

              else if (load_trg==1) begin

                            ldpipeen <= 1;

              end

              else begin

                            ldpipeen <= 0;

              end

end

 

always @(posedge clk) begin

              if (rst) begin

                            cntvaluein <= 0;

              end

              else if (ldpipeen==1) begin

                            cntvaluein <= cntvaluein + 1;

              end

end

 

always @(posedge clk) begin

              if (rst) begin

                            ld <= 0;

              end

              else if (ldpipeen_dly[3]==1) begin

                            ld <= 1;

              end

              else begin

                            ld <= 0;

              end

end

 

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_PIPE'),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE

    .IDELAY_VALUE(0),                // Input delay tap setting (0-31)

    .PIPE_SEL('TRUE'),              // 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(clk),                     // 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

 );

endmodule

 

从上图中可以看出,黄线处,ldpipeen拉高把cntvaluein端口值4存入流水线寄存器,然后过了几个周期,ld拉高后,cntvalueout才变为4,符合该模式的时序要求;

 

如果修改下逻辑,不要每次拉高ldpipeen都拉高一次ld,多使用ldpipeen加载几次数据到流水线寄存器,然后再拉高ld加载寄存器中的值,

效果如上图所示,ldpipeen端口拉高了几次去寄存,***图中三次ld拉高,实际加载到线上的抽头值为3711,都是在拉高ld前的***一次ldpipeen拉高寄存的值,说明ldpipeen使能后加载到寄存器里的值会被新值覆盖,***ld加载时以***的值为准。

 

 本文章由威三学院出品

对课程感兴趣可以私信联系

 

 

 


0
LVDS系列10:Xilinx 7系可编程输入延迟(三)
这节继续讲解IDELAYE2和IDELAYCTRL的VARIABLE模式、VAR_LOAD模式和VAR_LOAD_PIPE模式的仿真测试; Ø  VARIABL
长按图片保存/分享

北京威三电子科技有限公司

突破技术壁垒,芯创智联领航未来

 


北京威三电子科技有限公司 版权所有
京ICP备2026012969号
 

热线:

159-2199-9232

 

图片展示

淘宝店铺:

威三科教

地址:

北京市延庆区辰龙国际6号楼406室

微信公众号:

北京威三电子科技有限公司 

热线:159-2199-9232

淘宝店铺:威三科教

地址:北京市延庆区辰龙国际6号楼406


微信公众号

图片展示
北京威三电子科技有限公司 版权所有| 京ICP备2026012969号
微信公众号
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功!
添加微信好友,详细了解产品
我知道了