当前位置:   article > 正文

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

idelaye2

引言:本文我们介绍下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语句模板

  1. (* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
  2. IDELAYE2 #(
  3. .CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
  4. .DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
  5. .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
  6. .IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
  7. .IDELAY_VALUE(0), // Input delay tap setting (0-31)
  8. .PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
  9. .REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
  10. .SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
  11. )
  12. IDELAYE2_inst (
  13. .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
  14. .DATAOUT(DATAOUT), // 1-bit output: Delayed data output
  15. .C(C), // 1-bit input: Clock input
  16. .CE(CE), // 1-bit input: Active high enable increment/decrement input
  17. .CINVCTRL(CINVCTRL), // 1-bit input: Dynamic clock inversion input
  18. .CNTVALUEIN(CNTVALUEIN), // 5-bit input: Counter value input
  19. .DATAIN(DATAIN), // 1-bit input: Internal delay data input
  20. .IDATAIN(IDATAIN), // 1-bit input: Data input from the I/O
  21. .INC(INC), // 1-bit input: Increment / Decrement tap delay input
  22. .LD(LD), // 1-bit input: Load IDELAY_VALUE input
  23. .LDPIPEEN(LDPIPEEN), // 1-bit input: Enable PIPELINE register to load data input
  24. .REGRST(REGRST) // 1-bit input: Active-high reset tap-delay input
  25. );

