目录
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. 背景介绍
基于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 occurredFigure 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博客文章来源:https://www.toymoban.com/news/detail-860893.html
7. 8b/10b编码技术系列(二):Disparity、RD、8b/10b编码-CSDN博客文章来源地址https://www.toymoban.com/news/detail-860893.html
到了这里,关于FPGA GTH 实现QSFP光口通信(三)——单路数据对齐的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!