当前位置:   article > 正文

Xilinx中ISERDESE2串并转换模块的使用

iserdese2

        ISERDESE2是一种专用的串行到并行转换器,具有特定的时钟和逻辑功能,旨在促进高速源同步应用的实现。ISERDESE2避免了在FPGA结构中设计反序列化器时遇到的额外时序复杂性。

1、iserdes2原语概述

        1.1 串-并转换功能

       iserdes2支持SDR与DDR两种模式,在SDR模式下可以完成1bit到2-8bit的数据转换,在DDR模式下可以完成1bit到4bit、6bit、8bit以及通过两个iserdes2原语可以完成1ibt到10bit、14bit的串并转换(如图二)。

 图1:iserdes2位宽

                                                         图2:iserdes2的10位与14位级联

        注意:Slave模块中的Q1与Q2不可以作为级联的输出,在1bit转10bit的过程中使用Q3与Q4进行扩展、在1bit转10bit的过程中使用Q3-Q8这6位进行扩展。

  1.2 slipbit模块的概述

        在串并转换过程中很难避免的会出现传输错位导致采集到的数据出现错误,这是就需要用到slipbit模块进行数据校准。

        slipbit是iserdes2原语中的一个输入,通过判断输出Q中的数据与校验和是否相同来判断数据是否相同,如果不同通过拉高一个时钟的slipbit进行移位操作,直到检测到数据校验和正确表明采集到的正确。

                                                      图3:slip_bit信号的变化情况

备注:图3中的q[7:0]数值移位不正确,是随机添加上去的数据,具体可以看vivado仿真情况。    

        SRD模式下8:1 输出每次有一个时钟的slipbit会对校验不正确的数据Q[7:0]进行循环左移,例如:1001_0011——>0010_0111。DDR模式下8:1输出每次有一个时钟的slipbit会对校验不正确的数据Q[7:0]进行循环右移1bit,然后左移3bit依次循环,例如0010_0111把最高移的1移到最低位变成了0010_0111——>1001_0011(右移1bit)——>1001_1110(左移3bit)

                                                图4:SDR与DDR 8:1模式移位方式

2、iserdes原语引脚介

    iserdes2原语包含引脚

                                                                   图5:iserdes2引脚框图

具体引脚说明 :

2.1 BITSLIP(input)

        通过拉高BITSLIP重新排序输出信号,BITSLIP只需要拉高一个时钟(CLK_DIV),完成移位操作后,如果校验和与输入还是不通,再次拉高,直到校验和正确,来保证采集到的数据正确

                                                   图6:DDR Bitslip 时序图

        DDR 模式Bitslip信号变高后有三个CLK_DIV的延时,SDR 模式Bitslip号变高后有两个CLK_DIV的延时。

2.2 CE1、CE2(input)

                                                           图7:  时钟使能引脚                                                              

         CE1和CE2引脚用来作为时钟使能的时钟源,通过属性 NUM_CE来选择。当 NUM_CE=1时使用CE1作为时钟使能信号;当 NUM_CE=2时,在CLKDIV=0时使用CE2R,在CLKDIV=1时使用CE1R作为时钟使能信号。

2.3 时钟引脚

 2.3.1、clk(input)与clkdiv(input)

      clk串行数据输入时钟,clkdiv并行输出数据时钟,保证clk与clkdiv没有相位差,即可以通过PLL生成它们。

      SDR模式8:1传输clk=400M,clkdiv=50M ,  DDR模式8:1传输clk=400M,clkdiv=100M

      

                                                      图8:  时钟使能引脚   

2.3.2、CLKB(input)

        在MEMORY_QDR以外的任何模式下,将CLKB连接到CLK的反转,在MEMORY_QDR模式下,CLKB应该连接到一个唯一的相移时钟。

2.3.3、OCLK(input)、OCLKB(input)

         在iserdes模式MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE中只用MEMORY使用,其他模式接地就可以。

2.2.4、OCLKDIVP(input)

        在MEMORY_DDR3模式使用,其他模式接地。

2.4  DYNCLKSEL (input)and DYNCLKDIVSEL(input)

      在MEMORY、MEMORY_DDR3模式使用。

2.5 D(input)与DDLYA(input)

                                                         图9:输入模式设置

        D与DDLYA都是iserdes2的输入引脚,通过配置IOBDELAY Value的模式来选择输入的引脚。

