当前位置:   article > 正文

LVDS接口程序设计框架及仿真_lvds接口仿真

lvds接口仿真

1、程序框架

主要module有:

1)ad9253_lvds_top.v,顶层模块;

2)ad9253_lvds_iobuffer.v,IO缓冲模块;

3)ad9253_lvds_clock.v,采样clock生成模块;

4)ad9253_lvds_frame.v,帧同步模块;

5)ad9253_lvds_data.v,数据采集模块。

2、ISERDES2原语介绍

接之前博文所述,LVDS串行接口在FPGA中实际上要进行的就是并串转换,核心模块即为ISERDES2,下面该原语接口功能和配置进行简单介绍。

上图为ISERDES2使用时的原语框图,使用时可以在Vivado中获取原语模板如下图所示:

  1. ISERDESE2 #(
  2. .DATA_RATE("DDR"), // DDR, SDR
  3. .DATA_WIDTH(4), // Parallel data width (2-8,10,14)
  4. .DYN_CLKDIV_INV_EN("FALSE"), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
  5. .DYN_CLK_INV_EN("FALSE"), // Enable DYNCLKINVSEL inversion (FALSE, TRUE)
  6. // INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1)
  7. .INIT_Q1(1'b0),
  8. .INIT_Q2(1'b0),
  9. .INIT_Q3(1'b0),
  10. .INIT_Q4(1'b0),
  11. .INTERFACE_TYPE("MEMORY"), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
  12. .IOBDELAY("NONE"), // NONE, BOTH, IBUF, IFD
  13. .NUM_CE(2), // Number of clock enables (1,2)
  14. .OFB_USED("FALSE"), // Select OFB path (FALSE, TRUE)
  15. .SERDES_MODE("MASTER"), // MASTER, SLAVE
  16. // SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1)
  17. .SRVAL_Q1(1'b0),
  18. .SRVAL_Q2(1'b0),
  19. .SRVAL_Q3(1'b0),
  20. .SRVAL_Q4(1'b0)
  21. )
  22. ISERDESE2_inst (
  23. .O(O), // 1-bit output: Combinatorial output
  24. // Q1 - Q8: 1-bit (each) output: Registered data outputs
  25. .Q1(Q1),
  26. .Q2(Q2),
  27. .Q3(Q3),
  28. .Q4(Q4),
  29. .Q5(Q5),
  30. .Q6(Q6),
  31. .Q7(Q7),
  32. .Q8(Q8),
  33. // SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
  34. .SHIFTOUT1(SHIFTOUT1),
  35. .SHIFTOUT2(SHIFTOUT2),
  36. .BITSLIP(BITSLIP), // 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
  37. // CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
  38. // to Q8 output ports will shift, as in a barrel-shifter operation, one
  39. // position every time Bitslip is invoked (DDR operation is different from
  40. // SDR).
  41. // CE1, CE2: 1-bit (each) input: Data register clock enable inputs
  42. .CE1(CE1),
  43. .CE2(CE2),
  44. .CLKDIVP(CLKDIVP), // 1-bit input: TBD
  45. // Clocks: 1-bit (each) input: ISERDESE2 clock input ports
  46. .CLK(CLK), // 1-bit input: High-speed clock
  47. .CLKB(CLKB), // 1-bit input: High-speed secondary clock
  48. .CLKDIV(CLKDIV), // 1-bit input: Divided clock
  49. .OCLK(OCLK), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
  50. // Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
  51. .DYNCLKDIVSEL(DYNCLKDIVSEL), // 1-bit input: Dynamic CLKDIV inversion
  52. .DYNCLKSEL(DYNCLKSEL), // 1-bit input: Dynamic CLK/CLKB inversion
  53. // Input Data: 1-bit (each) input: ISERDESE2 data input ports
  54. .D(D), // 1-bit input: Data input
  55. .DDLY(DDLY), // 1-bit input: Serial data from IDELAYE2
  56. .OFB(OFB), // 1-bit input: Data feedback from OSERDESE2
  57. .OCLKB(OCLKB), // 1-bit input: High speed negative edge output clock
  58. .RST(RST), // 1-bit input: Active high asynchronous reset
  59. // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
  60. .SHIFTIN1(SHIFTIN1),
  61. .SHIFTIN2(SHIFTIN2)
  62. );

根据原语模板可以看到其应用需要分别配置端口和属性,下面进行简单介绍。

2.1、ISERDES2原语端口说明·

1、寄存器输出端Q1-Q8

输出端将串行输入数据并行输出,如图所示:

2、组合输出端口O

组合输出端输出可以直接输出输入端数据D或者来自IDELAY模块数据DDLY。

3、位宽扩展端口SHIFTOUT1和SHIFTOUT2,SHIFTIN1和SHIFTIN2

当输入串行数据位宽超过8Bit时,为了进行串并转换,可以通过将两个ISERDES2模块设置成主从方式并联起来,实现1:10位或1:14位(只适用于DDR模式),如下图所示:

两个模块通过位宽扩展端口进行连接。

4、串行数据输入端口D和DDLY

端口D输入的数据来自IOB,即为ADC数据引脚,端口DDLY输入的数据来自IDELAY模块进行延时后数据。

5、时钟输入端CLK和CLKB

随路时钟输入,一般为DCO经过IDELAY模块产生的IntBitclk,CLKB为其反相输入。

6、时钟使能端CE1和CE2

使能输入的CLK和CLKB。

7、复位引脚RST

复位ISERDES2模块,高电平使能。

8、分频时钟输入端CLKDIV和CLKDIVP

此时钟作为Frame信号,确定数据转换的起始位置,一般为IntBitclk分频而来的CLK。

9、高速时钟输入端OCLK和OCLKB

这个时钟来自Memory。

10、Bitslip引脚

对采样数据进行移位,从而实现数据对齐,经过IDELAY模块生成的BitClk_MonClkin和BitClk_RefClkin与DATA之间存在延时,为此通过采集FCO并进行移位消除延时影响。Bitslip操作在DDR和SDR模式下有区别,如下图所示:

在SDR模式中,每次Bitslip操作都会导致输出数据向左偏移一位,例如0x1001_0111_1011经过Bitslip变成0x0010_1111_0111;

在DDR模式中,每次Bitslip操作都会导致输出数据交替进行右移一位和左移三位,如下图所示:

11、反馈输入端OFB

来自OLOGIC2、OLOGIC3和OSERDES2的输出反馈脚

12、动态设置时钟反相端DYNCLKDIVSEL和DYNCLK

此端口可以对输入时钟进行反相操作。

2.2、ISERDES2原语属性说明·

1、数据速率属性DATA_RATE

可选择DDR模式或SDR模式

2、数据位宽属性DATA_WIDTH

数据位宽可设置如下表所示,当位宽超过8位时,需要进行ISERDESE2扩展

3、动态时钟反转使能属性DYN_CLK_INV_EN和DYN_CLKDIV_INV_EN

对时钟进行反转,可选择TRUE or FALSE

4、接口类型属性INTERFACE_TYPE

可选择存储器类型或NETWORKING,对于ADC信号应用的是NETWORKING

5、使能时钟数量NUM_EN

当选择1时,只需要输入CLK,当选择2时,输入CLK和CLKB

6、使能反馈路径OFB_USED

TRUE or FALSE

7、ISERDESE2模式属性SERDES_MODE

当使用扩展时,SERDES模块的属性可选择为主模式或从模式

8、采样初始值设置INIT_Q1,INIT_Q2,INIT_Q3,INIT_Q4;SRVAL_Q1,SRVAL_Q2,SRVAL_Q3,SRVAL_Q4

一般初始化为0

9、选择D或DDLY作为输入IOBDELAY

D和DDLY引脚是ISERDESE2的专用输入。D输入是直接连接到IOB,DDLY引脚直接连接到IDELAYE2。ADC数据输入由D进行输入。

3、采样clock程序设计

BitClk由DCO经IDELAY2模块而来,经IBUFIO缓冲作为采样clock,经BUFR进行分频得到同步clock

时序如下:

代码模块如下:

  1. module ad9253_lvds_clock #(
  2. parameter C_StatTaps = 5'd15
  3. )
  4. (
  5. input SysRefClk,
  6. input BitClk,
  7. input BitClkRst,
  8. input BitClk_MonClkIn,
  9. input BitClk_RefClkIn,
  10. output BitClkDone,
  11. output BitClk_MonClkOut,
  12. output BitClk_RefClkOut
  13. );
  14. wire IntBitClk;
  15. wire [7:0] allign_word;
  16. //IDELAY
  17. (* IODELAY_GROUP = "DELAY1" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
  18. IDELAYE2 #(
  19. .CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
  20. .DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
  21. .HIGH_PERFORMANCE_MODE("TRUE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
  22. .IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
  23. .IDELAY_VALUE(C_StatTaps), // Input delay tap setting (0-31)
  24. .PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
  25. .REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
  26. .SIGNAL_PATTERN("CLOCK") // DATA, CLOCK input signal
  27. )
  28. IDELAYE2_inst (
  29. .CNTVALUEOUT(), // 5-bit output: Counter value output
  30. .DATAOUT(IntBitClk), // 1-bit output: Delayed data output
  31. .C(BitClk_RefClkOut), // 1-bit input: Clock input
  32. .CE(1'b0), // 1-bit input: Active high enable increment/decrement input
  33. .CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
  34. .CNTVALUEIN(5'd0), // 5-bit input: Counter value input
  35. .DATAIN(1'b0), // 1-bit input: Internal delay data input
  36. .IDATAIN(BitClk), // 1-bit input: Data input from the I/O
  37. .INC(1'b0), // 1-bit input: Increment / Decrement tap delay input
  38. .LD(BitClkRst), // 1-bit input: Load IDELAY_VALUE input
  39. .LDPIPEEN(1'b0), // 1-bit input: Enable PIPELINE register to load data input
  40. .REGRST(BitClkRst) // 1-bit input: Active-high reset tap-delay input
  41. );
  42. BUFIO BUFIO_inst (
  43. .O(BitClk_MonClkOut), // 1-bit output: Clock output (connect to I/O clock loads).
  44. .I(IntBitClk) // 1-bit input: Clock input (connect to an IBUF or BUFMR).
  45. );
  46. BUFR #(
  47. .BUFR_DIVIDE("3"), // Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8"
  48. .SIM_DEVICE("7SERIES") // Must be set to "7SERIES"
  49. )
  50. BUFR_inst (
  51. .O(BitClk_RefClkOut), // 1-bit output: Clock output port
  52. .CE(1'b1), // 1-bit input: Active high, clock enable (Divided modes only)
  53. .CLR(1'b0), // 1-bit input: Active high, asynchronous clear (Divided modes only)
  54. .I(IntBitClk) // 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect
  55. );

4、帧同步程序设计

帧同步目的在于对齐同步clock和FCO之间的延时,故通过采样clock对FCO进行采集,通过Bitslip操作,将延时进行对齐。ADC输出时序如下图所示:

通过BitClk对FCLK采样后,进行Bitslip操作,当结果等于pattern值时,表示BitClk_RefClkOut与FCO已对齐。下图为代码框架:

代码模块如下:

  1. module ad9253_lvds_frame#(
  2. parameter FrmPattern = 8'b11110000
  3. )
  4. (
  5. input FrmClk,
  6. input FrmClkDiv,
  7. input FrmClk_p,
  8. input FrmClkRst,
  9. input FrmClkDone,
  10. output FrmClkBitSlip_p,
  11. output FrmAlignDone
  12. );
  13. wire [7:0] IntFrmSrdsOutp;
  14. reg FrmClkBitSlip_pout;
  15. //ISERDESE2
  16. ISERDESE2 #(
  17. .DATA_RATE ("DDR"), // DDR, SDR
  18. .DATA_WIDTH (8), // Parallel data width (2-8,10,14)
  19. .DYN_CLKDIV_INV_EN ("FALSE"), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
  20. .DYN_CLK_INV_EN ("FALSE"), // Enable DYNCLKINVSEL inversion (FALSE, TRUE)
  21. // INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1)
  22. .INIT_Q1 (1'b0),
  23. .INIT_Q2 (1'b0),
  24. .INIT_Q3 (1'b0),
  25. .INIT_Q4 (1'b0),
  26. .INTERFACE_TYPE ("NETWORKING"), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
  27. .IOBDELAY ("NONE"), // NONE, BOTH, IBUF, IFD
  28. .NUM_CE (2), // Number of clock enables (1,2)
  29. .OFB_USED ("FALSE"), // Select OFB path (FALSE, TRUE)
  30. .SERDES_MODE ("MASTER"), // MASTER, SLAVE
  31. // SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1)
  32. .SRVAL_Q1 (1'b0),
  33. .SRVAL_Q2 (1'b0),
  34. .SRVAL_Q3 (1'b0),
  35. .SRVAL_Q4 (1'b0)
  36. )
  37. ISERDESE2_inst1(
  38. .O (), // 1-bit output: Combinatorial output
  39. // Q1 - Q8: 1-bit (each) output: Registered data outputs
  40. .Q1 (IntFrmSrdsOutp[0]),
  41. .Q2 (IntFrmSrdsOutp[1]),
  42. .Q3 (IntFrmSrdsOutp[2]),
  43. .Q4 (IntFrmSrdsOutp[3]),
  44. .Q5 (IntFrmSrdsOutp[4]),
  45. .Q6 (IntFrmSrdsOutp[5]),
  46. .Q7 (IntFrmSrdsOutp[6]),
  47. .Q8 (IntFrmSrdsOutp[7]),
  48. // SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
  49. .SHIFTOUT1 (),
  50. .SHIFTOUT2 (),
  51. .BITSLIP (FrmClkBitSlip_pout), // 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
  52. // CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
  53. // to Q8 output ports will shift, as in a barrel-shifter operation, one
  54. // position every time Bitslip is invoked (DDR operation is different from
  55. // SDR).
  56. // CE1, CE2: 1-bit (each) input: Data register clock enable inputs
  57. .CE1 (FrmClkDone),
  58. .CE2 (1'b1),
  59. .CLKDIVP (1'b0), // 1-bit input: TBD
  60. // Clocks: 1-bit (each) input: ISERDESE2 clock input ports
  61. .CLK (FrmClk), // 1-bit input: High-speed clock
  62. .CLKB (~FrmClk), // 1-bit input: High-speed secondary clock
  63. .CLKDIV (FrmClkDiv), // 1-bit input: Divided clock
  64. .OCLK (1'b0), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
  65. // Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
  66. .DYNCLKDIVSEL (1'b0), // 1-bit input: Dynamic CLKDIV inversion
  67. .DYNCLKSEL (1'b0), // 1-bit input: Dynamic CLK/CLKB inversion
  68. // Input Data: 1-bit (each) input: ISERDESE2 data input ports
  69. .D (FrmClk_p), // 1-bit input: Data input
  70. .DDLY (1'b0), // 1-bit input: Serial data from IDELAYE2
  71. .OFB (1'b0), // 1-bit input: Data feedback from OSERDESE2
  72. .OCLKB (1'b0), // 1-bit input: High speed negative edge output clock
  73. .RST (~FrmClkRst), // 1-bit input: Active high asynchronous reset
  74. // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
  75. .SHIFTIN1 (1'b0),
  76. .SHIFTIN2 (1'b0)
  77. );
  78. //Frame Alignment State Machine
  79. always @(posedge FrmClkDiv or negedge FrmClkRst)
  80. begin
  81. if((!FrmClkRst) || (!FrmClkDone))
  82. begin
  83. FrmClkBitSlip_pout <= 1'b0;
  84. rBitslipCnt <= 8'd0;
  85. rFrmAlignDone <= 1'b0;
  86. end
  87. else
  88. begin
  89. if(IntFrmSrdsOutp == FrmPattern)
  90. begin
  91. rFrmAlignDone <= 1'b1;
  92. end
  93. else if((rBitslipCnt == 8'd255) && (IntFrmSrdsOutp != FrmPattern))
  94. begin
  95. FrmClkBitSlip_pout <= 1'b1;
  96. rBitslipCnt <= 8'd1;
  97. end
  98. else if((IntFrmSrdsOutp != FrmPattern) && (rBitslipCnt < 8'd255))
  99. begin
  100. FrmClkBitSlip_pout <= 1'b0;
  101. rBitslipCnt <= rBitslipCnt + 1'd1;
  102. end
  103. end
  104. end
  105. assign FrmClkBitSlip_p = FrmClkBitSlip_pout;
  106. assign FrmAlignDone = rFrmAlignDone;
  107. endmodule

5、数据采集程序设计

数据采集比较简单,通过已经对齐后的clock和ISERDESE2模块对两根data线进行串并转换即可,代码框架为:

代码模块如下:

  1. module ad9253_lvds_data#(
  2. parameter BITWISEorBYTEWISE = 1
  3. )
  4. (
  5. input DatClk,
  6. input DatClkDiv,
  7. input DatRst,
  8. input DatBitSlip_p,
  9. input BitClkDone,
  10. input FrmAlignDone,
  11. input DatD0_p,
  12. input DatD0_n,
  13. input DatD1_p,
  14. input DatD1_n,
  15. output [13:0] DatOut
  16. );
  17. wire [7:0] DatSrdsout1; //Frame hign data1
  18. wire [7:0] DatSrdsout2; //Frame low data2
  19. //D0_P ISERDESE
  20. ISERDESE2 #(
  21. .DATA_RATE ("DDR"), // DDR, SDR
  22. .DATA_WIDTH (8), // Parallel data width (2-8,10,14)
  23. .DYN_CLKDIV_INV_EN ("FALSE"), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
  24. .DYN_CLK_INV_EN ("FALSE"), // Enable DYNCLKINVSEL inversion (FALSE, TRUE)
  25. // INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1)
  26. .INIT_Q1 (1'b0),
  27. .INIT_Q2 (1'b0),
  28. .INIT_Q3 (1'b0),
  29. .INIT_Q4 (1'b0),
  30. .INTERFACE_TYPE ("NETWORKING"), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
  31. .IOBDELAY ("NONE"), // NONE, BOTH, IBUF, IFD
  32. .NUM_CE (2), // Number of clock enables (1,2)
  33. .OFB_USED ("FALSE"), // Select OFB path (FALSE, TRUE)
  34. .SERDES_MODE ("MASTER"), // MASTER, SLAVE
  35. // SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1)
  36. .SRVAL_Q1 (1'b0),
  37. .SRVAL_Q2 (1'b0),
  38. .SRVAL_Q3 (1'b0),
  39. .SRVAL_Q4 (1'b0),
  40. .IS_CLK_INVERTED (1'b0)
  41. )
  42. ISERDESE2_inst0(
  43. .O (), // 1-bit output: Combinatorial output
  44. // Q1 - Q8: 1-bit (each) output: Registered data outputs
  45. .Q1 (DatSrdsout1[0]),
  46. .Q2 (DatSrdsout1[1]),
  47. .Q3 (DatSrdsout1[2]),
  48. .Q4 (DatSrdsout1[3]),
  49. .Q5 (DatSrdsout1[4]),
  50. .Q6 (DatSrdsout1[5]),
  51. .Q7 (DatSrdsout1[6]),
  52. .Q8 (DatSrdsout1[7]),
  53. // SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
  54. .SHIFTOUT1 (),
  55. .SHIFTOUT2 (),
  56. .BITSLIP (DatBitSlip_p), // 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
  57. // CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
  58. // to Q8 output ports will shift, as in a barrel-shifter operation, one
  59. // position every time Bitslip is invoked (DDR operation is different from
  60. // SDR).
  61. // CE1, CE2: 1-bit (each) input: Data register clock enable inputs
  62. .CE1 (BitClkDone&FrmAlignDone),
  63. .CE2 (1'b1),
  64. .CLKDIVP (1'b0), // 1-bit input: TBD
  65. // Clocks: 1-bit (each) input: ISERDESE2 clock input ports
  66. .CLK (DatClk), // 1-bit input: High-speed clock
  67. .CLKB (~DatClk), // 1-bit input: High-speed secondary clock
  68. .CLKDIV (DatClkDiv), // 1-bit input: Divided clock
  69. .OCLK (1'b0), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
  70. // Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
  71. .DYNCLKDIVSEL (1'b0), // 1-bit input: Dynamic CLKDIV inversion
  72. .DYNCLKSEL (1'b0), // 1-bit input: Dynamic CLK/CLKB inversion
  73. // Input Data: 1-bit (each) input: ISERDESE2 data input ports
  74. .D (DatD0_p), // 1-bit input: Data input
  75. .DDLY (1'b0), // 1-bit input: Serial data from IDELAYE2
  76. .OFB (1'b0), // 1-bit input: Data feedback from OSERDESE2
  77. .OCLKB (1'b0), // 1-bit input: High speed negative edge output clock
  78. .RST (~DatRst), // 1-bit input: Active high asynchronous reset
  79. // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
  80. .SHIFTIN1 (1'b0),
  81. .SHIFTIN2 (1'b0)
  82. );
  83. //D1_P ISERDESE
  84. ISERDESE2 #(
  85. .DATA_RATE ("DDR"), // DDR, SDR
  86. .DATA_WIDTH (8), // Parallel data width (2-8,10,14)
  87. .DYN_CLKDIV_INV_EN ("FALSE"), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
  88. .DYN_CLK_INV_EN ("FALSE"), // Enable DYNCLKINVSEL inversion (FALSE, TRUE)
  89. // INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1)
  90. .INIT_Q1 (1'b0),
  91. .INIT_Q2 (1'b0),
  92. .INIT_Q3 (1'b0),
  93. .INIT_Q4 (1'b0),
  94. .INTERFACE_TYPE ("NETWORKING"), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
  95. .IOBDELAY ("NONE"), // NONE, BOTH, IBUF, IFD
  96. .NUM_CE (2), // Number of clock enables (1,2)
  97. .OFB_USED ("FALSE"), // Select OFB path (FALSE, TRUE)
  98. .SERDES_MODE ("MASTER"), // MASTER, SLAVE
  99. // SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1)
  100. .SRVAL_Q1 (1'b0),
  101. .SRVAL_Q2 (1'b0),
  102. .SRVAL_Q3 (1'b0),
  103. .SRVAL_Q4 (1'b0)
  104. )
  105. ISERDESE2_inst2(
  106. .O (), // 1-bit output: Combinatorial output
  107. // Q1 - Q8: 1-bit (each) output: Registered data outputs
  108. .Q1 (DatSrdsout2[0]),
  109. .Q2 (DatSrdsout2[1]),
  110. .Q3 (DatSrdsout2[2]),
  111. .Q4 (DatSrdsout2[3]),
  112. .Q5 (DatSrdsout2[4]),
  113. .Q6 (DatSrdsout2[5]),
  114. .Q7 (DatSrdsout2[6]),
  115. .Q8 (DatSrdsout2[7]),
  116. // SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
  117. .SHIFTOUT1 (),
  118. .SHIFTOUT2 (),
  119. .BITSLIP (DatBitSlip_p), // 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
  120. // CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
  121. // to Q8 output ports will shift, as in a barrel-shifter operation, one
  122. // position every time Bitslip is invoked (DDR operation is different from
  123. // SDR).
  124. // CE1, CE2: 1-bit (each) input: Data register clock enable inputs
  125. .CE1 (BitClkDone&FrmAlignDone),
  126. .CE2 (1'b1),
  127. .CLKDIVP (1'b0), // 1-bit input: TBD
  128. // Clocks: 1-bit (each) input: ISERDESE2 clock input ports
  129. .CLK (~DatClk), // 1-bit input: High-speed clock
  130. .CLKB (DatClk), // 1-bit input: High-speed secondary clock
  131. .CLKDIV (DatClkDiv), // 1-bit input: Divided clock
  132. .OCLK (1'b0), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
  133. // Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
  134. .DYNCLKDIVSEL (1'b0), // 1-bit input: Dynamic CLKDIV inversion
  135. .DYNCLKSEL (1'b0), // 1-bit input: Dynamic CLK/CLKB inversion
  136. // Input Data: 1-bit (each) input: ISERDESE2 data input ports
  137. .D (DatD1_p), // 1-bit input: Data input
  138. .DDLY (1'b0), // 1-bit input: Serial data from IDELAYE2
  139. .OFB (1'b0), // 1-bit input: Data feedback from OSERDESE2
  140. .OCLKB (1'b0), // 1-bit input: High speed negative edge output clock
  141. .RST (~DatRst), // 1-bit input: Active high asynchronous reset
  142. // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
  143. .SHIFTIN1 (1'b0),
  144. .SHIFTIN2 (1'b0)
  145. );
  146. //Data Output
  147. wire [13:0] DatOut_TEMP1, DatOut_TEMP2;
  148. assign DatOut_TEMP1 = {DatSrdsout2, DatSrdsout1[7:2]};
  149. assign DatOut_TEMP2 = {DatSrdsout2[7], DatSrdsout1[7], DatSrdsout2[6], DatSrdsout1[6],DatSrdsout2[5], DatSrdsout1[5],DatSrdsout2[4], DatSrdsout1[4],
  150. DatSrdsout2[3], DatSrdsout1[3],DatSrdsout2[2], DatSrdsout1[2],DatSrdsout2[1], DatSrdsout1[1]};
  151. assign DatOut = BITWISEorBYTEWISE?DatOut_TEMP1:DatOut_TEMP2;
  152. endmodule

代码中,将两个LANE采集的数据进行了整合,对BYTEWISE和BITWISE模式进行了区分。至此通过ISERDESE对AD9253进行基本采集功能的驱动代码完成。

6、TestBench写LVDS时序及仿真结果

下一节给出一些TestBench编写技巧,对部分module进行仿真,通过仿真验证程序的正确性。

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

闽ICP备14008679号