本文转载自:十年老鸟的CSDN博客
接口协议
前面的文章基本都在讲transceiver里面的内部结构,这篇文章主要讲transceiver与用户逻辑数据的接口,也就是要如何使用transceiver发过来的数据。
与用户逻辑的接口与传输过程中使用的编码有关,有两种编码方式:
1、8B/10B
2、64B/66B
以及
3、NONE
就是直接传输裸的数据,当然这个数据需要提前做好随机序列化,也就是大部分工作通过自己写逻辑完成
在IP核中有如下选项相关
在实际使用场景中:
JESD204B使用的是8B/10B编码
JESD204C、某些CPRI协议使用的是64B/66B编码。
尽管在IP选项卡中Encoding的选项卡存在
1、 NONE
2、 NONE(MSB First)
3、 8B/10B
4、 64B/66B with Int Seq Ctr
5、 64B/66B with Ext Seq Ctr
6、 64B/67B with Int Seq Ctr
7、 64B/67B with Ext Seq Ctr
这些选项。因为在大部分情况下,我使用的场景都是64B/66B编码的。因此,本文只会对64B/66B编码的用户接口进行阐述。
TX Gearbox
64B/66B编码的选项又有两个
1、 64B/66B with Int Seq Ctr
2、 64B/66B with Ext Seq Ctr
对应的是TX Gearbox的操作模式。
外部序列计数操作模式(64B/66B with Ext Seq Ctr)需要用用户逻辑来实现,64B/66B with Int Seq Ctr使用内部序列计数。但内部序列计数模式在GTH transceiver是不支持的。因此为了代码上进行统一,所有的设计都是使用的64B/66B with Ext Seq Ctr。
以这个具体配置来说明
在这种模式下,用户接口包括
TXDATA[63:0]
TXHEARDER[2:0], [2] = 0
TXSEQUENCE[6:0] [6] = 0
使用64B/66B的时候,TXHEARDER[2] = 0, TXSEQUENCE[6] = 0
TXHEARDER[1:0] 只能为2’b01或者2‘b10
TXSEQUENCE[5:0] = 0-32,且32的时候表示当前的TXDATA无效。
例程中的模块框图如下图所示:
RX Gearbox
RX Gearbox的处理方式都是一样的,无论对端TX Gerabox选的是64B/66B with Int Seq Ctr还是64B/66B with Ext Seq Ctr。
接收都是使用下面这些端口
RXDATA
RXHEARDER
RXDATAOUTVALID
RXHEADEROUTVALID
RXGEARBOXSLIP
RX gearbox内部管理所有的顺序计数,这点不同于TX gearbox分为外部或者内部计数。
时序图与TX也比较类似:
RX与TX不同的另一个地方在于,还需要进行块同步。也就是要对66B的head进行识别,因为数据是串化过来的,过来的时候并不知道哪2bit是head,哪64bit是data。需要利用RXGEARBOXSLIP不停的进行滑动。
example程序没有去细看大致意思就是,对head_in进行检测,如果连续64个内容都是1或者2,则说明已经找到了head。否则,需要进行滑动,然后接着判断,最多也就滑动个65次那肯定能找到head了,也就能够块同步了。
例程中的模块框图以及用户逻辑接口如下图所示: