5B6B编码的仿真与实现课程设计.docx
- 文档编号:17379052
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:19
- 大小:53.95KB
5B6B编码的仿真与实现课程设计.docx
《5B6B编码的仿真与实现课程设计.docx》由会员分享,可在线阅读,更多相关《5B6B编码的仿真与实现课程设计.docx(19页珍藏版)》请在冰点文库上搜索。
5B6B编码的仿真与实现课程设计
《现代通信技术课程设计》
论文
题目
5B6B编码的仿真与实现
设计类型
工程应用
导师姓名
主要内容及目标
仿真与实现5B6B的编码,要求:
1、了解5B6B编码原理;
2、对5B6B编码进行仿真模型设计;
3、运用MATLAB软件或硬件描述语言对5B6B编码进行设计,并对各模块进行分析、仿真与验证;
4、要求有系统框图,电路原理图,软件流程图,模拟仿真结果图。
具有的设计条件
计算机
MATLAB软件
QuartusII软件
计划学生数及任务
计划需要3人:
1人主要进行5B6B编码仿真模型设计;
1人用MATLAB仿真实现。
1人分析5B6B编码用硬件描述语言的实现方案
计划设计进程
第12周查资料了解5B6B编码原理,设计实现方案,并进行仿真
第13周仿真实现5B6B编码,同时完成课程设计报告
参考文献
[1]李勇权,刘永强,何云状,樊建明.一种基于FPGA的5B6B编译码的实现[J].微计算机信息,2007,(14)
[2]张少锋,杨章顺,戴琦,齐恒,冉立新.光纤数字通信系统5B6B编译码的FPGA实现[J].光通信技术,2004,(12)
[3]刘增基,周洋溢,胡辽林,周绮丽.光纤通信(第二版)[M].西安:
西安电子科技大学出版社,2008.12
摘要:
在光纤通信系统中,选取适当的码型,对提高系统的可靠性,实现线路的高速、低误码率、最大容量传输,具有重要意义。
5B6B码是mBnB线路码型中的一种。
5B6B码是常用的线路码型,具有最大相同码元连码数少、定时信息丰富、匀衡性好、误码监视、同步性好等优点。
从电端机输入的信号,输出时必须要进行码型变换,才可适合线路传输。
5B6B译码是将传输到接收端机的6B数据码流,译成5B数据码流输出;而编码则是将自编数据按照一定的规律,编成6B码组后输出,二者互为逆过程。
本文介绍了基于对5B6B码编码的仿真与实现。
着重介绍了编码的工作原理并用程序对其进行仿真,最终得出正确的结果,以实现5B6B码编码在理论上的功能实现。
关键词:
5B6B编码仿真MATLAB
1.5B6B编码原理
最简单的mBnB码是1B2B码,即曼彻斯特码,这就是把原码的“0”变换为“01”,把“1”变换为“10”。
因此最大的连“0”和连“1”的数目不会超过两个,例如1001和0110。
但是在相同时隙内,传输1比特变为传输2比特,码速提高了1倍。
以3B4B码为例,输入的原始码流3B码,共有(23)8个码字,变换为4B码时,共有(24)16个码字。
为保证信息的完整传输,必须从4B码的16个码字中挑选8个码字来代替3B码。
设计者应根据最佳线路码特性的原则来选择码表。
例如:
在3B码中有2个“0”,变为4B码时补1个“1”;在3B码中有2个“1”,变为4B码时补1个“0”。
而000用0001和1110交替使用;111用0111和1000交替使用。
同时,规定一些禁止使用的码字,称为禁字,例如0000和1111。
作为普遍规则,引入“码字数字和”(WDS)来描述码字的均匀性,并以WDS的最佳选择来保证线路码的传输特性。
所谓“码字数字和”,是在nB码的码字中,用“-1”代表“0”码,用“+1”代表“1”码,整个码字的代数和即为WDS。
如果整个码字“1”码的数目多于“0”码,则WDS为正;如果“0”码的数目多于“1”码,则WDS为负;如果“0”码和“1”码的数目相等,则WDS为0。
例如:
对于0111,WDS=+2;对于0001,WDS=-2;对于0011,WDS=0。
mBnB码的特点是:
(1)码流中“0”和“1”码的概率相等,连“0”和连“1”的数目较少,定时信息丰富。
(2)高低频分量较少,信号频谱特性较好,基线漂移小。
(3)在码流中引入一定的冗余码,以便在线误码检测。
5B6B的编码规则:
5B共有(2的5次方)32个码字,变换6B码时共有(2的6次方)64个码字,其中WDS=0的码字有20个,WDS=+2的码字有15个,WDS=-2的码字有15个,因此共有50个|WDS|最小的码字供选择。
由于变换为6B时只需32个码字,为减少连“1”和连“0”的数目,删去:
000011、110000、001111和111100,同时禁用|WDS|=4和6的码字。
见表1
编码过程,随机产生一64*5矩阵代表原始的输入5B码流,然后按顺序将这些码字转换成十进制即为对应6B的地址。
若对应的6B码WDS=0则直接输出模式1,若不是0则交替输出模式1和模式2。
信号码(5B)
线路码(6B)
模式1(正组)
模式2(负组)
码字
WDS
码字
WDS
0
00000
010111
+2
101000
-2
1
00001
100111
+2
011000
-2
2
00010
011011
+2
100100
-2
3
00011
000111
0
000111
0
4
00100
101011
+2
010100
-2
5
00101
001011
0
001011
0
6
00110
001101
0
001101
0
7
00111
001110
0
001110
0
8
01000
110011
+2
001100
-2
9
01001
010011
0
101000
0
10
01010
010101
0
011000
0
11
01011
010110
0
100100
0
12
01100
011001
0
000111
0
13
01101
011010
0
010100
0
14
01110
011100
0
001011
0
15
01111
101101
+2
001101
-2
16
10000
011101
+2
001110
-2
17
10001
100011
0
001100
-2
18
10010
100101
0
101000
0
19
10011
100110
0
011000
0
20
10100
101001
0
100100
0
21
10101
101010
0
000111
0
22
10110
101100
0
010100
0
23
10111
110101
+2
001011
-2
24
11000
110001
0
001101
0
25
11001
110010
0
001110
0
26
11010
110100
0
001100
0
27
11011
111001
+2
101000
-2
28
11100
111000
0
011000
0
29
11101
101110
+2
100100
-2
30
11110
110110
+2
000111
-2
31
11111
111010
+2
010100
-2
表15B6B码表
2.程序流程图
图1程序流程图
3.编码程序部分
#include
#include
#defineN301
voidmain()
{
charb5[N];
char_b5[N];
inti=0;
intflag0=0;
intflag1=0;
intflag2=0;
intflag4=0;
intflag8=0;
intflag15=0;
intflag16=0;
intflag23=0;
intflag27=0;
intflag29=0;
intflag30=0;
intflag31=0;
chars0[6]="00000";
chars1[6]="00001";
chars2[6]="00010";
chars3[6]="00011";
chars4[6]="00100";
chars5[6]="00101";
chars6[6]="00110";
chars7[6]="00111";
chars8[6]="01000";
chars9[6]="01001";
chars10[6]="01010";
chars11[6]="01011";
chars12[6]="01100";
chars13[6]="01101";
chars14[6]="01110";
chars15[6]="01111";
chars16[6]="10000";
chars17[6]="10001";
chars18[6]="10010";
chars19[6]="10011";
chars20[6]="10100";
chars21[6]="10101";
chars22[6]="10110";
chars23[6]="10111";
chars24[6]="11000";
chars25[6]="11001";
chars26[6]="11010";
chars27[6]="11011";
chars28[6]="11100";
chars29[6]="11101";
chars30[6]="11110";
chars31[6]="11111";
chark0_1[7]="010111";
chark0_2[7]="101000";
chark1_1[7]="100111";
chark1_2[7]="100100";
chark2_1[7]="011011";
chark2_2[7]="100100";
chark3[7]="000111";
chark4_1[7]="101011";
chark4_2[7]="010100";
chark5[7]="001011";
chark6[7]="001101";
chark7[7]="001110";
chark8_1[7]="110011";
chark8_2[7]="001100";
chark9[7]="010011";
chark10[7]="010101";
chark11[7]="010110";
chark12[7]="011001";
chark13[7]="011010";
chark14[7]="011100";
chark15_1[7]="101101";
chark15_2[7]="010010";
chark16_1[7]="011101";
chark16_2[7]="100010";
chark17[7]="100011";
chark18[7]="100101";
chark19[7]="100110";
chark20[7]="101001";
chark21[7]="101010";
chark22[7]="101100";
chark23_1[7]="110101";
chark23_2[7]="001010";
chark24[7]="110001";
chark25[7]="110010";
chark26[7]="110100";
chark27_1[7]="111001";
chark27_2[7]="000110";
chark28[7]="111000";
chark29_1[7]="101110";
chark29_2[7]="010001";
chark30_1[7]="110110";
chark30_2[7]="001001";
chark31_1[7]="111010";
chark31_2[7]="000101";
printf("请输入5B码:
");
gets(b5);/*读取输入码流到数组b5中*/
if(strlen(b5)%5==0)/*判断是否满足码的长度*/
{
printf("对应的6B码:
");
while(b5[i]!
='\0')/*判断是否读到码流的结尾*/
{
intn;
for(n=0;n<5;n++)
{
_b5[n]=b5[i++];
_b5[5]='\0';
}/*将码流分组并以字符串形式存储*/
if(strcmp(_b5,s0)==0)
{
if(flag0++%2==0)
printf("%s",&k0_1);
else
printf("%s",&k0_2);
}
if(strcmp(_b5,s1)==0)
{
if(flag1++%2==0)
printf("%s",&k1_1);
else
printf("%s",&k1_2);
}
if(strcmp(_b5,s2)==0)
{
if(flag2++%2==0)
printf("%s",&k2_1);
else
printf("%s",&k2_2);
}
if(strcmp(_b5,s3)==0)
{
printf("%s",&k3);
}
if(strcmp(_b5,s4)==0)
{
if(flag4++%2==0)
printf("%s",&k4_1);
else
printf("%s",&k4_2);
}
if(strcmp(_b5,s5)==0)
{
printf("%s",&k5);
}
if(strcmp(_b5,s6)==0)
{
printf("%s",&k6);
}
if(strcmp(_b5,s7)==0)
{
printf("%s",&k7);
}
if(strcmp(_b5,s8)==0)
{
if(flag8++%2==0)
printf("%s",&k8_1);
else
printf("%s",&k8_2);
}
if(strcmp(_b5,s9)==0)
{
printf("%s",&k9);
}
if(strcmp(_b5,s10)==0)
{
printf("%s",&k10);
}
if(strcmp(_b5,s11)==0)
{
printf("%s",&k11);
}
if(strcmp(_b5,s12)==0)
{
printf("%s",&k12);
}
if(strcmp(_b5,s13)==0)
{
printf("%s",&k13);
}
if(strcmp(_b5,s14)==0)
{
printf("%s",&k14);
}
if(strcmp(_b5,s15)==0)
{
if(flag15++%2==0)
printf("%s",&k15_1);
else
printf("%s",&k15_2);
}
if(strcmp(_b5,s16)==0)
{
if(flag16++%2==0)
printf("%s",&k16_1);
else
printf("%s",&k16_2);
}
if(strcmp(_b5,s17)==0)
{
printf("%s",&k17);
}
if(strcmp(_b5,s18)==0)
{
printf("%s",&k18);
}
if(strcmp(_b5,s19)==0)
{
printf("%s",&k19);
}
if(strcmp(_b5,s20)==0)
{
printf("%s",&k20);
}
if(strcmp(_b5,s21)==0)
{
printf("%s",&k21);
}
if(strcmp(_b5,s22)==0)
{
printf("%s",&k22);
}
if(strcmp(_b5,s23)==0)
{
if(flag23++%2==0)
printf("%s",&k23_1);
else
printf("%s",&k23_2);
}
if(strcmp(_b5,s24)==0)
{
printf("%s",&k24);
}
if(strcmp(_b5,s25)==0)
{
printf("%s",&k25);
}
if(strcmp(_b5,s26)==0)
{
printf("%s",&k26);
}
if(strcmp(_b5,s27)==0)
{
if(flag27++%2==0)
printf("%s",&k27_1);
else
printf("%s",&k27_2);
}
if(strcmp(_b5,s28)==0)
{
printf("%s",&k28);
}
if(strcmp(_b5,s29)==0)
{
if(flag29++%2==0)
printf("%s",&k29_1);
else
printf("%s",&k29_2);
}
if(strcmp(_b5,s30)==0)
{
if(flag30++%2==0)
printf("%s",&k30_1);
else
printf("%s",&k30_2);
}
if(strcmp(_b5,s31)==0)
{
if(flag31++%2==0)
printf("%s",&k31_1);
else
printf("%s",&k31_2);
}
}/*分组后的5B码与码表对比并输出相应的6B码*/
}
else
printf("你输入的码不满足5B码长度,请正确输入5B码");
while
(1);
}
4.运行结果
输入
输出
00000
010111
101000
00001
100111
011000
00010
011011
100100
00011
000111
000111
00100
101011
010100
00101
001011
001011
00110
001101
001101
00111
001110
001110
01000
110011
001100
01001
010011
101000
01010
010101
011000
01011
010110
100100
01100
011001
000111
01101
011010
010100
01110
011100
001011
01111
101101
001101
10000
011101
001110
10001
100011
001100
10010
100101
101000
10011
100110
011000
10100
101001
100100
10101
101010
000111
10110
101100
010100
10111
110101
001011
11000
110001
001101
11001
110010
001110
11010
110100
001100
11011
111001
101000
11100
111000
011000
11101
101110
100100
11110
110110
000111
11111
111010
010100
表2输入输出表
5.总结
本文介绍一种简单的5B6B编码方法,并利用matlab语言实现了5B6B编码的全数字设计,具有了编码的最基本的功能,今后的改进就是在此基础上改进同步信号的提取以及误码的监测,让这个设计更加完善。
本次的课程设计是第一次进行一个大的系统进行设计,对于我们来说,还是颇有难度的。
在最开始选择是用matlab还是vhdl语言进行设计时,我们选择使用matlab语言进行这次课程设计,在实验中也遇到了一些小的问题,最终和同伴、老师探讨,疑问得以解决,在此感谢热心的同伴们和不厌其烦的老师对我们的帮助!
通过此次5B6B编码,我对mBnB这种常用的编码方式有了一定的了解,尤其是对nB的模式交替选择有了更深刻的理解,交替的目的是保证WDS之和最小以保证有足够的定时信息和最少的直流分量。
同时通过此次的编码实验我对Matlab的使用更加熟练,尤其是程序设计方面有了进一步的提高。
6.参考文献
【1】李勇权,刘永强,何云状,樊建明.一种基于FPGA的5B6B编译码的实现[J].微计算机信息,2007,(14)
【2】张少锋,杨章顺,戴琦,齐恒,冉立新.光纤数字通信系统5B6B编译码的FPGA实现[J].光通信技术,2004,(12)
【3】刘增基,周洋溢,胡辽林,周绮丽.光纤通信(第二版)[M].西安:
西安电子科技大学出版社,2008.12
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- B6B 编码 仿真 实现 课程设计