总目录在这哦~
https://blog.csdn.net/z123canghai/article/details/107700878
第五章 GTP发送模块详解
目录
5.1 数据接口与8B/10B编码
本章就要开始介绍“GTPE2_CHANNEL”这个硬核或者说是原语内容了。本章的主要内容是对“GTPE2_CHANNEL”内部发送部分的框架进行大致的阐述,了解内部有什么东西,明白数据是怎么从用户接口发送出去的。
当我们要发送一包数据的时候,在用户接口实际用到的信号其中就是这个三个,一个时钟,一个类似数据有效信号、一个数据。我们把他写入到“GTPE2_CHANNEL”,该硬核就会将其按照你所配置的方式,转为串行数据发出。
由于GTP的灵活特点和高速要求,所以“GTPE2_CHANNEL”内部包含了非常多的东西,如下图所示,我们可以将其分为两个部分,即PCS和PMA。
PCS(Physical Coding Sublayer)意思是物理编码子层,这不是xilinx自定义的一个名词,是具有普遍意义的,就是表示用户数据到串行数据间的处理过程,包括8B/10B编码、弹性缓冲区等等。
PMA(Physical Media Attachment)物理媒介适配层:这一层主要是接收PSC处理后的数据进行串并转换、预加重等功能。
但下图这些模块并不是都会用到,例如PCIE和SATA如果不做相关设计是必然不会用到的,所以,在本章会对每个模块进行大致的介绍,了解其功能,接下来章节会对用到的模块进行详细阐述,而这些模块也是我们实现高速串行接口的核心。
1、FPGA TX Interface
就是用户数据的输入接口,也就是上述的
2、TX PIPE Control
PIPE的全称是Physical Interface for PCI Express,即PCIe物理层接口,如果使能了PCIE接口,则该通道是PCIE的数据通道。
3、TX Gearbox
GTP除了支持8B / 10B编码外还支持64B / 66B和64B / 67B编码方式,以此来提高有效数据的传输效率,支持这些通过对该模块的配置实现。
4、Pattern Generator
伪随机序列(Pseudo-random bit sequences,PRBS)是一种貌似随机,实际上是有规律的周期性二进制序列,用于高速串行通信通道传输的误码率测试。
5、8B/10B Encoder
8B/10B 编码是非常重要的一个知识点。位宽8bit可以组织出 256种数据,位宽10bit可以组织出1024种数据,我们就从这1024种数据中挑出一些0和1的个数应尽量相等的数据来表示8bit数据,另外还可以再挑出12种控制字符,来表示链路的状态或者控制信息,这不仅可以保持良好的直流平衡,增加了数据的传输距离,提供了更为有效的错误检测机制,还可以用来实现时钟修正、块同步、通道绑定和将带宽划分到子信道等
6、TX Phase Interpolator Controller
这是TX相位插值器控制器模块,支持动态控制TX相位插值器(TX PI),TX PMA中的数据进行微调。
7、Phase Adjust FIFO
为了保证数据传输速率一致,XCLK必须和TXUSERCLK时钟的速率匹配,并且要解决2个时钟域之间的相位差异。利用TX BUFFER介于XCLK和TXUSERCLK俩时钟域之间,用于匹配两者的速率和相位偏差。
8、SATA OOB
SATA的全称是Serial Advanced Technology Attachment,即串口硬盘。OOB带外数据(Out of Band)。SATA的通讯建立主要是靠OOB(Out Of Band)的检测实现的,并且向上层Link Layer提供了物理层的连接情况。
9、PCIE Beacon
提供PCIE的唤醒功能,由于不作为PCIE物理层接口,所以也是用不到
10、Polarity
这个很好理解嘛,就是对从PSC子层输出的编码数据,在发送端的串行化处理之前进行极性翻转。极性翻转只须将TXPOLARITY接口信号置位“1”即可。为啥要设置这个功能呢?为了兼容不同板卡间极性的不同或是PCB搞错的了情况。这也是个可选端口
11、PISO
PISO的全称是parallel input Serial output即并行输入串行输出,实现数据的串并转换功能
12、TX Configurable Driver
这包括“TX Pre/Post Emp”和“TX Driver”
其中TX Pre/Post Emp 的全称是Pre-cursor and post-cursor transmit pre-emphasis
GTP收发器TX驱动器是高速电流模式差分输出缓冲器。为了最大化信号完整性,它具有差分电压控制、前光标和后光标发送预加重、校准终端电阻功能,我们可以通过参数对其进行配置。如下为示意图,但还是默认吧,不要刚接触不要添乱了。
13、TX OOB and PCIE
这个主要是当GTP作为PCIE或SATA接口时所需要的功能, 忽略。
14、CLK
这又是重点,我们可以看到从用户接口的数据输入到串行数据的输出要跨四个时钟域,为什么要跨这么多时钟域呢?又是如何实现的呢?这将会以单独章节进行描述。
15、MUX
多路选择器,没什么好说的。
以上,即为GTP发送部分的所有模块,从分析来看,这部分不仅是实现串行数据的发出,同时也兼容了CPIE、SATA等接口,作为它们的物理层。但本系列视频着重介绍自定义协议的数据发出,也就是单纯的去了解咱们实现串行高速数据传输的,所以这些就不再阐述,而接下来着重要将的就是如下链路所涉及的内容。
5.2 数据接口与8B/10B编码
上一章阐述了发送部分所有的模块,本章就开始对实现高速串行数据发送所需的模块进行详细的阐述。本章主要描述的有两个模块,一是数据接口,二是8B/10B编码。对于8B/10B编码的实现机制可参考我另一篇文章《剖析8B/10B的实现机制》
第一步,我们先大致了解下用户接口是怎么配置的。
如下图是我们用户接口中涉及到的数据发送相关信号,看到这些信号,我想你会有这样三个疑问,一是这些信号都是干嘛的?如何实现数据发送呢?为啥会有两个时钟呢?接下来就对此一一解答。
首先,第一个问题,这些信号都是干嘛的?如下表所示
端口 |
方向 |
时钟域 |
描述 |
TXCHARDISPMODE [3:0] |
In |
TXUSRCLK2 |
这两个信号是搭配使用的 当禁用8B / 10B编码时: 用于扩展20位和40位TX接口的数据总线。 当启用8B / 10B编码时 用于手动实现运行差异(RD)的控制 |
TXCHARDISPVAL [3:0] |
In |
TXUSRCLK2 |
|
TXDATA [31:0] |
In |
TXUSRCLK2 |
用于传输数据的总线。此端口的宽度取决于TX_DATA_WIDTH 若TX_DATA_WIDTH = 16,20:则TXDATA [15:0] = 16 当位宽是20或40时,则禁用8B / 10B编码器, TXCHARDISPVAL和TXCHARDISPMODE端口与TXDATA端口连接。 |
TXUSRCLK |
In |
Clock |
该端口用于为内部TX PCS数据路径提供时钟。 |
TXUSRCLK2 |
In |
Clokc |
该端口用于将FPGA逻辑与TX接口同步。当用户提供TXUSRCLK时,该时钟必须与TXUSRCLK正边沿对齐。 |
接下来我们来做进一步的阐述,以此了解如何实现数据发送的
对于发送端的数据接口,我们有4种选择,也就是上表中的16、20、32、40。这在我们配置选项卡里可以通过配置实现,如下表。另外内部数据位宽“Internal Data Wudth(bits)”只有16和20两种选择,也就是说如果用户端选择了32或40,在其内部会进行一次转换。
对于8B/10B编码,我们可以使能也可以不使能也可以选择64B/66B编码。
如果不使能的话,如上表所说,当我们数据接口在IP中配置为20或40时就需要“TXCHARDISPMODE”和“TXCHARDISPVAL”的帮忙了,如下表所示,我们可以定义一个20bit或40bit的寄存器,在赋值时按照下图分别赋值。
我们一般情况下是使能的,这样使用起来更简单,这时“TXCHARDISPMODE”和“TXCHARDISPVAL”就有了极性控制的作用。高速串行接口需要保证直流平衡,需要计算不平衡度,这是硬核模块会帮我们实现的,但我们也可以自己来控制,你看,不是说接口复杂呢?什么都可以让你看操作。如果自己控制就需要这两个信号了
TXCHARDISPMODE |
TXCHARDISPVAL |
作用 |
0 |
0 |
这俩信号没用,有8B/10B硬核自动计算“RD” |
0 |
1 |
翻转运行差异 |
1 |
0 |
强制RD为负 |
1 |
1 |
强制RD为正 |
再插一句,如果上面有什么概念不懂,可参考《剖析8B/10B的实现机制》一文,看来就懂了,如下是GTP的8B/10B编码方式,大概看看就行,而且ug482的附录C有具体的编码表。
再来说下最后一个问题,为什么俩时钟,这俩时钟干嘛的?具体的呢会在发送端口的时钟接口这章节描述,在这只需要知道,
如果用户数据接口是16或20bit,那么,TXUSRCLk2 = TXUSRCLK的,如果户数据接口是32或40bit,2TXUSRCLk2 = TXUSRCLK,就这么点关系,TXUSRCLK可以说没啥用
最后总结下,如果我们使能8B/10B编码且自己不控制不平衡度的话,那么数据发送接口只需要3个信号,如下图,另外那两或者在配置IP时不勾选,或者直接写0即可。
而且实现起来也很简单,将gt0_rxcharisk_out置一表示发送K码,否则就是发送数据
最后不得不说,GTP就是个纸老虎,看着那么多接口让人头疼,其实是为了实现其灵活性,真正的使用起来却是简单得很,所以不要畏难,那是你的双眼被蒙蔽了。
5.2 时钟结构
在第三章介绍了GTP的时钟结构,主要是讲时钟与各个模块之间的联系,本章是在这基础之上阐述外部时钟与模块内部的关联,如下图是从ug482截取出来的发送模块的时钟架构。在这里首先说明一下,如果是用的GTX,看到用户手册是《ug476》会与本图有些区别,主要是多了CPLL,支持每通道的1.8Gbps到3.6Gbps的速率选择,它与QPLL是二选一的,好了,。
这图描述了从时钟输入引脚到“GTPE2_CHANNEL”的整个流程。
接下来来分析一下下图,
1)“PLL0/1OUTCLK”和“PLL0/1REFCLK”是从“GTPE2_COMMON”这个硬核产生的,如下图所示,
其中“PLL0/1OUTCLK”是线速率,也就是在选项卡里配的。“PLL0/1REFCLK”是参考时钟,这两类四个信号都是必须接入的,然后通过“TXSYSCLKSEL”选择,这是一个2bit数,选择方式如上图所示了。这个选择信号可以动态配置也可以根据选项卡配置生成,如果说要动态配置就需要在选项卡勾选这个信号
2)“PLL0/1OUTCLK”这一路经过选择后进入“TX PMA”的相位插值器“Phase Interp”随后分两路到D分配器和并转串模块“PISO”,这里它这个图画错了,应该是如红线所示,按原图逻辑不符,具体可见下文分析。
3)这里的相位插值器“Phase Interp”只是实现相位调整功能,而对该模块的控制模块是在PCS模块中,可见第四章所示。
4)“/D”分频器为我们提供了每通道实现不一样速率的方式,但只能实现1、2、4、8分频。所以每个发送器PMA模块都有一个D分频器,它将PLL的时钟分频,以降低线路速率。此串行时钟分频器D可以为具有固定线路速率的应用静态设置,也可以针对具有多个线路速率的协议动态更改。要在固定线路速率应用中使用D分频器,必须将TXOUT_DIV属性设置为适当的值,并且TXRATE端口需要连接到3'b000。要在多个线速应用中使用D分频器,TXRATE端口用于动态选择D分频器值。TXOUT_DIV属性和TXRATE端口必须在器件配置时选择相同的D分频器值。器件配置后,TXRATE用于动态更改D分频器值。
如果选择可配置就需要在配置选项卡中选择该信号,默认是不分频的
5)由上一章得知,内部数据位宽只能是16或者20,所以如果位宽是16则对串行时钟进行4分频,如果是20则对串行时钟进行5分频,随后对其进行2分频
6)分频数字经过有三个路由方向,一是“TXOUTCLKPCS”直接输出,二是到选择器,
选择器汇集了五路时钟信号供我们选择,官方推荐建议我们选择“TXOUTCLKPCS”这个时钟
TXOUTCLKSEL = 3'b011或3'b100:TXPLLREFCLK_DIV1或TXPLLREFCLK_DIV2是PLL0或PLL1的输入参考时钟,具体取决于TXSYSCLKSEL [1]的设置。 TXPLLREFCLK是推荐用于一般用途的时钟,并且是TX缓冲器旁路模式所需的时钟。
7)“TXOUTCLK”输出时钟就已经输出到“GTPE2_CHANNEL”外了,由它产生用户时钟
5.3 其他模块
下面在说下其他模块,这些模块不是很复杂而且有些也是不常用,就放一堆儿一块描述了。例如“TX OOB and PCIe”、“SATA OOB”等就不阐述了,目前我不会。
5.3.1 发送缓冲(跨时钟域)
如下图是时钟域的划分,在发送端的PCS子层里面有两个并行时钟域,分别是PMA相连的并行时钟(XCLK)和TXUSRCLK时钟,如下图所示。为了保证数据传输速率一致,XCLK必须和TXUSERCLK时钟的速率匹配,并且要解决2个时钟域之间的相位差异。利用TX BUFFER介于XCLK和TXUSERCLK俩时钟域之间,用于匹配两者的速率和相位偏差。
根据上图我们可以看出,这个TX BUFFER是可以旁路掉的,就是配置选项卡里面这个选项,如果不使能缓冲,可以采用相位对齐的方式,我们可以看到在不勾选“Enable TX Buffer”时候,可以选择时钟源和旁路模式,具体可以看ug482.
对于我等入门选手还是选择使能吧,界面如下还可以确定TXOUTCLK时钟源。建议打勾
此外,关于TX BUFFER还有一个表示状态的信号——TXBUFSTATUS,这是一个可选端口,具体含义如下表所示:
端口 |
方向 |
时钟域 |
描述 |
TXBUFSTATUS [1:0] |
Out |
TXUSRCLK2 |
TX缓冲状态。 TXBUFSTATUS [1]:TX缓冲区溢出或下溢状态。当TXBUFSTATUS [1]设置为高电平时,它将保持高电平,直到TX缓冲区复位。 1:TX FIFO发生上溢或下溢。 0:无TX FIFO溢出或下溢错误。 TXBUFSTATUS [0]:TX缓冲区充满度。 1:TX FIFO至少半满。 0:TX FIFO小于半满。 |
只要TXBUFSTATUS指示上溢或下溢情况,就应复位TX缓冲区。当TXBUF_RESET_ON_RATE_CHANGE = TRUE时,可以使用GTTXRESET,TXPCSRESET或GTP收发器在内部生成的TX缓冲器复位速率变化来复位TX缓冲器。GTTXRESET的断言触发一个序列,该序列重置GTP收发器的整个发送器。
5.3.2 发送缓冲旁路模式
旁路TX BUFFER是7系列GTP收发器的高级功能。TX相位对准电路用于调整PISO并行时钟域和TX XCLK域之间的相位差,以将数据从PCS传输到PISO。它还通过连续调节TXUSRCLK来执行TX延迟校准,以补偿温度和电压变化。组合的TX相位和延迟对准必须由用户手动控制。具体描述在需要的时候再看吧。现在看了也记不住。
5.3.3 PRBS 伪随机序列码
伪随机序列(Pseudo-random bit sequences,PRBS)是一种貌似随机,实际上是有规律的周期性二进制序列,具有良好的随机性和接近于白噪声的相关函数。这些特性使得伪随机序广泛应用于误码率测量、演示测量、噪声发生器、通信加密和扩频通信等领域。在高速设计中为了测量高速串行通信通道传输的误码率,通常通过发送PRBS码来进行检测。
关于PRBS的随机特性。在PRBS码流中,二进制数“0”和“1”是随机出现的,但是它又和真正意义上的随机码不同,这种“随机”特性只是局部的,即在周期内容部,但各个周期中的码流却是完全相同的,所以称其为“伪随机码”。PRBS码的周期长度与其阶数有关,常用的阶数有7、9、11、15、20、23、31,也就是常说的PRBS7、PRBS9、……。这些配置是通过选项卡的这些端口实现的,如下图所示。事先配置好阶数,发送端编码,接收端解码,完成了校验。
5.3.4 发送端的极性控制
这个很好理解嘛,就是对从PSC子层输出的编码数据,在发送端的串行化处理之前进行极性翻转。极性翻转只须将TXPOLARITY接口信号置位“1”即可。为啥要设置这个功能呢?为了兼容不同板卡间极性的不同或是PCB搞错的了情况。这也是个可选端口