这篇文章是我对GTX基础学习的一个总结,用GTX来实现一个收发数据的环路。如果你的需求是用来学习GTX核的配置和使用,那这篇文章一定可以帮助到你。
本来想像VIVADO中FFT核的使用(FPGA计算FFT和IFFT)一样,把每一个配置都说一说,但是它的配置实在是太多了。
为什么会有这么多要设置的地方?因为这个核的设计是考虑了众多通用性的需求的。你可以用它来实现众多协议像PCIE,SATA,Auraro等,要满足这么多协议的要求就会需要很多的信号线,但如果你不需要使用这些协议,那就大可以放心的不用管那些配置。
第一页
GT Type:取决于你板子的FPGA型号,我的板子只有GTX,不同的GT(GTP/GTX/GTY/GTZ)主要是速度的区别。
Shared Logic:一般选择in the example design。可以把复位,时钟等在示例设计中展示出来。
第二页
Protocol(协议):这是XILINX官方提供的一些现成的协议,选了协议以后它按照所选协议的物理层规格来操作,例如它将使用正确的数据速率、编码方法、电平规范等。有点像一键配置,选择协议后,后面几页的很多参数也会跟着改变。因为主要是为了学习,所以我这里选择Start from scratch,也就是不用协议。
Line Rate(线速度):这个选项决定了串行数据的速率,如果上面选择了协议的话,会自动选择对应的速度。没有选择协议速度可以按我们的需求自定义。
Referce Clock(参考时钟):选择了线速度后,会有很多参考时钟可以选(考虑与其他系统的兼容性),选哪个都行。之后给到IP核的时钟要和这个对应上就行。
Use Common DRP(动态配置):可以在传输过程中改变属性,如线速度。我没有用这个功能就不多介绍了。
Advanced Clocking Option:可以提供时钟选项给动态配置过程使用。
Vivado Lab Tools:生成的实例中添加ila,vio等调试工具。
QPLL还是CPLL:CPLL是用于单个GTX收发器的相位锁定环(PLL),QPLL是一个可以跨多个GTX收发器通道提供时钟的相位锁定环。要使用多个通道并且同步的话就选择QPLL,或者单个通道但线速率大于6.5G。否则选择CPLL,消耗的资源小些。
使能通道:左下角的图中的通道可以直接用鼠标点击来选择,然后勾选Use GTX XxYx。
第三页
TX部分
External Data Width(外部数据位宽):就是我们输入给IP核并行数据的位宽。
Encoding(编码方式):这个会把你输入的并行数据进行编码,串行输出的数据就是编码后的数据。
Internal Data Width(内部数据位宽):内部数据是指下图中所示的部分
它会影响时钟TXUSRCLK
在实际的开发中我们一般用的是它的弟弟TXUSRCLK2,给IP核输入并行数据的时候用的就是TXUSRCLK2。TXUSRCLK是给内部数据使用的,它配合TXUSRCLK2使得整个数据流的时序平衡。所以设置的时候会发现,这个选项是跟着外部数据宽度以及编码方式走的,成一定的比例关系。它不会影响传输的效果,不用太担心。
RX部分配置的含义与TX部分基本一致,可以把它们配置成一样的,也可以单独配置,就不多介绍了。
Option Ports
上面不是选择了编码方式嘛,这里就可以选择要不要使用编码里面的一些信号,后面混入了两个数据对齐的信号,不知道为什么要放在这里。
TXBYPASS8B10B: 这是一个发送端的可选择输入,当启用时,它允许数据绕过8B/10B编码器。这通常被用于那些需要自定义编码或不使用8B/10B编码的应用。
TXCHARDISPMODE: 另一个发送端的可选择输入,它指示发送端字符是否应该强制为不定时位(disparity)模式。在8B/10B编码中,每个字符可以有负不定时或正不定时,使用这个信号可以强制输出的字符以某个特定的不定时模式发送。
TXCHARDISPVAL: 在发送端,用来指定当TXCHARDISPMODE激活时使用的实际不定时值。
RXCHARISCOMMA: 这是接收端的一个状态输出,指示接收到的字符是否为逗号字符(comma character)。逗号字符在高速数据传输中用作对齐信号,帮助接收方进行字节对齐和同步。
RXCHARISK: 也是接收端的状态输出,表示接收到的字符是否被标记为K字符,也就是控制字符。在8B/10B编码中,K字符被用于标识一些特殊情况或非数据字如帧开始、结束等。
RXSTARTOFSEQ: 接收端的一个状态输出,这个信号用于检测接收到序列的起始。这通常用于协议层来识别一帧数据的开始。
Syncharonization and Clocking
这部分的精确设置取决于特定的应用场景、数据速率要求、使用的协议标准以及所需的系统性能。在第二页选择协议时,这里会自动配置。 我没有使用这里的设置,保持默认就行。
第四页
RXCOMMA Alignment:
输入到FPGA收发器的串行数据在解串(串并转换)之前必须进行符号边界对齐。为了保证数据对齐,发送器发送一个通常称为comma码(K码)的字符,接收器在输入的数据里查找comma码。当发下comma码后,则将comma移动到字符边界,这样使得接收到的并行数据匹配发送的并行数据。
下图显示了10bit comma对齐过程。RX接收到没有对齐的数据在图中右侧。图中虚线为查找到的comma码,标志查找到字节边界,图中左侧comma之后每10bit自动划分为一个字,自此完成数据字对齐。
有这个概念以后,这一部分的设置就很清晰了:
RX COMMA detection里面是用来设置对齐码内容的,加上Cmama Mask来设置哪些位可以不用考虑:
Align to(对齐的字节)根据信号宽度设置,参考下表:
比如说我这里传输的是16位的,也就是2个字节。如果选择的是一个字节对齐,发送的数据是01 23 45 ,接收数据可能就会识别为x0 12 34 5x。
Option Ports里是一些状态信号,这里注意ENPCOMMALIGH,ENMCOMMALIGH和RXLIDE不能同时使能,因为RXLIDE是手动操作的信号,具体使用方法如下图:
给RXSLIDE一个高电平,收到的数据向左移一位。
Termination and Equalization
主要涉及设置串行收发器(GTX)的终端电阻和均衡器选项,用来确保确保传输线路的稳定性、信号完整性和数据可靠性。因为我没有用到这里的东西,也就不多介绍了。
第五页和第六页
这两页的功能我没有使用,保持默认就行。大概讲一下它们是干啥的:
第五页用GTX来实现PCIE,SATA等协议进行物理层的设置,当然要实现协议还得和其他的IP核一起配合。
PRBS通常用于验证收发器的链接质量和性能。它可以生成高度随机的二进制序列来模拟数据负载,并在整个系统的发送端和接收端之间传输,对于硬件调试和信号完整性测试非常有用,因为它可以帮助识别通道中的问题,如串扰、失真、和多径干扰等。
CB (Comma Burst)和 CC (Comma Character)"序列在串行通信协议中用于数据帧定界、对齐和错误检测,常见于如PCIe、SATA等高速串行通信协议。具体来说:
CB 主要用于区分各种控制字符和数据有效载荷,它通常是一个特定模式的比特序列,用于帧的开始和结束指示。
CC则是一个或多个特殊比特序列,通常用于辅助帧同步和对齐操作,可以帮助接收方在连续的数据流中找到确切的起始位置。
第七页
这一页是刚刚配置形成的比较重要参数的总结
重点说一下TXUSRCLK2和RXUSRCLK2,这两个是发送和接收得到的并行数据就是按这两个时钟的速度传输的。
写在最后
因为我没有使用GT核去实现其他的通信协议,所以在一些设置的介绍上面只讲了它们大概的作用,也没有具体去使用过,不过这些设置确实是不影响数据环路的实现的。这篇文章只是配置过程,我在XILINX的GTX官方例程的讲解中对相应生成的例程进行详细的介绍,看完应该就可以知道怎么按照自己的需求去修改例程啦。