作者:Cheng Zhang,AMD工程师;文章来源:AMD Xilinx开发者社区
1. 关于PRBS13、QPRBS13、PRBS13Q和QPRBS13-CEI的定义
1)PRBS13的表达式为 x13 + x12 + x2 + x + 1
2)在AR72117中对QPRBS13、PRBS13Q和QPRBS13-CEI有以下定义:
目前对于Vivado2023.1版本的IBERT GUI界面暂时不支持QPRBS13的设置,需要通过tcl或者端口设置的方法来实现。
Tips:不建议同时用IBERT GUI和Properties窗口设置GTM的Attributes,可能会导致寄存器值出错。
3)PRBS13、QPRBS13、PRBS13Q解析
首先,根据PRBS13的表达式来构建一个数列表格, PRBS13每 8191个bit循环一次,此处选取前64位数据展示并且与仿真波形作对比:
PRBS13仿真波形 (TXQPRBSEN = 0, TX_GRAY_BYP_EN = 1)
注意:按照AM017的描述,当TX_GRAY_BYP_EN为1时,关闭GARY编码器。当TX_GRAY_BYP_EN为0时,使能GARY编码器。
PRBS13Q仿真波形 (TXQPRBSEN = 0, TX_GRAY_BYP_EN = 0)
QPRBS13仿真波形 (TXQPRBSEN = 1, TX_GRAY_BYP_EN = 1)
当前输入为反转后的PRBS13(连续12位“1”),因此按照PRBS13表达式产生的64位数据如下表所示:
在了解QPRBS13的编码规则后,接下去搭建工程做实际的测试。
2. 新建Versal GTM工程
对于Versal GTM,IBERT工具已经被集成到GTM内部。因此需要使用Versal Transceivers Wizard新建一个测试工程,本文的测试工程基于VPK120 评估板设计。
在Wizard中主要更改两个地方的设置:
设置完成后打开IP Example Design:
3. 调整硬件设置
此处需要对Example design做四个调整:
1) 把gpio_enable、gt_reset和rate_sel三个信号连接到VIO的输出。
2) 添加Clocking wizard模块,设置clk_out1的频率为200MHz,并且提供给gt_bridge和gt_quad的apb3_clk作为时钟。
3) 设置TX和RX的Reference Clock频率为156.25MHz。
4) 把GT Quad约束到Quad 202,Reference clock约束到管脚V45。
修改完成后点击Generate Device Image生成PDI文件,连接JTAG并且把PDI下载到VPK120。
4. 构建寄存器读写函数
控制GTM相关寄存器需要按位操作,因此首先需要设计一个能够按位读写的函数,函数内部执行步骤如下:
1) 获取对象名称
本文中的IBERT名称为IBERT_0,在后面的操作中都以IBERT_0作为操作的对象名称。因为工程中用了GT Quad202,所以tcl命令对于Quad202的ch0定义为:IBERT_0.Quad_202.CH_0 ,其他通道可参照这个命名类推。
2) 刷新全部寄存器
这一步操作很重要,如果没有刷新全部寄存器的步骤,将无法读取到最新的寄存器数据,可能会读出来上一次的数据或者全0的数据。
refresh_hw_sio [list [get_hw_sio_gts {IBERT_0.Quad_202.CH_0}] ]
read_gtm_attributes $channel $reg
3) 数据格式转换
刷新寄存器后会发现在GT Properties窗口显示的数据从0xXXXXXXXX变为了0xXXXX_XXXX,然而在tcl的按位与和按位或的运算中无法识别下划线,下划线会导致数据运算出错,这一步需要先从相应的寄存器把数据读取出来,然后将下划线移除。
这里的channel和reg是函数的参数,channel代表GT的通道编号,reg是需要操作的寄存器。
set RegValue1 [get_property $reg [get_hw_sio_gts $channel]]
set RegValue [regsub {_} $RegValue1 ""]
4) 判断和位运算
这里的op和value是函数的参数,op代表运算操作是按位与还是按位或,value是具体运算的值。
if { $op == "AND" } {
set RegValue1 [format 0x%x [expr {$RegValue & $value}]]
} elseif { $op == "OR" } {
set RegValue1 [format 0x%x [expr {$RegValue | $value}]]
} else {}
5) 将系数设回到相应的寄存器
set_property $reg $RegValue1 [get_hw_sio_gts $channel]
commit_hw_sio [get_hw_sio_gts $channel]
6) 操作函数定义
操作函数有4个传递参数proc change_gtm_attributes { channel reg value op },具体作用在上文已经说明。例如对于下面这个函数,其对应的操作是向Quad_202.CH_0的CH0_FABRIC_INTF_CFG0寄存器按位与的方式写入0xFFFEFFDF,即将CH0_FABRIC_INTF_CFG0寄存器的Bit5和Bit16置为“0”,其余位保持不变。
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG0 0xFFFEFFDF AND
5. 配置GTM的相关寄存器产生QPRBS13序列
1) 打开Attributes控制使能,关闭端口控制
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG0 0xFFFEFFDF AND
2) 设置TX PRBS的Pattern
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG4 0x6000 OR
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG4 0xFFFF6FFF AND
3) 设置RX PRBS的Pattern
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG1 0x300000 OR
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG1 0xFFB7FFFF AND
4) 打开TXQPRBS使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG4 0x40000000 OR
5) 打开RXQPRBS使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG1 0x2000 OR
6) 关闭TX Gray Encoder使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_TX_PCS_CFG0 0x1000 OR
7) 关闭TX Gray Decoder使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_RX_PCS_CFG0 0x1000 OR
8) 设置LOOPBACK为Near end PCS
set_property CH0_LOOPBACK {Near-End PCS} [get_hw_sio_gts IBERT_0.Quad_202.CH_0]
实际运行结果
1) 将PDI文件下载到器件中,并且运行tcl命令,先不使能QPRBS,设置为常规PRBS13输出。
可以看到NEAR-END PCS回环已经建立,并且RXPRBSLOCKED也已经拉高。
2) 运行TCL命令,打开TXQPRBS使能,对于RX继续输出常规PRBS,此时Link status显示为No Link和实际速率之间翻转,且RXPRBSLOCKED输出状态也呈现为周期性翻转。
3) 再次运行TCL命令,打开RXQPRBS使能,此时的Link status再次恢复显示为实际速率,RXPRBSLOCKED输出也再次呈现为高电平。
4) 参考AM017,Versal GTM除了不支持QPRBS-7,其他的Pattern都是支持的。
5) 这个方法也可以用于产生其他QPRBS Pattern。
评论
求助:我在另外一台可上网的笔记本上安装了vivado18