2.6 OFB(input)

           在oserdes2的信号输入到iserdes2下使用,使用是需要将ISERDES2中的OFB_USED设置为TURE

                              

                                                   图10:OFB使用连接方式

2.7 RST(input)

        复位引脚,高电平复位,最好与CLKDIV同步,来保证ISERDES2同步复位成功。

2.8 Q1-Q8(output)

      iserdes2的输出引脚。

2.9 SHIFTIN1、SHIFTIN2、SHIFTOUT1、SHIFTOUT2

            传输位宽为10bit或者14bit时、将iserdes2(Slave)的SHIFTIN1、SHIFTIN2连接iserdes2(master)中的SHIFTOUT1、SHIFTOUT2(如图2)

3 、ISERDES2原语属性介绍

        在使用ISERDES2是需要配置其中的一些属性,下边对其做一些简单的描述

3.1 DATA_RATE

        配置数据流传输模式:SDR或者DDR,默认配置为DDR

3.2 DATA_WIDTH

        配置数据位宽:1)、DATA_RATE为DDR可以配置为4、6、8、10、14。2)、DATA_RATE为SDR可以配置2、3、4、5、6、7、8。默认值为4

3.3  DYN_CLKDIV_INV_EN  

        配置CLKDIV时钟翻转使能,在MEMORY、MEMORY_DDR3模式使用,默认值为FALSE。

3.4   DYN_CLK_INV_EN

        配置CLK与CLKB时钟翻转使能,在MEMORY、MEMORY_DDR3模式使用,默认值为FALSE。

3.5 INTERFACE_TYPE

         模式配置,可配置模式为MEMORY, MEMORY_DDR3,MEMORY_QDR,NETWORKING,默认值为FALSE。一般使用NETWORKING。

3.6 NUM_CE

        CE1、CE2使能配置,默认值为2。

3.7 OFB_USED

     OSERDES2与ISERDES2级联配置,配置为TURE后可以将OSERDES2的输出引脚OFB与ISERDES2的输入引脚OFB进行数据传输。默认值为FALSE

3.8 SERDES_MODE

        ISERDES2主从模式配置,默认为Master,只有DDR模式的10:1或者14:1是用到Slave,默认配置Master。

3.9 INIT_Q1-INIT_Q4

        初始化第一个到第四个寄存器的值,默认为0,默认即可。

3.10 SRVAL_Q1-SRVAL_Q4

        复位以后第一个到第四个寄存器的值,默认为0,默认即可。

3.11 IOBDELAY

            配置D与DDLYA的模式、可配置为NONE、IBUF, IFD、BOTH,具体如图9,默认为NONE,默认即可,其他情况目前还没用到。