4. IDELAYCTRL原句

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

  1. (* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
  2. IDELAYCTRL IDELAYCTRL_inst (
  3. .RDY(RDY), // 1-bit output: Ready output
  4. .REFCLK(REFCLK), // 1-bit input: Reference clock input
  5. .RST(RST) // 1-bit input: Active high reset input
  6. );

5. IDELAYE2原句工程源码与仿真测试

5.1 开发环境

  • 硬件平台:XC7Z035FFG676-2

  • 软件环境:Vivado 2017.4

  • 仿真软件:Vivado Simulator

5.2 软件代码
    IDELAYE2工程源码:

  1. module IDELAYE2_Test(
  2. input clk_in_50M, //时钟
  3. input rst_n, //复位
  4. input ld,
  5. input ce,
  6. input inc,
  7. input [4:0] tap_value_in, //设置延迟抽头系数
  8. input data_in_from_pins, //输入Pins数据
  9. output [4:0] tap_value_out,
  10. output delay_ctrl_rdy, //IDELAYCTRL 延迟校准ready信号
  11. output data_in_from_pins_delay //输出Pins延迟数据
  12. );
  13. wire pll_locked;
  14. wire clk_200M;
  15. wire clk_50M;
  16. wire REFCLK;
  17. wire RST;
  18. //IDELAYCTRL 时钟及复位
  19. assign REFCLK = clk_200M;
  20. assign RST = pll_locked ? ~rst_n : 1'b1; //复位DELAYCTRL原句
  21. // ======== 例化PLL时钟 ========
  22. clk_wiz_0 pll0
  23. (
  24. // Clock out ports
  25. .clk_out1(clk_200M), // output clk_out1
  26. .clk_out2(clk_50M), // output clk_out2
  27. // Status and control signals
  28. .locked(pll_locked), // output locked
  29. // Clock in ports
  30. .clk_in1(clk_in_50M)); // input clk_in1
  31. // ======== 例化 IDELAYCTRL 和 IDELAYE2 ========
  32. (* IODELAY_GROUP = "IODELAY_Test_IO" *) // 指定关联的IDELAY/ODELAY和IDELAYCTRL的组名
  33. IDELAYCTRL IDELAYCTRL_inst (
  34. .RDY(delay_ctrl_rdy), // 1-bit output: Ready output
  35. .REFCLK(REFCLK), // 1-bit input: Reference clock input
  36. .RST(RST) // 1-bit input: Active high reset input
  37. );
  38. (* IODELAY_GROUP = "IODELAY_Test_IO" *) //指定关联的IDELAY/ODELAY和IDELAYCTRL的组名
  39. IDELAYE2 #(
  40. .CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
  41. .DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
  42. .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
  43. .IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择
  44. .IDELAY_VALUE(5'd9), // Input delay tap setting (0-31) 固定延迟Tap
  45. .PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
  46. .REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).时钟常量
  47. .SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
  48. )
  49. IDELAYE2_inst (
  50. .CNTVALUEOUT(tap_value_out), // 5-bit output: Counter value output
  51. .DATAOUT(data_in_from_pins_delay), // 1-bit output: Delayed data output
  52. .C(clk_50M), // 1-bit input: Clock input,该时钟用于驱动IDELAYE2内部控制信号
  53. .CE(ce), // 1-bit input: Active high enable increment/decrement input
  54. .CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
  55. .CNTVALUEIN(tap_value_in), // 5-bit input: Counter value input
  56. .DATAIN(1'b0), // 1-bit input: Internal delay data input
  57. .IDATAIN(data_in_from_pins), // 1-bit input: Data input from the I/O
  58. .INC(inc), // 1-bit input: Increment / Decrement tap delay input
  59. .LD(ld), // 1-bit input: Load IDELAY_VALUE input
  60. .LDPIPEEN(1'b0), // 1-bit input: Enable PIPELINE register to load data input
  61. .REGRST(RST) // 1-bit input: Active-high reset tap-delay input
  62. );

IDELAYE2 Testbench部分源码:

  1. initial begin
  2. //1. 测试IDELAYE2模式为"FIXED"--------.IDELAY_TYPE("FIXED")
  3. #10000 data_in_from_pins = 1'b1; //输入脉冲
  4. #20 data_in_from_pins = 1'b0;
  5. //2.测试IDELAYE2模式为"VARIABLE"--------.IDELAY_TYPE("VARIABLE")
  6. #200 ld = 1'b1; //控制信号
  7. #50 ld = 1'b0;
  8. #20 //"VARIABLE"模式下,使能ce和inc,Tap=Current Value + 1
  9. ce = 1'b1;
  10. inc = 1'b1;
  11. #40
  12. ce = 1'b0;
  13. inc = 1'b0;
  14. #20 data_in_from_pins = 1'b1; //输入数据
  15. #20 data_in_from_pins = 1'b0;
  16. //3.测试IDELAYE2模式为"VAR_LOAD"--------.IDELAY_TYPE("VAR_LOAD")
  17. #20 tap_value_in = 5'd5; //控制信号
  18. #100 ld = 1'b1; //"VARIABLE"模式下,使能ld,Tap= CNTVALUEIN值
  19. #50 ld = 1'b0;
  20. #20 data_in_from_pins = 1'b1; //输入数据
  21. #20 data_in_from_pins = 1'b0;
  22. #20 //“VAR_LOAD”模式下,使能ce和inc,Tap=Current Value + 1
  23. ce = 1'b1;
  24. inc = 1'b1;
  25. #40
  26. ce = 1'b0;
  27. inc = 1'b0;
  28. #20 data_in_from_pins = 1'b1; //输入数据
  29. #20 data_in_from_pins = 1'b0;
  30. end

4.3 仿真结果

1. IDELAY_TYPE="FIXED"时,仿真结果如下图所示。

图片

图4:IDELAY_TYPE="FIXED"仿真结果

  1. .IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择
  2. .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:IDELAY_TYPE="VARIABLE"仿真结果

  1. .IDELAY_TYPE("VARIABLE"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择
  2. .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:IDELAY_TYPE="VAR_LOAD"仿真结果

  1. .IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择
  2. .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:IDELAY_TYPE="VAR_LOAD"仿真结果

  1. .IDELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE 操作模式选择
  2. .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.

延伸阅读:

1.Xilinx 7系列SelectIO结构之SelectIO逻辑资源(一)

2.Xilinx 7系列SelectIO结构之SelectIO逻辑资源(二)

图片

欢迎关注FPGA技术实战公众号,喜欢就多多转发吧!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/739127
推荐阅读
相关标签
  

闽ICP备14008679号