陈锋
(中国兵器工业集团 第 214研究所 江 苏 苏 州 2 15163)
随着通信技术的发展,在复杂的电磁环境下正确传输数据受到人们的关注,因此性能优异的光纤通讯越来越受到青睐,而误码率要满足设计需求,关键在于串行传输数据所选用的编码方法。
8B/10B编解码技术是主流传输标准的编解码技术之一,广泛应用于高速串行标准中,例如光纤通道1、PCI-Express、串行ATA、1394b等。8B/10B编解码技术设定传输数据流拥有连续“1”或连续“0”不能超过5个,保证传输的直流成分接近0,基线漂移减至最小,避免因接收端时钟漂移或同步丢失而引起数据丢失。8B/10B编码方法具有DC补偿功能,能够保证链路中不随着时间推移而出现DC偏移。这使得信号的转换不会因电压位阶的关系造成信号错误。8B/10B编码采用冗余方式,将8位的数据和一些特殊字符按照特定的规则编码成10位的数据,根据这些规则,能检测出传输过程中发生错误的信息。通过以上各种措施,8B/10B编码方式能够确保数据在高速传输过程中正确传送和识别。
因此这里提出一种利用FPGA实现8B/10B编解码系统设计方案。
该系统是基于FPGA设计的8B/10B编解码器,首先系统接收外部发送的8B并行数据,在8B/10B编码模块中完成编码后,再通过10B数据并串转换模块生成利于传输的10B串行信号。这样8B/10B编码模块和10B并串转换模块构成8B/10B编码器。编码端发送的10B串行信号经过传输线路传输后被10B数据串并行转换模块所接收,转换完成的10B并行数据再通过10B/8B解码模块解码完成后即是还原后的原始数据。这样10B串行数据到10B并行数据转换模块和10B/8B解码模块就构成了10B/8B解码器[1]。图1为系统设计框图。
图1 系统设计框图
8B/10B编解码器通常有两种设计方法:一种是用查找表直接将8位信号映射成10位信号,该方法是采用存储器存储所有可能出现的码组,再将输入码组转换为存储地址,找出对应的编解码。这种方法逻辑简单,开发时间很短;另一种是通过逻辑运算直接实现编解码功能,其优点是明显减小内部使用面积,但逻辑关系复杂。从系统优化考虑把1节8 bit字节拆分成3 bit和5 bit,然后在极性偏差RD(running disparity)控制器的控制下以并列方式编解码。这种方法的组合逻辑实现可以简化码表,减小电路板的面积,有效提高编码工作速度,同时由于电路板的面积减小,功耗显著降低。这里采用第1种方法,同时结合第2种方法的设计思路[2]。
8B/10B编码模块是整个系统主体部分之一,该模块在逻辑上又分成3B/4B编码模块、5B/6B编码模块、RD控制模块等3部分,如图2所示。
图2 编码模块逻辑框图
编码器首先将接收到的8B数据分成3 bit和5 bit两部分,然后分别编码成4 bit和6 bit,编码完成的4 bit和6 bit再按顺序组合成10B码。整个系统首先将3 bit编码成4 bit,RD控制器读出4 bit数据的RD值,然后反馈控制5B/6B编码模块选择合适的编码。最终RD控制器判断10B数据的RD值,若满足要求则输出,否则将报错。系统采用的编码列表主要包括以下4种编码:
1)“1”和“0”相邻的完美平衡代码例如,通过查找3B到4B(简称3B/4B表)与5B到6B编码表(简称5B/6B表)[3]可知,如编码 “1001”与编码 “010101”,该类编码的RD值为0而且与其他任何形式的代码组合都不会出现RD值超过±2或者连续的“0”“1”超过3个的情况,所以该类代码采用一对一的关系。
2)“1”和“0”有间隔的完美平衡代码例如,3B/4B表的编码-3“1100”和“0011”与5B/6B表编码-7“111000”和“000111”,该类编码的RD值为0,与其他代码组合不会出现RD值超过±2的情况,但是会出现过多的连续“0”“1”的情况。所以该类代码采用一对二的关系。例如5B/6B表的编码-7,如果采用“111000”和4B码末位为“1”的代码组合就会出现连续的“1”超过3的情况,此时就应该采用“000111”来避免该情况的发生。
3)“1”和“0”有间隔的不平衡代码例如3B/4B表的编码4-“0100”和“1011”、“0010”和“1101”,5B到6B编码表的编码4-“110101”和“001010”,该类编码的RD值是+2或者-2,与其他代码组合有可能出现RD值为±4的情况,所以该类代码也采用一对二的关系。例如5B/6B表的编码4,如果与RD值为+2的4B代码组合时就采用RD值为-2的“001010”代码,反之与RD值为-2的4B代码组合时就采用RD值为+2的“110101”代码。如果与RD值为0的代码组合时就随意采用一个代码即可。
4)3个连续“1”或“0”的不平衡代码例如3B/4B表的编码7-“0001”“1110”“1000”“0111”,该类代码与其他代码组合时的RD值问题同于第三类代码的处理方法,为了防止更多连续“1”或“0”出现,提供了4种代码选择,结合具体情况特殊考虑。
通过上述对编码代码列表的讨论,不难看出在实际的程序设计中需要避免如下3种情况出现:RD值为+2的4B代码和RD值为+2的6B代码组合;RD值为-2的4B代码和RD值为-2的6B代码组合;连续4个或4个以上的“0”“1”的代码。前两种情况可通过代码分组4B和6B代码,轮流选择6B和4B代码的方法,该方法可以通过状态机实现。程序流程如图3所示。
图3 8B/10B编码模块流程
该模块主要完成10B并行数据到10B串行数据的转换功能,10B串行数据的数据格式为:1 bit低电平起始位、10 bit数据位、1 bit高电平停止位、2 bit高电平数据空码。生成一个完整的10B串行数据包含4个状态,生成起始位、转换10 bit数据位、生成停止位、生成数据空码。
该模块主要完成10B串行信号到10B并行信号的转换,10B信号的串并转换模块主要是要从14 bit的串行信号中挑出10 bit的有效数据位,过程中首先要判断起始位(而不是任意一个低电平),然后采集10 bit的有效数据位,完成后等待下一个起始位。程序同样是通过状态机来实现整个过程的流通。
解码模块根据系统要求可分为6B/5B解码模块、4B/3B解码模块和误码检测模块。解码模块相对编码模块而言逻辑过程要简单的多,该模块首先将10 bit信号分割成4 bit和6 bit两部分(高低位必须和编码端对应),然后4 bit和6 bit数据根据编码列表分别解码成3 bit和5 bit,在解码过程中判断是否有误码产生有则报错,无则并行输出[4]。图4给出了10B/8B解码模块的逻辑框图和程序设计流程如图4所示。
图410B/8B解码模块逻辑框图和程序流程
待完成整套的8B/10B编解码器模块连接后,对整体程序进行仿真验证,其结果如图5所示,其中clk1为编码和解码模块的时钟引脚,clk2为10B串并转换和10B并串转换模块的时钟引脚,rst为整个系统的异步复位引脚,datin[7..0]为待传输的8 bit并行数据,datout[7..0]为传输完成的8 bit并行数据,error为解码端误码检测报警引脚,wrong为编码端出错报警引脚。还有3个引脚是系统不必要的但是为方便调试而引出的,out1[9..0]为10B串并转换完成的10B并行信号,out3为10B并串转换完成的10B串行信号,out2[9..0]为8B/10B编码完成的10B并行信号[5]。
图5 整个系统波形仿真图
由图5可看出:输入数据datin为“10101110”,经过8B/10B编码完成的数据out2为“0111001010”,8B/10B编码模块出错报警引脚为“0”,10B并串转换输出的串行数据out3为“00111001010111”,10B串并转换输出的并行数据out1为“0111001010”,10B/8B解码完成的输出数据 datout为“10101110”,结合整个系统的工作过程和编码列表不难看出系统正确的完成了编码和解码的功能,能满足设计任务的需要。
本文提出一种利用FPGA实现8B/10B编码和10B/8B解码设计的方法,介绍了8B/10B编解码技术,实现了8B/10B的正常编解码和接口串并、并串转换的设计,在FPGA的控制下能实现数据的传输,满足了实际设备中所提出的要求。
[1]徐士良.计算机常用算法[M].北京:清华大学出版社,1992:137.
[2]王昕,汪至中.高速电路设计中的终端匹配技术[J].北方交通大学学报,2002(4):43-46.
[3]叶雷.朱红8B/10B编解码的IP核设计[J].电子设计工程,2005(11):19-22.
[4]李威.多路信号复接光纤传输系统及ASI与SPI接口的设计与实现[D].成都:电子科技大学,2004.
[5]陈孟杰,于海勋.光纤通道8B-10B编解码模块设计[J].工业技术,2007(9):53-56.
[6]李宥谋.8B/10B编码器的设计及实现[J].电视技术,2005(6):37-40.