FPGA GTH 实现QSFP光口通信(三)——单路数据对齐

文章详细描述了在UltraScale平台的FPGAGTH上实现QSFP光口通信时,针对单路数据的bit对齐进行了自环回测试,涉及IP核配置、数据产生和对齐模块,以及GTH接口信号的使用和分析。作者通过实例代码展示了如何配置TXCTRL和RXCTRL信号进行数据校准和错误检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 背景介绍

2. IP核配置

3. 自环回测试

3.1 数据产生模块

3.2 数据对齐模块

3.3 接口信号使用分析

3.3.1  ZYNQ 7 平台上GTX接口的信号

3.3.2  UltraScale 平台上GTH接口的信号

4. 数据对齐信号说明

4.1 TXCTRL

TXCTRL1 and TXCTRL0

TXCTRL2

4.2 RXCTRL

RXCTRL0

RXCTRL1

 RXCTRL2

RXCTRL3

RXCTRL0 and RXCTRL1

4.3 回环测试信号示例

5. 一些过程测试现象 

6. Reference 


系列文章

1. FPGA GTH 实现QSFP光口通信(一)—— 工程构建基础

2. FPGA GTH 实现QSFP光口通信(二)—— UltraScale FPGAs Transceivers Wizard IP 

3. FPGA GTH 实现QSFP光口通信(三)——单路数据对齐

4. FPGA GTH 实现QSFP光口通信(四)——单路串并数据转换(Z7100) 

5. 

1. 背景介绍

        基于UltraScale xczu9eg 平台欲实现 4 路 GTH 的 QSFP 光口通信,前篇文章介绍了实现流程。此篇文章继续记录调试过程。

        光口通信牵扯数据对齐。数据对齐包含两方面:

1)某一路GTH写出数据,接收读到数据后有bit偏移,需要校正对齐此bit偏移;

2)4路GTH的数据收到后有各自时间上的先后,需要进行对齐同步。

此篇文章先调试探讨场景1),单路数据的bit对齐。因此先激活1路GTH用于调试。

2. IP核配置

UltraScale FPGAs Transceivers Wizard

3. 自环回测试

3.1 数据产生模块

        数据产生模块的代码如下,在计数器 =6'b111 时:txctrl0_reg <= 4'b0010;  txdata_reg <= 32'hbcbcbcbc; 作为一个数据包头标记。其他时间 xctrl0_reg <= 4'b0001;  txdata_reg <= 32'h00050009;