4、程序设计与仿真

      在数据为方便测试文件编写,将OSERDES2与ISERDES2级联,如图10所示。本文采用数据8’h32与8'h8c作为一组校验和,一共使用了32组校验和与随机数组成一组包文,将该包文发送到OSERDES2原语进行并串转换,然后将数据发送到ISERDES2模块。

                                                        图11 :VIVADO Schematic

  1. module top(
  2. input sys_clk ,
  3. input rst_n ,
  4. output o_iserdese2_vld ,
  5. output [7:0] o_iserdese2
  6. );
  7. wire rst_wire ;
  8. wire clk_wiz_0 ;
  9. wire clk ;
  10. wire clk_div ;
  11. wire oserdese_ofb;
  12. wire locked ;
  13. wire flag_wire ;
  14. clk_wiz_0 u_clk_wiz_0(
  15. .clk_out1 ( clk_div ),//output clk_out1
  16. .clk_out2 ( clk ),//output clk_out2
  17. .reset ( ~rst_n ),//input reset
  18. .locked ( locked ),
  19. .clk_in1 ( sys_clk ) //input clk_in1
  20. );
  21. assign rst_wire = rst_n==0;
  22. //例化并串转换原语;
  23. oserdese2_ctrl u_oserdese2_ctrl(
  24. .clk ( clk ), //系统时钟信号;
  25. .clk_div ( clk_div ),
  26. .rst ( rst_wire ), //系统复位信号,高电平有效;
  27. .ofb ( oserdese_ofb ),
  28. .o_cheeksum_flag ( flag_wire ),
  29. .cheek_sum_first ( 8'h32 ), //校验和
  30. .cheek_sum_secord( 8'h8c )
  31. );
  32. iserdese2_ctrl u_iserdese2_ctrl(
  33. .clk ( clk ),//系统时钟信号;
  34. .clk_div ( clk_div ),
  35. .rst ( rst_wire ),//系统复位信号,高电平有效;
  36. .ofb ( oserdese_ofb ),
  37. .dout ( o_iserdese2 ),//输出数据
  38. .dout_vld ( o_iserdese2_vld ), //输出数据有效指示信号;
  39. .i_cheeksum_flag (flag_wire ),
  40. .cheek_sum_first ( 8'h32 ), //校验和
  41. .cheek_sum_secord( 8'h8c )
  42. );
  43. endmodule

4.1 clk_wiz_0 模块

        本文采用DDR模式8:1输出传输,系统时钟为50M,通过PLL模块生成CLK=200M,CLKDIV=50M。

                                                      图12:CLK(200M)与CLKDIV(50M)

   4.2 oserdese2_ctrl    

  1. module oserdese2_ctrl(
  2. input clk ,
  3. input clk_div ,
  4. input rst ,
  5. input [7:0] cheek_sum_first , //校验和
  6. input [7:0] cheek_sum_secord, //校验和
  7. output ofb ,
  8. output o_cheeksum_flag
  9. );
  10. parameter PACKAGE_NUM = 32 ; //校验和长度
  11. reg o_cheeksum_flag ;
  12. reg [7:0] cnt ;
  13. reg [7:0] din ;
  14. wire add_cnt ;
  15. wire end_cnt ;
  16. reg [5:0] cnt ;
  17. reg [7:0] cnt_package ;
  18. //校验和发送完成标志位;
  19. always@(posedge clk_div)begin
  20. if(rst)begin
  21. o_cheeksum_flag <= 1'b0;
  22. end
  23. else if(cnt_package==PACKAGE_NUM-1)begin
  24. o_cheeksum_flag <= 1'b1;
  25. end
  26. end
  27. always@(posedge clk_div)begin
  28. if(rst)begin
  29. cnt <= 0;
  30. end
  31. else if(add_cnt)begin
  32. if(end_cnt)begin
  33. cnt <= 0;
  34. end
  35. else begin
  36. cnt <= cnt + 1;
  37. end
  38. end
  39. end
  40. assign add_cnt = !o_cheeksum_flag ;
  41. assign end_cnt = add_cnt && cnt == 2-1 ;
  42. //校验头计数器计算头部长度
  43. always @(posedge clk_div or posedge rst)begin
  44. if(rst)begin
  45. cnt_package <= 0;
  46. end
  47. else if(cnt_package==PACKAGE_NUM-1)begin
  48. cnt_package <= cnt_package;
  49. end
  50. else if(end_cnt)begin
  51. cnt_package <= cnt_package + 1;
  52. end
  53. end
  54. //校验头部{7C,82}与数据拼接;
  55. always@(posedge clk_div or posedge rst)begin
  56. if(rst)begin
  57. din <= cheek_sum_first;
  58. end
  59. else if(cnt_package==PACKAGE_NUM-1)begin//如果校准序列发送完毕,则发送随机信号用于测试。
  60. din <= {(din[0] ^ din[4] ^ din[5] ^ din[6]),din[7:1]};//M序列公式为x^8+x^4+x^3+x^2+1
  61. end
  62. else if(cnt==1-1)begin//发送校准序列8'h5c;
  63. din <= cheek_sum_first;
  64. end
  65. else if(cnt==2-1)begin//发送校准序列8'h82.
  66. din <= cheek_sum_secord;
  67. end
  68. end
  69. //例化OSERDESE2原语
  70. OSERDESE2 #(
  71. .DATA_RATE_OQ ( "DDR" ),// DDR, SDR
  72. .DATA_RATE_TQ ( "SDR" ),// DDR, BUF, SDR
  73. .DATA_WIDTH ( 8 ),// Parallel data width (2-8,10,14)
  74. .INIT_OQ ( 1'b0 ),// Initial value of OQ output (1'b0,1'b1)
  75. .INIT_TQ ( 1'b0 ),// Initial value of TQ output (1'b0,1'b1)
  76. .SERDES_MODE ( "MASTER" ),// MASTER, SLAVE
  77. .SRVAL_OQ ( 1'b0 ),// OQ output value when SR is used (1'b0,1'b1)
  78. .SRVAL_TQ ( 1'b0 ),// TQ output value when SR is used (1'b0,1'b1)
  79. .TBYTE_CTL ( "FALSE" ),// Enable tristate byte operation (FALSE, TRUE)
  80. .TBYTE_SRC ( "FALSE" ),// Tristate byte source (FALSE, TRUE)
  81. .TRISTATE_WIDTH ( 1 ) // 3-state converter width (1,4)
  82. )
  83. OSERDESE2_inst (
  84. .OFB ( ofb ),// 1-bit output: Feedback path for data
  85. .OQ ( ),// 1-bit output: Data path output
  86. // SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
  87. .SHIFTOUT1 ( ),
  88. .SHIFTOUT2 ( ),
  89. .TBYTEOUT ( ),// 1-bit output: Byte group tristate
  90. .TFB ( ),// 1-bit output: 3-state control
  91. .TQ ( ),// 1-bit output: 3-state control
  92. .CLK ( clk ),// 1-bit input: High speed clock
  93. .CLKDIV ( clk_div ),// 1-bit input: Divided clock
  94. // D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
  95. .D1 ( din[0] ),
  96. .D2 ( din[1] ),
  97. .D3 ( din[2] ),
  98. .D4 ( din[3] ),
  99. .D5 ( din[4] ),
  100. .D6 ( din[5] ),
  101. .D7 ( din[6] ),
  102. .D8 ( din[7] ),
  103. .OCE ( 1'b1 ),// 1-bit input: Output data clock enable
  104. .RST ( rst ),// 1-bit input: Reset
  105. // SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
  106. .SHIFTIN1 ( ),
  107. .SHIFTIN2 ( ),
  108. // T1 - T4: 1-bit (each) input: Parallel 3-state inputs
  109. .T1 ( 1'b0 ),
  110. .T2 ( 1'b0 ),
  111. .T3 ( 1'b0 ),
  112. .T4 ( 1'b0 ),
  113. .TBYTEIN ( 1'b0 ),// 1-bit input: Byte group tristate
  114. .TCE ( 1'b0 ) // 1-bit input: 3-state clock enable
  115. );
  116. endmodule

    OSERDES2仿真

                                                图13:OSERDES2仿真

        如上图中din在clk_div上升沿采集到的数是8’h8c(8'b1000_1100),经过四个clk的延时(DDR模式8:1采样延时,如图14OSERDES2采集延时)后采集串行数据线ofb上的数为8‘b0011_0001,这个数是8’h8c的从高到低0011_0001,因此采用到的ofb数据正确。

4.3 iserdese2_ctrl  

  1. module iserdese2_ctrl(
  2. clk ,
  3. clk_div ,
  4. rst ,
  5. ofb ,
  6. cheek_sum_first , //校验和
  7. cheek_sum_secord , //校验和
  8. i_cheeksum_flag ,
  9. dout ,
  10. dout_vld
  11. );
  12. parameter CNT_NUM = 5'd16 ;
  13. input clk ;
  14. input clk_div ;
  15. input rst ;
  16. input ofb ;
  17. input i_cheeksum_flag ;
  18. input [7:0] cheek_sum_first ;
  19. input [7:0] cheek_sum_secord;
  20. output [7:0] dout ;
  21. output dout_vld ;
  22. reg bitslip ;
  23. reg slip_flag ;
  24. wire add_cnt ;
  25. reg [4:0] cnt ;
  26. wire [7:0] dout ;
  27. reg dout_vld ;
  28. wire [7:0] q ;
  29. reg flag_cheek ;
  30. reg [2:0] slip_cnt ;
  31. wire add_cnt_slip ;
  32. wire end_cnt_slip ;
  33. reg [2:0] cnt_shift ;
  34. wire add_cnt_shift ;
  35. wire end_cnt_shift ;
  36. //例化ISERDESE2原语
  37. ISERDESE2 #(
  38. .DATA_RATE ( "DDR" ),// DDR, SDR
  39. .DATA_WIDTH ( 8 ),// Parallel data width (2-8,10,14)
  40. .DYN_CLKDIV_INV_EN ( "FALSE" ),// Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
  41. .DYN_CLK_INV_EN ( "FALSE" ),// Enable DYNCLKINVSEL inversion (FALSE, TRUE)
  42. .INIT_Q1 ( 1'b0 ),// INIT_Q1 : Initial value on the Q outputs (0/1)
  43. .INIT_Q2 ( 1'b0 ),// INIT_Q2 : Initial value on the Q outputs (0/1)
  44. .INIT_Q3 ( 1'b0 ),// INIT_Q3 : Initial value on the Q outputs (0/1)
  45. .INIT_Q4 ( 1'b0 ),// INIT_Q4 : Initial value on the Q outputs (0/1)
  46. .INTERFACE_TYPE ( "NETWORKING" ),// MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
  47. .IOBDELAY ( "NONE" ),// NONE, BOTH, IBUF, IFD
  48. .NUM_CE ( 2 ),// Number of clock enables (1,2)
  49. .OFB_USED ( "TRUE" ),// Select OFB path (FALSE, TRUE)
  50. .SERDES_MODE ( "MASTER" ),// MASTER, SLAVE
  51. .SRVAL_Q1 ( 1'b0 ),// SRVAL_Q1 : Q output values when SR is used (0/1)
  52. .SRVAL_Q2 ( 1'b0 ),// SRVAL_Q2 : Q output values when SR is used (0/1)
  53. .SRVAL_Q3 ( 1'b0 ),// SRVAL_Q3 : Q output values when SR is used (0/1)
  54. .SRVAL_Q4 ( 1'b0 ) // SRVAL_Q4 : Q output values when SR is used (0/1)
  55. )
  56. ISERDESE2_inst (
  57. .O ( ),// 1-bit output: Combinatorial output
  58. .Q1 ( q[7] ),// Q1 - Q8: 1-bit (each) output: Registered data outputs
  59. .Q2 ( q[6] ),
  60. .Q3 ( q[5] ),
  61. .Q4 ( q[4] ),
  62. .Q5 ( q[3] ),
  63. .Q6 ( q[2] ),
  64. .Q7 ( q[1] ),
  65. .Q8 ( q[0] ),
  66. .SHIFTOUT1 ( ),// SHIFTOUT1 : 1-bit (each) output: Data width expansion output ports
  67. .SHIFTOUT2 ( ),// SHIFTOUT2 : 1-bit (each) output: Data width expansion output ports
  68. .BITSLIP ( bitslip ),// 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
  69. // CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
  70. // to Q8 output ports will shift, as in a barrel-shifter operation, one
  71. // position every time Bitslip is invoked (DDR operation is different from SDR).
  72. .CE1 ( 1'b1 ),// CE1: 1-bit (each) input: Data register clock enable inputs
  73. .CE2 ( 1'b1 ),// CE2: 1-bit (each) input: Data register clock enable inputs
  74. .CLKDIVP ( 1'b0 ),// 1-bit input: TBD
  75. // Clocks: 1-bit (each) input: ISERDESE2 clock input ports
  76. .CLK ( clk ),// 1-bit input: High-speed clock
  77. .CLKB ( ~clk ),// 1-bit input: High-speed secondary clock
  78. .CLKDIV ( clk_div ),// 1-bit input: Divided clock
  79. .OCLK ( 1'b0 ),// 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
  80. // Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
  81. .DYNCLKDIVSEL(1'b0 ),// 1-bit input: Dynamic CLKDIV inversion
  82. .DYNCLKSEL ( 1'b0 ),// 1-bit input: Dynamic CLK/CLKB inversion
  83. // Input Data: 1-bit (each) input: ISERDESE2 data input ports
  84. .D ( 1'b0 ),// 1-bit input: Data input
  85. .DDLY ( 1'b0 ),// 1-bit input: Serial data from IDELAYE2
  86. .OFB ( ofb ),// 1-bit input: Data feedback from OSERDESE2
  87. .OCLKB ( 1'b0 ),// 1-bit input: High speed negative edge output clock
  88. .RST ( rst ),// 1-bit input: Active high asynchronous reset
  89. // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
  90. .SHIFTIN1 ( ),
  91. .SHIFTIN2 ( )
  92. );
  93. //当没有完成校准时,如果检测到转换结果与要求不一致,则把该信号拉高。
  94. always@(posedge clk_div or posedge rst)begin
  95. if(rst)begin
  96. bitslip <= 1'b0;
  97. end//当没有校准,且没有处于校准阶段时检测到串并转换结果不为8'h32或者8'h8c时拉高;
  98. else if(((q != cheek_sum_first) && (q != cheek_sum_secord)) && (~slip_flag) && (~bitslip) && (~dout_vld))begin
  99. bitslip <= 1'b1;
  100. end
  101. else begin
  102. bitslip <= 1'b0;
  103. end
  104. end
  105. //滑块计数器,因为bitslip拉高后,输出需要经过一段时间才会有效,因此这段时间不能对输出数据进行读取判断。
  106. always@(posedge clk_div or posedge rst)begin
  107. if(rst)begin
  108. slip_cnt <= 1'b0;
  109. end
  110. else if(add_cnt_slip)begin
  111. if(end_cnt_slip)begin
  112. slip_cnt <= 1'b0;
  113. end
  114. else begin
  115. slip_cnt <= slip_cnt + 1'd1;
  116. end
  117. end
  118. end
  119. assign add_cnt_slip = slip_flag ;
  120. assign end_cnt_slip = add_cnt_slip && slip_cnt == 4-1;
  121. //bitslip拉高后的标志信号,初始值为0,当bitslip拉高时拉高,当slip_cnt计数器计数到最大值时清零。
  122. always@(posedge clk_div or posedge rst)begin
  123. if(rst)begin
  124. slip_flag <= 1'b0;
  125. end
  126. else if(bitslip)begin
  127. slip_flag <= 1'b1;
  128. end
  129. else if(end_cnt_slip)begin
  130. slip_flag <= 1'b0;
  131. end
  132. end
  133. //转换成功计数器,用于记录校准阶段,当校准阶段检测到固定个连续有效数据时,认为校准成功。
  134. always@(posedge clk_div or posedge rst)begin
  135. if(rst)begin//
  136. cnt <= 0;
  137. end//当在校准阶段时,当bitslip有效时拉高;
  138. else if((slip_flag || bitslip) && (~dout_vld))begin
  139. cnt <= 0;
  140. end
  141. else if(cnt == CNT_NUM - 1)begin//当检测到固定校准数据时,计数器保持该数值。
  142. cnt <= CNT_NUM - 1;
  143. end
  144. else if(add_cnt)begin
  145. cnt <= cnt + 1;
  146. end
  147. end
  148. //当不处于移动滑块状态且检测到输出数据为规定数据时加1.
  149. assign add_cnt = ((q == cheek_sum_first) || (q == cheek_sum_secord)) && (~slip_flag) && (~bitslip) && (cnt != (CNT_NUM - 1));
  150. //将转换后的数据输出,只有当校准完成后,输出有效指示信号磁能拉高,表示输出的数据有效。
  151. always@(posedge clk_div or posedge rst)begin
  152. if(rst)begin
  153. dout_vld <= 0;
  154. end
  155. else begin
  156. dout_vld <= end_cnt_shift;
  157. end
  158. end
  159. assign dout = q;
  160. always@(posedge clk_div or posedge rst)begin //oserdese2采用的DDR(8:1)模式,它有4个CLK_DIV的延时
  161. if(rst)begin
  162. cnt_shift <= 0;
  163. end
  164. else if(add_cnt_shift)begin
  165. if(end_cnt_shift)begin
  166. cnt_shift <= cnt_shift ;
  167. end
  168. else begin
  169. cnt_shift <= cnt_shift + 1;
  170. end
  171. end
  172. end
  173. assign add_cnt_shift = i_cheeksum_flag && flag_cheek ;
  174. assign end_cnt_shift = add_cnt_shift && cnt_shift == 4-1 ;//CLK_DIV的延时计数
  175. always@(posedge clk_div or posedge rst)begin
  176. if(rst)begin
  177. flag_cheek <= 1'd0;
  178. end
  179. else if(cnt == CNT_NUM - 1)begin//对bitslip拉高后的时钟计数。
  180. flag_cheek <= 1'd1;
  181. end
  182. end
  183. endmodule

ISERDES2仿真

                                                  图14 :ISERDES2仿真

        在OSERDES2中输入32个{8'h32,8'h8c}后的数据是8'h46、8'ha3、8'ha3、8'h51、8'ha8、8'hd4,在ISERDES2中采集到的数据在dout_vld为高电平是也是8'h46、8'ha3、8'ha3、8'h51、8'ha8、8'hd4,因此,ISERDES2模块设计正确。

说明:本文是ISERDES2使用过程中的一些总结,可能不是完全正确,仅供参考。

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

闽ICP备14008679号