8B10B编码器的设计及实现.docx
《8B10B编码器的设计及实现.docx》由会员分享,可在线阅读,更多相关《8B10B编码器的设计及实现.docx(18页珍藏版)》请在冰豆网上搜索。
8B10B编码器的设计及实现
8B/10B编码器的设计及实现
摘 要:
本文介绍了8B/10B编码技术,提出了一种简单、实用的8B/10B编码器的实现方法,并且采
用Verilog语言设计了一种通用的软核。
通过在FPGA器件上进行测试,电路稳定、可靠,可直接嵌
入到需要8B/10B编码功能的收发器电路中。
关键词:
串行数据传输;8B/10B编码;极性偏差(RD);Verilog语言
中图分类号:
TN919.3;TN762 文献标识码:
A
DesignandRealizationofan8B/10BEncoder
LIYou-mou
(ASICDesignCenter,Xi’anInstituteofPostsandTelecommunications,Xi’an710061,China)
Abstract:
Thispaperintroduces8B/10Bencodingtechnique,andputsforwardasimpleandpracticalreal-
izationmethodofan8B/10Bencoder.Furthermore,aversatilesoft-coredesignedwithVerilogispresen-
ted.ItistestedtobestableandreliablebyFPGAdevices,andcanbedirectlyembeddedintransceiver
circuitwith8B/10Bencodingfunction.
Keywords:
Serialdatatransmission;8B/10Bencoding;Rrunningdisparity(RD);Veriloglanguage
一、引 言
在高速的串行数据传输中,传送的数据被编码
成自同步的数据流,就是将数据和时钟组合成单一
的信号进行传送,使得接收方能容易准确地将数据
和时钟分离,而且要达到令人满意的误码率,其关键
技术在于串行传输中数据的编码方法。
目前大多数
高速串行标准都采用8B/10B编码方案,例如光纤
通道1、PCI-Express、串行ATA、以太网、XAUI、In-
finiBand和串行相连SCSI等。
使用8B/10B编码技
术,较好地解决了以下问题。
(1)转换密度:
保证数据流中有足够的信号转
换。
采用8B/10B编码方法,数据流中连续的“1”或
连续的“0”不超过5个,使接收端锁相环(PLL)能正
常工作,避免接收端时钟漂移或同步丢失而引起数
据丢失。
(2)DC补偿:
在高速的数据传输线路中,一般
采用差分信号,需要直流分量尽量小,而8B/10B有
DC补偿功能,即链路中不会随着时间推移而出现
DC偏移。
(3)检错:
8B/10B编码采用冗余方式,将8位
的数据和一些特殊字符按照特定的规则编码成10
位的数据,根据这些规则,能检测出传输过程中发生
错误的信息。
(4)特殊字符:
8B/10B编码规定了一些特殊字
符,可用作帧同步字符和其他的分隔符或控制字符。
8B/10B编码是由IBM公司开发,把8位数据
字节转换成串行传输使用的10位码。
8B/10B编码
保证了1和0的相对平衡组合,而与数据值无关,简
化了时钟恢复,降低了接收机成本。
编码提供的其
26
*收稿日期:
2004-12-25
基金项目:
国家863计划项目(2003AA1Z1190);国家自然科学基金资助项目(90207015) 2005年第6期基金项目论文FOUNDATIONSUPPORTEDPROJECT
它位还促进了误码检测。
8B/10B编码提供了构建
串行通信使用的一套基础数据和控制字符。
许多独
立标准都以这个公共字符集为基础,定义更高的协
议层。
二、8B/10B编码技术
将8bit数据分成3bit和5bit两组,分别对应
10bit中的4bit和6bit,直流平衡代码的不平衡度
就是通过“0”的个数减去“1”的个数来计算得到的。
如果4bit和6bit的各分组中“0”和“1”的个数相
等,称为完美平衡代码,或称为完美的直流平衡代
码,无需补偿,但是这种情况是不可能的。
因为在4
bit的子分组中,16种编码中只有6种是完美平衡
的,这对于3bit的8种编码值是不够的。
同时,在6
bit的子分组中也只有20种编码是完美平衡的,对
于5bit的32种编码值也是不够的。
由于4bit和6
bit的两个子分组都是偶数个位数,而不平衡度不可
能是“+1”或“-1”,因此,在8B/10B编码方案中
还要使用不平衡度为“+2”和“-2”的值。
在编码
过程中,用一个极性偏差(runningdisparity,RD)参
数表示不平衡度,在不平衡时用2个10bit字符表
示一个8位字符,其中一个称为RD-,表示“1”的
个数比“0”的个数多2个,另一个称为RD+,表示
“0”的个数比“1”的个数多2个。
8B/10B编码方法是把8bit代码组合编码成10
bit代码,代码组合包含256个数据字符编码和12
个控制字符编码,分别记为Dx.y和Kx.y。
8B/10B编码方案是把8bit数据分成2个子分
组:
3个最高有效位(y)和5个最低有效位(x)。
代
码字按顺序排列,从最高有效位到最低有效位分别
记为H、G、F和E、D、C、B、A。
3bit的子分组编码成
4bit,记为j、h、g、f;5bit的子分组编码成6bit,记为
i、e、d、c、b、a,其映射关系如图1所示,4bit和6bit
的子分组再组合成10bit的编码值。
图1 8B/10B编码映射关系
表1列出了3bit编码成4bit和5bit编码成6
bit的代码值,在3bit到4bit的编码中,编码1、2、
5、6使用了“1”和“0”相邻的完美平衡代码,编码采
用一对一的关系;编码3使用了“1”和“0”有间隔的
完美平衡代码,编码采用一对二的关系;编码0和4
使用了“1”和“0”有间隔的不平衡代码,编码也采用
一对二的关系;编码7使用了3个连续“1”或“0”的
不平衡代码,为了防止更多连续“1”或“0”出现,提
供了4种代码选择。
在4bit到6bit编码中,有19
个编码RD-和RD+代码相同,编码7的RD-是
111000,而RD+是000111。
其余12个不平衡代码
的RD-编码值包含4个“1”,而RD-编码值包含4
个“0”。
8B/10B编码规则将4bit和6bit组合,使
其最坏的情况下10bit代码值的不平衡度为“+2”
或“-2”,例如:
不平衡度为“+2”的4bit编码值是
不会和不平衡度为“+2”的6bit编码值组合在一起
的,因为那样会产生一个不平衡度为“+4”的10bit
的编码值。
表1 8B/10B子分组的编码表
3bit到4bit的编码
3bit的十进制3bit的(HGF)4bit的(fghi)
00000100或1011
10011001
20100101
30110011或1100
41000010或1101
51011010
61100110
71110001或1110或
1000或0111
5bit到6bit的编码
5bit的十进制5bit的二进制
(EDCBA)
6bit的二进制
(abcdei)
000000100111或011000
100001011101或100010
200010101101或010010
300011110001
400100110101或001010
27 2005年第6期基金项目论文FOUNDATIONSUPPORTEDPROJECT
28 2005年第6期基金项目论文FOUNDATIONSUPPORTEDPROJECT
编码器初始状态的一般取负极性偏差值
(RD-),如果当前极性偏差为RD-,则编码器会在
RD-栏选择8bit数据的对应值输出;同时检测10
bit的编码值是否为完美平衡代码,如果是完美平衡
代码,那么极性偏差值(RD-)不改变,否则,改变极
性偏差值RD-值为RD+值。
同样地,如果当前的
极性偏差为正(RD+),编码器选择RD+栏的对应
值;如果被选择10bit编码是一个完美平衡代码,那
么极性偏差的值将保持(RD+)不变,否则,极性偏
差值改变成RD-。
这样交替地使用RD-栏和RD
+栏的值,使得差分信号的直流分量尽量小。
图2
描述了RD极性偏差状态转移的计算过程。
图2 极性偏差值RD状态转移
如果传输中发生了错误,在接收端会出现2种
情况,一种是接收的10bit字符是一个无效字符,另
一种是一个有效字符,但极性偏差RD是违规的。
例如某一时刻发送端发送的字符串为RD-,发送
D21.1字符,编码1010101001;由于“1”和“0”个数
相等,因此RD不变,仍为RD-,接着发送D10.2字
符,编码0101010101;“1”和“0”个数仍然相等,因
此RD不变,继续为RD-,接着再发送D23.5字符,
编码1110101010,由于“1”比“0”个数多2个,因此
改变RD值为RD+;在传输过程中发生了一个比特
错误,接收端收到的字符串为1010101011、010101
0101、1110101010,译码后为RD-,字符为D21.0,
下一个为RD+,字符为D10.2,接着下一个出现RD
值的违规,即在RD值为RD+时下一个字符串中
“1”和“0”的个数只能是相等或者“1”比“0”的个数
少,否则就是违规的。
三、8B/10B编码器的设计
由于8B/10B编码器用于高速串行发送器中,
一般采用硬件电路实现,实现方法可以使用逻辑电
路或查找表,至于采用何种方法,要根据8B/10B编
码规则确定。
如果完全采用查找表法,那么需要
256个数据和12个特殊字符共268个单元,每个单
元有20位,其中10位是RD-,另10位是RD+。
如果采用逻辑电路直接实现8B到10B编码,则电路
复杂,难度大。
因此寻址一种高效8B到10B编码方
法,是8B/10B编码器的关键。
依据8B/10B编码规则,对8B/10B的编码表进
行分析,可以将8B到10B编码分解成3部分,以简
化电路:
特殊字符的编码,5bit到6bit编码,将4bit
和6bit组合成10bit。
特殊字符的编码有12种,每一种特殊字符
RD-和RD+对应的10bit编码不同,但码值互为反
码。
如表2中的K28.3字符,RD-对应10bit是
0011110011,RD+对应10bit是1100001100,两组
10bit对应位的“1”和“0”相反。
12种特殊字符编
码中K28.0、K28.4、K28.7、K23.7、K27.7、K29.7和
K30.7是完美平衡代码,其余6种是不平衡代码。
可以采用12个ROM单元实现,每个单元11位,其
中10位是特殊字符编码,一位是代码完美平衡标
志。
5bit到6bit编码有32种,在6bit完美平衡的
代码中,只有一种(编码7)RD-和RD+对应的6
bit编码不同,其余均相同;而在6bit不平衡的代码
中,RD-的6bit中有4个“1”和2个“0”,并且RD+
对应的6bit编码是RD-的反码,因此可以用32个
ROM单元实现。
每个单元7位,其中6位是编码
值,一位是完美平衡代码标志。
将4bit和6bit组合成10bit,6bit对应的32个
RD-和RD+值在所有的8组中是相同的,只是选
择不同的4bit值,以满足极性偏差不大于2和连续
“1”个数或连续“0”个数不大于5的要求,在3bit到
4bit的编码中,完美平衡编码:
编码1是1001,2是
0101,5是1010,6是0110,它们的RD-和RD+相
同,而3号的RD-和RD+要根据6bit值选择是
1100还是0011。
编码0和4各有2个编码,RD+和
RD-选择哪一个要根据6bit值确定,编码7有4个
编码值,RD+和RD-选择哪一个要根据6bit中
“1”的个数和低两位数值确定。
如表2所示,在组合
成10bit时,6bit所有代码和4bit完美平衡代码的
RD-和RD+列是确定的,只有4bit的不平衡代码,
要根据6bit的值来确定。
29 2005年第6期基金项目论文FOUNDATIONSUPPORTEDPROJECT
将8B/10B编码划分为3个模块实现,较好地反
映了8B/10B编码的特点,实现流程清楚,容易编写
代码。
实现步骤:
①判断是特殊字符还是数据;②若
是特殊字符,根据RD极性直接取值;③若是数据,
根据RD极性确定6bit的取值;④根据6bit编码值
确定4bit的编码取值。
四、用Verilog语言实现
8B/10B编码
Verilog语言是被广泛采用的HDL语言,本文使
用该语言编写8B/10B编码器程序,编码器的端口
由4种信号dtin、Dtout、Clk和Reset组成,dtin信号
有10个比特位,低8位是8B数据,高两位是控制位
dt[9:
8],控制位的4种情况分别为,dt[9:
8]=2’
b00时,正常编码,dt[7:
0]是8B数据,编码按照RD
极性所对应的列取值;dt[9:
8]=2’b01时,插入错
误RD极性编码,dt[7:
0]是8B数据,按照RD相反
极性所对应的列取值。
dt[9:
8]2’10时,插入特殊
字符,dt[7:
0]是特殊控制字符的编号,在特殊字符
编码对应行,按照RD极性所对应的列取值;dt[9:
8]=2’b11时,编码器RD极性控制,当dt[7:
0]=
8’b00100011时,下一个RD极性是“RD-”,当dt
[7:
0]=8’b10100011时,下一个RD极性是
“RD+”。
Dtout信号是编码后的输出值,有10个比特位;
Clk引脚是时钟信号;Reset引脚是复位信号。
在8B/10B的编码过程中,RD极性的初始值设
为RD-,而在任何时刻可以通过插入RD极性控制
改变RD极性,或插入错误RD极性编码,产生一个
或多个极性违规的编码。
//8b/10b编码器程序代码
moduleencode-8b10b(dtin,dtout,clk,reset);
input[9:
0]dtin;
output[9:
0]dtout;
inputclk;
inputreset;
wire[9:
0]dtout;
//局部变量
regrd-flg,rd-buf;//RD极性标志,0表示为RD-,1
表示为RD+
reg[10:
0]k-temp;//特殊字符编码中间变量
reg[9:
0]d-code;//数据字符编码中间变量
reg[6:
0]d6b-temp;//5B到6B码表的中间变量
wirerd-temp,rd-st;//RD极性标志,0为RD-,1为
RD+
initialrd-flg=0;//RD极性初值为RD-
assignrd-st=(dtin[9]&dtin[8]&dtin[7])1//RD
极性控制
:
((dtin[9]&dtin[8]&~dtin[7])0:
rd-flg);
assignrd-temp=(dtin[8]&~dtin[9])~rd-st:
rd-
st;//插入的错误RD极性
assigndtout[9:
0]={d-code[0],d-code[1],d-code
[2],d-code[3],d-code[4],d-code[5],d-code[6],d-
code[7],d-code[8],d-code[9]};//调整编码输出值的顺
序
always@(dtinorrd-temp)
begin
if(dtin[9:
8]==2′b10)//特殊字符编码表
case(dtin[4:
0])
5′h0:
k-temp=11′b00011110100;
5′h1:
k-temp=11′b10011111001;
5′h2:
k-temp=11′b10011110101;
5′h3:
k-temp=11′b10011110011;
5′h4:
k-temp=11′b00011110010;
5′h5:
k-temp=11′b10011111010;
5′h6:
k-temp=11′b10011110110;
5′h7:
k-temp=11′b00011111000;
5′h8:
k-temp=11′b01110101000;
5′h9:
k-temp=11′b01101101000;
5′ha:
k-temp=11′b01011101000;
5′hb:
k-temp=11′b00111101000;
default:
k-temp=11′b00111110100;//错误状态
endcase
else//5B到6B的转换码表
case(dtin[4:
0])
5′h00:
d6b-temp=7′b1100111;
5′h01:
d6b-temp=7′b1011101;
5′h02:
d6b-temp=7′b1101101;
5′h03:
d6b-temp=7′b0110001;
5′h04:
d6b-temp=7′b1110101;
5′h05:
d6b-temp=7′b0101001;
5′h06:
d6b-temp=7′b0011001;
5′h07:
if(rd-temp)d6b-temp=7′b0000111;
elsed6b-temp=7′b0111000;
5′h08:
d6b-temp=7′b1111001;
30 2005年第6期基金项目论文FOUNDATIONSUPPORTEDPROJECT
5′h09:
d6b-temp=7′b0100101;
5′h0a:
d6b-temp=7′b0010101;
5′h0b:
d6b-temp=7′b0110100;
5′h0c:
d6b-temp=7′b0001101;
5′h0d:
d6b-temp=7′b0101100;
5′h0e:
d6b-temp=7′b0011100;
5′h0f:
d6b-temp=7′b1010111;
5′h10:
d6b-temp=7′b1011011;
5′h11:
d6b-temp=7′b0100011;
5′h12:
d6b-temp=7′b0010011;
5′h13:
d6b-temp=7′b0110010;
5′h14:
d6b-temp=7′b0001011;
5′h15:
d6b-temp=7′b0101010;
5′h16:
d6b-temp=7′b0011010;
5′h17:
d6b-temp=7′b1111010;
5′h18:
d6b-temp=7′b1110011;
5′h19:
d6b-temp=7′b0100110;
5′h1a:
d6b-temp=7′b0010110;
5′h1b:
d6b-temp=7′b1110110;
5′h1c:
d6b-temp=7′b0001110;
5′h1d:
d6b-temp=7′b1101110;
5′h1e:
d6b-temp=7′b1011110;
5′h1f:
d6b-temp=7′b1101011;
endcase
end
//组合10-bit的逻辑电路实现
always@(posedgeclkorposedgereset)
if(reset)rd-flg=0;
elseif(dtin[9]&~dtin[8])
begin//特殊字符的取值及RD极性的确定
if(rd-temp)d-code=~k-temp[9:
0];
elsed-code=k-temp[9:
0];
rd-flg=rd-st^k-temp[10];
end
elsebegin
case(dtin[7:
5])//数据字符的10-bit组合
3′b000:
d-code<=code-differ(d6b-temp,4′b0100);
3′b001:
d-code<=code0-same(d6b-temp,4′b1001);
3′b010:
d-code<=code0-same(d6b-temp,4′b0101);
3′b011:
d-code<=code1-same(d6b-temp);
3′b100:
d-code<=code-differ(d6b-temp,4′b0010);
3′b101:
d-code<=code0-same(d6b-temp,4′b1010);
3′b110:
d-code<=code0-same(d6b-temp,4′b0110);
3′b111:
d-code<=code7-differ(d6b-temp);
endcase
rd-flg<=rd-st^rd-buf;//确定RD极性
end
//3b到4-bit编码分为四种情况,采用下列的四个函数
实现,
//3-bit值为1、2、5和6情况,编码后“1”和“0”个数相
同。
RD+和RD-取值相同
function[9:
0]code0-same;
input[6:
0]in1;//码表中6-bit编码的对应值
input[3:
0]in2;//4-bit编码的对应值
case({rd-temp,in1[6]})
2′b00:
begin//rd-,in1[6]=0
code0-same={in1[5:
0],in2};
rd-buf=0;end
2′b01:
begin//rd-,in1[6]=1
code0-same={in1[5:
0],in2};
rd-buf=1;end
2′b10:
begin//RD+,in1[6]=0
code0-same={in1[5:
0],in2};
rd-buf=0;end
2′b11:
begin//RD+,in1[6]=1
code0-same={~in1[5:
0],in2};
rd-buf=1;end
endcase
endfunction
//3b值为3时,编码后“1”和“0”个数相同,但RD+是
RD-取值不同。
function[9:
0]code1-same;
input[6:
0]in1;//码表中6B码元取值
case({rd-temp,in1[6]})
2′b00:
begin//rd-,in1[6]=0
code1-same={in1[5:
0],4′b1100};
rd-buf=0;end
2′b01:
begin//rd-,in1[6]=1
code1-same={in1[5:
0],4′b0011};
rd-buf=1;end
2′b10:
begin//RD+,in1[6]=0
code1-same={in1[5:
0],4′b0011};
rd-buf=0;end
2′b11:
begin
cod