上节内容讲解了8b/10b的原理,同时也讲解了8b/10b中控制字符(如逗号comma)的特殊性。鉴于8b/10b编码的优良特性,因此在PCS(Physical Coding Sublayer)子层编码中我们将采用8b/10b编码。其它的编码方式我们会在其它章节中介绍。
1. 利用8b/10b编码进行数据帧结构设计
在前几节内容中我们探讨比较多的内容是在数据帧的设计中如何设计同步字,在数据接收的过程中方便捕获同步字以便利用同步字实现帧同步。例如在发送端使用Preamble+SFD 的方式,可以成功的在接收端捕获该同步字,达到帧同步的目的;但是这种方式也有我们不可回避的缺点,就是在数据的部分如果出现了和Preamble+SFD一样区域,将会破坏同步字的捕获,甚至将错误数据提交到协议层的上层,引起连锁错误反应,如图1所示。

图1
图1中,如果数据区域出现同步字,很可能会破坏真正同步字的捕获。当然针对这种情况也是有办法处理的,如加帧校验(FCS,frame check sequence)等处理措施,但总是要付出一定代价的,如采用CRC32检查帧错误,数据包丢弃,二次或多次同步,以及丢弃的数据包如何重传等一系列措施。那么8b/10b同步效果如何呢?
首先在8b/10b的原理分析时我们得到一个结论,8b/10b编码在串行流中,数据部分不会出现连续的5个1或5个0,而控制字符中的逗号(Comma)是有意安排了连续5个0或5个1,这就在数据流中出现了惟一性。图2显示了Comma编码的特殊性,我们可以根据Comma的特点安排数据帧的同步字及帧结构。

图2 Comma编码的特殊性
注: Comma是指 K.28.1,K.28.5,K.28.7. 但K.28.7与 K.28.1,K.28.5的码距只有一个bit,一旦出错将无法识别,所以逗号在使用中相对复杂,较为简单的编码中一般不用。复杂的应用可以参照CPRI协议的10G网通信帧结构。
在8b/10b的编码中一般采用推荐K.28.5作为帧起始同步字(START ), K.28.1作为帧结束同步字(END)。本工程也将采用推荐的格式设计PCS的帧结构,如图2所示。

图3 8b/10b帧结构
图3是高速串行通信中利用8b/10b封装的PCS层的帧结构,实现这一部分,就完成了本工程的物理层设计与实现。其它的PCS帧结构设计可以参照64b/66b,加扰/解扰实现PCS层的相关内容。高速串行通信中利用8b/10b封装的PCS层的帧结构的代码部分按照下面的步骤逐步实现。
2. 8b/10b PCS层程序设计
-
8b/10b做同步字
由于引进8b/10b编码,可以使用K28.5帧起始,K28.1作为帧结束,因此原帧同步设计中的Preamble + SFD的结构不再作为同步字使用,但是如果做以太网数据的组包,拆包,包转发等,为了与MAC层兼容,可以继续保留Preamble + SFD。如果不是以太网络的开发,也可删除Preamble + SFD部分,根据项目的需要决定。
- 发送端PCS子层可以直接使用8b/10b编码实现K28.5和K28.1的变换,将变换后的10-bit数据送给PMA(移位寄存器)。
- 接收端由于过采样在同步字捕获时建议直接捕获K28.5的10-bit码字,因为8b/10b编码中10b表达的K28.5的码字惟一(见8b/10b编码中逗号的描述)。
- 本阶段为了简化设计,FCS部分暂时不实现,留到后续章节添加。
- 由于使用K28.5和K28.1 作为起始和结束标志,因此收发双方不再需要约定数据包的长度,也不需要在数据链路层添加有效数据长度字段(这是线路编码8b/10b的特点),正像网络通信的MAC层不需要包长字段一样。
思考题:以太网的MAC层没有包长字段,是如何在接收时确定包长的(即确保MAC层包的完整性)?
- 空闲(IDLE)时间段依然采用1010…10…的方式改善信道的直流平衡和时钟信息。
- 在应用程序(APP)中做好握手,由于采用仿真验证这里的应用程序工程的正确性,这里由tb_8b10b.v 实现应用程序的功能。
- 本工程分层示意图,如图4所示。

图4
之后的工程都按照这个结构来重新设计。