8B10B编码器的设计及实现.docx

上传人:b****9 文档编号:26126558 上传时间:2023-06-17 格式:DOCX 页数:18 大小:23.04KB
下载 相关 举报
8B10B编码器的设计及实现.docx_第1页
第1页 / 共18页
8B10B编码器的设计及实现.docx_第2页
第2页 / 共18页
8B10B编码器的设计及实现.docx_第3页
第3页 / 共18页
8B10B编码器的设计及实现.docx_第4页
第4页 / 共18页
8B10B编码器的设计及实现.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

8B10B编码器的设计及实现.docx

《8B10B编码器的设计及实现.docx》由会员分享,可在线阅读,更多相关《8B10B编码器的设计及实现.docx(18页珍藏版)》请在冰豆网上搜索。

8B10B编码器的设计及实现.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1