关于GTX接口网上理论的介绍有很多,以及IP核的配置介绍也有,但是没有人介绍说怎么封装用户的接口,我这里简单的说一种方法:
下面是网上搜集的一些GTX的相关资料链接:
- https://blog.csdn.net/weixin_42229533/article/details/86541557 ([ZYNQ入门宝典]GTX高速口怎么玩(一))
- https://blog.csdn.net/weixin_42229533/article/details/86541970 ([ZYNQ入门宝典]GTX高速口带着IBERT一起玩(二))
- https://blog.csdn.net/u010161493/article/details/77658599 (xilinx IP核配置,一步一步验证Xilinx Serdes GTX最高8.0Gbps)
一、GTX作为只传输数据,我们一般不走协议,为了采用更高的传输效率,采用64b/66b编码直接传输,每个通道传输的最大速率受参考时钟的影响,我的板子上的GTX参考时钟为100Mhz,每个通道的最大传输速率为2.5Gbps,VIVADO的IP核配置如下:
二、IP核生成后打开example工程,可以看到代码结构如下:
gtwizard_0_GT_FRAME_GEN模块产生要发送的测试帧数据;
gtwizard_0_GT_FRAME_CHECK模块检查回环后收到的数据是否正确;
gtwizard_0_BLOCK_SYNC_SM模块通过GTX收到的帧头,给出gt0_rxgearboxslip_i信号来让IP核接收部分进行bit位移动,实现接收端 的数据对其;
gtwizard_0_SCRAMBLER模块将要发送的测试帧数据进行64b/66b编码,然后送给IP核进行发送;
gtwizard_0_DESCRAMBLER模块将GTX收到的数据进行64b/66b解码,然后送给gtwizard_0_GT_FRAME_CHECK模块检测收到的数据
三、接下来是重点,生成的example模块接口如下:
我们要做的就是如何把接口变成用户可以使用的接口,只需要在该example修改少量代码即可:
删除下面第472行到483行代码,将差分输入的时钟替换成锁相环分频出来的50Mhz或者PS送给PL的50Mhz。
修改后的代码如下,用tx_data替换掉gtwizard_0_GT_FRAME_GEN模块输出的gt0_txdata_i数据。我们用户层即可以使用下面的接口进行发送和接收数据
需要注意的是如下图:gt0_data_valid_in信号要拉高,目的是告诉gtwizard用户端已经收到正确的数据,否则gtwizard的ip内部状态机的定时器会不断的复位。
gt0_data_valid_in没有修改的时序图如下:可以看到gt0_rxresetdone_r受内部状态机的影响复位了多次。
gt0_data_valid_in修改后,赋值为1的时序图如下:可以看到gt0_rxresetdone_r只有上电的时候进行了复位。
通过上板测试,A板子发送数据,B板子收到数据后过异步FIFO回环,采用X2的模式,在100Mhz的参考时钟下,最大传输速率为4.848Gps,与理论值(64/66)*5Gbps一致。发送递增数据经过一个小时的测试,没有出现错数和丢数。
注意:以前做图像的时候,通过gtwizard收发器接收SDI接口的视频数据,直接回环的时候发现gt0_txusrclk2_i和gt0_rxusrclk2_i这两个发送和接收时钟频率存在频率偏差,导致用异步fifo回环的时候有出现空满现象,而且每次上电两个时钟频率差别还不固定,最后是通过DDR才解决了这个问题。
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e9f16cbbc2.css" rel="stylesheet">
</div>
关于GTX接口网上理论的介绍有很多,以及IP核的配置介绍也有,但是没有人介绍说怎么封装用户的接口,我这里简单的说一种方法:
下面是网上搜集的一些GTX的相关资料链接:
- https://blog.csdn.net/weixin_42229533/article/details/86541557 ([ZYNQ入门宝典]GTX高速口怎么玩(一))
- https://blog.csdn.net/weixin_42229533/article/details/86541970 ([ZYNQ入门宝典]GTX高速口带着IBERT一起玩(二))
- https://blog.csdn.net/u010161493/article/details/77658599 (xilinx IP核配置,一步一步验证Xilinx Serdes GTX最高8.0Gbps)
一、GTX作为只传输数据,我们一般不走协议,为了采用更高的传输效率,采用64b/66b编码直接传输,每个通道传输的最大速率受参考时钟的影响,我的板子上的GTX参考时钟为100Mhz,每个通道的最大传输速率为2.5Gbps,VIVADO的IP核配置如下:
二、IP核生成后打开example工程,可以看到代码结构如下:
gtwizard_0_GT_FRAME_GEN模块产生要发送的测试帧数据;
gtwizard_0_GT_FRAME_CHECK模块检查回环后收到的数据是否正确;
gtwizard_0_BLOCK_SYNC_SM模块通过GTX收到的帧头,给出gt0_rxgearboxslip_i信号来让IP核接收部分进行bit位移动,实现接收端 的数据对其;
gtwizard_0_SCRAMBLER模块将要发送的测试帧数据进行64b/66b编码,然后送给IP核进行发送;
gtwizard_0_DESCRAMBLER模块将GTX收到的数据进行64b/66b解码,然后送给gtwizard_0_GT_FRAME_CHECK模块检测收到的数据
三、接下来是重点,生成的example模块接口如下:
我们要做的就是如何把接口变成用户可以使用的接口,只需要在该example修改少量代码即可:
删除下面第472行到483行代码,将差分输入的时钟替换成锁相环分频出来的50Mhz或者PS送给PL的50Mhz。
修改后的代码如下,用tx_data替换掉gtwizard_0_GT_FRAME_GEN模块输出的gt0_txdata_i数据。我们用户层即可以使用下面的接口进行发送和接收数据
需要注意的是如下图:gt0_data_valid_in信号要拉高,目的是告诉gtwizard用户端已经收到正确的数据,否则gtwizard的ip内部状态机的定时器会不断的复位。
gt0_data_valid_in没有修改的时序图如下:可以看到gt0_rxresetdone_r受内部状态机的影响复位了多次。
gt0_data_valid_in修改后,赋值为1的时序图如下:可以看到gt0_rxresetdone_r只有上电的时候进行了复位。
通过上板测试,A板子发送数据,B板子收到数据后过异步FIFO回环,采用X2的模式,在100Mhz的参考时钟下,最大传输速率为4.848Gps,与理论值(64/66)*5Gbps一致。发送递增数据经过一个小时的测试,没有出现错数和丢数。
注意:以前做图像的时候,通过gtwizard收发器接收SDI接口的视频数据,直接回环的时候发现gt0_txusrclk2_i和gt0_rxusrclk2_i这两个发送和接收时钟频率存在频率偏差,导致用异步fifo回环的时候有出现空满现象,而且每次上电两个时钟频率差别还不固定,最后是通过DDR才解决了这个问题。
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e9f16cbbc2.css" rel="stylesheet">
</div>
来源:https://blog.csdn.net/qq_20785973/article/details/102775396