module gth_aurora_example_stimulus_8b10b (
  input  wire         gtwiz_reset_all_in,
  input  wire         gtwiz_userclk_tx_usrclk2_in,
  input  wire         gtwiz_userclk_tx_active_in,
  output wire  [15:0] txctrl0_out,
  output wire  [15:0] txctrl1_out,
  output wire   [7:0] txctrl2_out,
  output wire [31:0] txdata_out
);

  wire example_stimulus_reset_int = gtwiz_reset_all_in || ~gtwiz_userclk_tx_active_in;
  wire example_stimulus_reset_sync;

  (* DONT_TOUCH = "TRUE" *)
  gth_aurora_example_reset_synchronizer example_stimulus_reset_synchronizer_inst (
    .clk_in  (gtwiz_userclk_tx_usrclk2_in),
    .rst_in  (example_stimulus_reset_int),
    .rst_out (example_stimulus_reset_sync)
  );

  wire prbs_any_gen_en_int = 1'b1;

  wire   [31:0] txdata_prbs;
  wire   [31:0] txdata_char = 32'h5500_00BC ;  //   {4{8'hBC}};
  reg    [31:0] txdata_reg  = 32'b0;
  reg    [15:0] txctrl0_reg = 0  ;          //      = 16'b0 
  reg    [15:0] txctrl1_reg = 0  ;          ///---     = 16'b0
  reg    [8:0]  txctrl2_reg = 0  ;          ///---     = 8'b0
  assign        txctrl0_out = 16'b0 ; //     
  assign        txctrl1_out = 16'b0 ; // txctrl1_reg_w ;       ///---
  assign        txctrl2_out = txctrl2_reg ; // 
  assign        txdata_out  = txdata_reg  ;

  reg [15:0] prbs_slt_ctr = 16'd0;

 
  always @(posedge gtwiz_userclk_tx_usrclk2_in) 
  begin
    if (example_stimulus_reset_sync|| ( prbs_slt_ctr >= 16'hf ) ) begin
      prbs_slt_ctr <= 16'd0;
    end
    else begin
        prbs_slt_ctr <= prbs_slt_ctr + 16'd1;
    end
 end

  always @(posedge gtwiz_userclk_tx_usrclk2_in) begin
    if (example_stimulus_reset_sync  ) begin
      txdata_reg <= 32'h5500_00BC ; //32'hbcbc0000;
      
    end
    else  
        if ( prbs_slt_ctr[5:0] == 6'b111  )
            begin
                txctrl2_reg <= 4'b0001 ; //txctrl0_reg_w ;  //4'b0100;
                txdata_reg <= 32'h5678_9aBC ; //32'hbcbcbcbc;
            end
        else begin
                txctrl2_reg <= 8'b0 ; //probe_out3 ; // 32'h00000001 ; //1'b1 ;
                txdata_reg <= 32'h01234567 ;  //prbs_slt_ctr ;
            end
   end

    gth_aurora_prbs_any # (
    .CHK_MODE    (0),
    .INV_PATTERN (1),
    .POLY_LENGHT (31),
    .POLY_TAP    (28),
    .NBITS       (32)
  ) prbs_any_gen_inst (
    .RST      (example_stimulus_reset_sync),
    .CLK      (gtwiz_userclk_tx_usrclk2_in),
    .DATA_IN  (32'b0),
    .EN       (prbs_any_gen_en_int),
    .DATA_OUT (txdata_prbs)
  );


endmodule

3.2 数据对齐模块

        数据对齐模块的代码如下,由于过程中发现 rxctrl0, rxctrl1, rxctrl2, rxctrl3 都有变化,因此根据这几个信号分别做对齐校正。

module data_align (
    input rst_n ,
    input rx_clk ,
    input [31:0] rx_data ,
    input [3:0] rx_ctrl0 ,
    input [3:0] rx_ctrl1 ,
    input [3:0] rx_ctrl2 ,
    input [3:0] rx_ctrl3 ,
    output reg [31:0] rx_data_align,
    output reg [3:0]  rx_ctrl_align
);
reg[31:0] rx_data_r ;
reg[3:0] align_bit ;
reg[3:0] rx_ctrl_r ;
reg[3:0] rx_ctrl ;
 

always@(posedge rx_clk or negedge rst_n)
begin
    if(!rst_n)
        align_bit <= 16'd0;
    else if(rx_ctrl0 != 16'd0)
        align_bit <= rx_ctrl0;
    else
        align_bit <= align_bit ; //rx_ctrl0 ;  
end

always@(posedge rx_clk or negedge rst_n)
begin
if(!rst_n)
    rx_data_r <= 16'd0;
else
    rx_data_r <= rx_data;
end

always@(posedge rx_clk or negedge rst_n)
begin
    if(!rst_n)
        rx_ctrl_r <= 16'd0;
    else
        rx_ctrl_r <= rx_ctrl0;
end        
        
reg [31:0]  rx_data_align_01    ;
reg [31:0]  rx_data_align_10    ;
always@(posedge rx_clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            rx_data_align <= 32'd0;
        end
    else
        case(align_bit)     //检测到输入的对齐信号时
        4'b0001:
            begin
                rx_data_align       <= rx_data; 
            end
        4'b0010:
            begin
                rx_data_align       <= {rx_data[7:0],rx_data_r[31:8]};   
            end
        4'b0100:
            begin
                rx_data_align <= {rx_data[15:0],rx_data_r[31:16]};
            end
        4'b1000:
            begin 
                rx_data_align <= {rx_data[23:0],rx_data_r[31:24]};
            end
        default:
            begin
                rx_data_align <= 32'd0;
            end
    endcase
end

always@(posedge rx_clk or negedge rst_n)
begin
    if(!rst_n)
        rx_ctrl_align <= 4'd0;
    else
        case(align_bit)
        4'b0001:
            rx_ctrl_align <= rx_ctrl0;
        4'b0010:
            rx_ctrl_align <= {rx_ctrl0[0],rx_ctrl_r[3:1]};           
        4'b0100:
            rx_ctrl_align <= {rx_ctrl0[1:0],rx_ctrl_r[3:2]};  
        4'b1000:                                                 
            rx_ctrl_align <= {rx_ctrl0[2:0],rx_ctrl_r[3]};    
        default:
            rx_ctrl_align <= 4'd0;
    endcase
end 

endmodule

3.3 接口信号使用分析

3.3.1  ZYNQ 7 平台上GTX接口的信号

        在ZYNQ 7平台上,7 Series FPGAs Transceivers Wizard IP中,GTX关于数据对齐的有如下几个信号:

//------------ Receive Ports - RX Byte and Word Alignment Ports ------------
        .gt0_rxbyteisaligned_out        (gt0_rxbyteisaligned_i),
        .gt0_rxbyterealign_out          (gt0_rxbyterealign_i),
        .gt0_rxcommadet_out             (gt0_rxcommadet_i),
        .gt0_rxmcommaalignen_in         (gt0_rxmcommaalignen_i),
        .gt0_rxpcommaalignen_in         (gt0_rxpcommaalignen_i),
        .gt0_rxmcommaalignen_in         (1'b1),
        .gt0_rxpcommaalignen_in         (1'b1),
//----------------- Receive Ports - RX8B/10B Decoder Ports -----------------
        .gt0_rxchariscomma_out          (gt0_rxchariscomma_i),
        .gt0_rxcharisk_out              (gt0_rxcharisk_i),
//------------------- Transmit Ports - TX Gearbox Ports --------------------
        .gt0_txcharisk_in               (tx0_kchar),

        我的理解是,在写数据时,特定位置例如数据包头,给予 tx0_kchar 信号特定值,例如赋 4'b0001。对应传输到rx端的 gt0_rxcharisk_i ,如果接收到的值同样为 4'b0001,则说明数据是对齐的。如果接收到的值为 4'b0010 或 4'b1000 等 ,说明数据有移位。需要根据 “1” 的左右偏移对应校正数据。

        那么由此产生几个疑问:

1)其他几个信号是什么作用,如何使用?

2)K28.5 0xBC 的字节边界和此处的 tx0_kchar 功能是不是有重复?或者二者的功能各自用在哪里?

——K码对齐是GT IP自动完成的,通过K码将连续 1 bit数据分割成 Byte 数据。帧对齐(word alignment)是用户操作 Byte 数据进行对齐。

FPGA:【轻松玩转高速接口系列】、K码对齐、帧对齐规则_哔哩哔哩_bilibili

3.3.2  UltraScale 平台上GTH接口的信号

        关于数据对齐的如下:

   ,.rxcommadeten_in                         (rxcommadeten_in)
   ,.rxmcommaalignen_in                      (rxmcommaalignen_in)
   ,.rxpcommaalignen_in                      (rxpcommaalignen_in)

   ,.tx8b10ben_in                            (tx8b10ben_in)
   ,.txctrl0_in                              (txctrl0_int)
   ,.txctrl1_in                              (txctrl1_int)
   ,.txctrl2_in                              (txctrl2_in)

   ,.rxbyteisaligned_out                     (rxbyteisaligned_out)
   ,.rxbyterealign_out                       (rxbyterealign_out)
   ,.rxclkcorcnt_out                         (rxclkcorcnt_out)

   ,.rxcommadet_out                          (rxcommadet_out)
   ,.rxctrl0_out                             (rxctrl0_int)
   ,.rxctrl1_out                             (rxctrl1_int)
   ,.rxctrl2_out                             (rxctrl2_out)
   ,.rxctrl3_out                             (rxctrl3_out)

        由此产生疑问:

1)为什么 rxctrl 有3个信号,txctrl 有4个?分别是什么作用?

——见下节说明。

2)其他信号是什么作用,如何配置使用?

——TBD

4. 数据对齐信号说明

        Ref:《ug576-ultrascale-gth-transceivers》

4.1 TXCTRL

        TXCTRL Clock Domain is TXUSRCLK2.

TXCTRL1 and TXCTRL0

To accommodate protocols that use disparity to send control information, the running disparity(运行不一致性,RD) not only can be generated by the 8B/10B encoder but is also controllable through TXCTRL1 and TXCTRL0 as shown in Table 3-6. For example, an Idle character sent with reversed disparity might be used to trigger clock correction.

        为了考虑协议使用极性偏差来发送控制信息。运行极性偏差不仅可以由8B/10B编码器生成,而且可以通过TXCTRL1和TXCTRL0来控制,二者一起使用,如表3-6所示,表明数据 “disparity negative/positive”,极性偏差为正或负。例如,以反向极性偏差发送的空闲字符可能用于触发时钟校正。

        正常使用过程中赋0?

TXCTRL2

K Characters

The 8B/10B table includes special characters (K characters) that are often used for control functions. TXCTRL2 ports are used to indicate if data on TXDATA are K characters or regular data. The 8B/10B encoder checks received TXDATA byte to match any K character if corresponding TXCTRL2 bit is driven High.

        8B/10B表包括经常用于控制功能的特殊字符(K字符)。TXCTRL2 用于指示TXDATA上某些位是K码还是常规数据。如果TXCTRL2某位是1,则8B/10B编码器对应接收到TXDATA的字节为K码。

        例如,TXCTRL2 = 4’b0001,那么“1”位对应的rxdata 8位数据是K码,如采用K28.5,对应收到 8’hBC,将用于K码匹配对齐。

4.2 RXCTRL

        RXCTRL Clock Domain is RXUSRCLK2.

RXCTRL0

Special Characters

8B/10B decoding includes special characters (K characters) that are often used for control functions. When RXDATA is a K character, the decoder drives RXCTRL0 High.

        8B/10B解码包括经常用于控制功能的特殊字符(K字符)。当RXDATA是K字符时,解码器将RXTRL0 对应位驱动为高

RXCTRL1

Decoder Error Detection 解码错误检查

The decoder can provide both disparity check and out-of-table error detection. Disparity check is performed by the decoder. When the data byte on RXDATA arrives with the wrong disparity, RXCTRL1 is asserted High. This is shown in Figure 4-32. The figure shows a waveform at the RX data interface when the decoder receives good data (A), data with disparity error (B), and good data again (C).

        当RXDATA上的数据字节wrong disparity时,RXCTR1 拉高。

 RXCTRL2

Special Characters

If DEC_PCOMMA_DETECT is set to TRUE, the decoder drives the corresponding RXCTRL2 High whenever RXDATA is a positive 8B/10B comma. If DEC_MCOMMA_DETECT is TRUE, the decoder drives the corresponding RXCTRL2 bit High whenever RXDATA is a negative 8B/10B comma.

        如果DEC_PCOMMA_DETECT设置为TRUE,则每当RXDATA为正8B/10B逗号时(当RXDATA 是 plus comma),解码器就会驱动相应的RXTRL2高电平。

        如果DEC_MCOMMA_DETECT为TRUE,则每当RXDATA为负8B/10B逗号时(当RXDATA为minus comma),解码器驱动相应的RXCTRL2位为High。

RXCTRL3

Active High indicates the corresponding byte shown on RXDATA was not a valid character in the 8B/10B table.

        为高表示RXDATA对应字节不是有效数据。

RXCTRL0 and RXCTRL1

RXCTRL0 and RXCTRL1 除了上述特殊字符和解码错误检查的功能外,还有表外错误检查功能。

The 8B/10B decoder performs out-of-table error detection and drives the RXCTRL3 port High when it is enabled, but receives a 10-bit character that cannot be mapped into a valid 8B/10B character listed in Appendix A, Valid Data Characters. When this occurs, the non-decoded 10-bit character is piped out of the decoder through the RX data interface with this format:
•The corresponding RXCTRL1 represents the 9th bit
•The corresponding RXCTRL0 represents the 8th bit
•The corresponding RXDATA byte represents the [7:0] bits
•The corresponding RXCTRL3 represents that an invalid 8B/10B character error occurred

Figure 4-33 shows a waveform at the RX data interface when the decoder receives good data (A), data with an invalid character (B), and good data again (C). When an error occurs during (B), RXCTRL0 represent non-decoded data bit [8] and RXCTRL1 represent the non-decoded data bit [9], where the RXDATA represents the non-decoded data bits [7:0].

表外错误检测

当RXCTRL3启用,但接收到的10位字符无法映射到有效8B/10B字符时,驱动RXCTRL3为高。发生这种情况时,未解码的10位字符通过以下格式的RX数据接口从解码器输出:
•对应的RXCTRL1表示第9位
•对应的RXCTRL0表示第8位
•相应的RXDATA字节表示[7:0]位
•相应的RXCTRL3表示发生了无效的8B/10B字符错误

4.3 回环测试信号示例

  • TXCTRL0 = 0 ,TXCTRL1 = 0 。
  • TXCTRL2 在数据同步位 = 4’b0001,其他时间 = 0。
  • RXCTRL1 = 0 ,表示没有 wrong disparity 。
  • RXCTRL0 在RXDATA为K码时= 1,其他时间为0 。
  • RXCTRL2 在RXDATA为K码时,表明 RD+/- 即 minus / plus comma 出现,此时为1,其他时间为0 。

5. 一些过程测试现象 

1)rxctrl1 有变化,rx数据偶尔正确;

2)rxctrl2 == 0,其他规律性变化,rx数据不对。

2024.4.15尝试:

3)txctrl2 在对齐位=1,其他时间为0时,rxctrl0、rxctrl2伴随变化。rx数据txctrl2=0时不对,但align模块可调。

4)txctrl2 始终为1时,rxctrl0、rxctrl2伴随变化且rxctrl1伴随反相变化。rx数据正确。

5)txctrl2 ,txctrl0 均始终为1时,rxctrl0、rxctrl1、rxctrl2伴随变化。rx数据正确。

6)(  ~3))txctrl0 在对齐位=1,其他时间为0时,rxctrl1伴随变化为2/0。rx数据正确。

7)(  ~4))txctrl0 始终为1时,rxctrl1伴随变化为2/1。rx数据正确。

6. Reference 

1. https://blog.csdn.net/weixin_44327074/article/details/137033356

2. UltraScale+ GTH ip核使用_ibufds_gte4-CSDN博客

3. Ultrascale/Ultrascale+ FPGA GTH IP及结构详解(一)_gth接口-CSDN博客

4. FPGA GTH 全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2套工程源码和技术支持_原语gthe2_common-CSDN博客

5. FPGA光纤通信--A7、ZU7EG间光纤通信_plus comma-CSDN博客 

6. disparity/Running disparity(RD)和8b/10b线路编码_8b10b running disparity-CSDN博客

7. 8b/10b编码技术系列(二):Disparity、RD、8b/10b编码-CSDN博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值