参考搬运:
https://mp.weixin.qq.com/s/ZSNyjpZpimjyxyO9riIRNQ
Aurora 64B/66B (xilinx.com)
https://docs.amd.com/r/en-US/pg074-aurora-64b66b
8/10:SATA SRIO
64/66:10G以太网
值得注意:
64b/66b 编码在多LANE模式下,EOF(T)仅在一个LANE上出现;
介绍
8B10B的开销比较大,每传输10位数据,就需要发送2位无效数据。
为了减小8B10B编码的开销,同时保留编码方案的优点,提出了64B66B编码。
64B66B编码与8B10B编码方式有本质区别,8B10B编码可以从码表中获取一个数据编码结果,而64B66B在发送前需要通过白噪声对数据加扰,在接收数据时也要先对数据解扰。
用户在实际使用时,GTX的64B66B编码会比8B10B更简单,因为64B66B会提供控制帧和数据帧,相比8B10B会简单一点点。
64B66B编码原理
下图是万兆网的数据编码框图,将两个32位的TXD数据拼接为64位,
然后经过加扰(Scrambling)来保证零一均衡,避免直流失调和时钟恢复困难。
之后在64位数据之前加入2位的同步头(Sync header),用来指示后面的64位数据是数据帧还是控制帧,
用户每发送64位数据,高速收发器需要传输64位数据和2位同步头。
变速器(Gearbox)可以看成一个深度为64位的存储器,
每个用户时钟输入64位数据,高速收发器在一个用户时钟内也只能发送64位编码后的数据,就会导致每个时钟会有2位数据没有被发送,暂存在变速器(Gearbox)。
经过32个时钟后,变速器(Gearbox)就会存满64位数据,用户下个时钟周期需要暂停输入数据,高速收发器在下个时钟将变速器(Gearbox)的64位数据发送,之后用户就可以继续输入需要发送的数据了,就这样循环往复。
编码过程是由加扰器(Scrambling)完成的,因此相同的数据经过加扰后会得到不同的数据,编码后的数据是不能预测的。
2位同步头有两个作用,可以用来指示帧类型,接收端也可以根据同步头来实现数据对齐,
同步头只有2’b01和2’b10两种取值,其余两种为无效取值。
01类型是需要全部加扰的,而10类型的TYPE部分则是不需要加扰的,因为涉及了一些指示字符;
当同步头为2’b01时,表示后面的64位数据是纯数据,不包含任何控制字符,如下图所示。
图2 纯数据帧格式
如果同步头为2’b10,则表示后面的64位数据是控制帧,可能是起始帧,也可能是结束帧,
如下图所示,注意同步码后面的第一字节数据表示控制帧的类型,根据该数据的值确定该帧数据内容。
下图是上面几种帧的一些格式,
D表示数据,C表示空闲字符(7位数据)或控制字符Z,
S表示帧起始字符,T表示帧结束字符。
其中当同步码为2’b01时,8字节全部为数据。
64B66B编码的起始帧有两种格式,
一种是起始位位于第一个字节,对应的类型字符为8’h78,
另一种是起始位位于第五字节,对应的类型字符为8’h33。
但是控制字符的具体数值可能不需要关心,因为不同协议之间是有差异的;
黄色部分是无效区,填充0;
RS Trans指的是RS(协调子层)发送的数据,D Z T S E均是其中的标识符;
D 数据
Z 空闲
T 结束
S 起始
E 控制
因为控制字符都是七位的,所以需要补0;每有一个数据字符,就可以少补充一个0;
夹带控制字符的帧最多只能传递7个字节的D;
由于用户每次可以传输任意字节数据,导致停止位可能出现在数据的任何字节,因此结束帧会有8种类型,类型字符不相同,接收端可以根据结束帧的类型判断这帧有多少有效数据。
下表是这些控制字符的具体取值,比如起始位S的取值是8’hfb,停止位T的取值是8’hfd,空闲字符C为8’h07。
在不同的TYPE类型下,空闲字符C的填充是可能不同的;
IDLE类型下填充的是7'h0,
ERROR类型下填充的是7'h1e,
开始和结束字符填充的字符根据具体的类型来决定,这是因为
开始类型的包有两种,而结束的有8种;
加扰
加扰和解扰一般使用的表达式为X^58+X^19+1,这部分内容可以在后续的示例工程中直接获取,也比较简单,实现方式与M序列类似。
GTX的64B66B编码发送原理
GTX内部不能对待发送数据加扰,也不能对接收的数据解扰,需要用户在FPGA逻辑中自己完成加扰和解扰。
由下图可知,8B10B经过蓝色走线后到达FIFO,而64B66B编码只经过了一个TX Gearbox,并没有经过什么编码模块,因此加扰和解扰相关操作需要用户在IP外部自己完成。
TX Gearbox的作用就是前文所说的变速器,工作方式如下图所示,
如果用户数据位宽设置成32位,并且PCS每次也只能传输32位数据,两个时钟才能发送一个64位数据。
因此需要两个时钟用户才能发送64位数据,
第一个时钟向GTX发送2位同步码和32位数据,变速箱先发送2位同步码和高30位数据,第2位数据留在TX Gearbox中。
第二个时钟用户发送剩余32位数据,TX Gearbox需要先把上个时钟剩余2位数据发送,然后发送本次接收的高30位数据,最后还是会剩余2位数据。
因此每经过2个时钟,TX Gearbox中就会增加2位数据,
当经过64个时钟后,TX Gearbox中存在64位数据,与一个用户数据位宽一致。
后两个时钟周期用户不能往GTX发送数据,TX Gearbox会将内部64位数据发送出去,完成清空。
在使用64B66B编码时,一般用户端口位宽使用64位,会更方便,原理都是一样的。
所以本质上是66个周期发送64个64位数据+2x64位gearbox,其中用户直接使用的是前64个。
gearbox显然具有计数器,使用计数器来标记何时将其中的数据取出;
这个计数器可以使用内部的也可以使用外部的,这个设置在GT收发器中是可以修改的;
外部计数器需要用户提供和数据调控;
在GT后面的版本里内部计数器被版本迭代取消,推荐使用外部计数器;
如果把用户数据带宽设置成64,这种情况下GTX内部的数据带宽只有32,我觉得会出现之前描述的USERCLK是USERCLK2两倍频率的情况;(确实如此,在SUMMARY中可以看到)