74汉明码课程设计文档格式.docx
《74汉明码课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《74汉明码课程设计文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
Altera订购包现在含有对部分流行MegaCore功能的全面许可,帮助设计人员缩短设计时间。
此外,
QuartusII软件网络版和订购版现在均包括一套嵌入式外设——已经同NiosII嵌入式处理器一起,分别进行了许可。
●外部逻辑分析仪接口:
QuartusII设计人员不但可以使用SignalTap®
II嵌入式逻辑分析仪特性,还可以使用新的逻辑分析仪接口功能,在利用逻辑分析仪进行板级调试时,能够掌握内部FPGA节点的情况。
2.VHDL语言简介
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,被IEEE和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口,除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点如下几点:
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。
符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
1.2.2软件设计方案介绍
软件设计方案流程如下图所示
图1-1软件设计流程图
4级m序列的最长周期为15,而(7,4)汉明码所需的数据位是4位,当一个周期的m序列一位一位移出,放入一个长度为4的数组,要分四次组,但还缺少一个数据,使得分组没有周期性,故在程序设计中进行第四次分组时,在数组的最低位补0,使其在一个m序列周期内正好分为4组。
这样循环移位输出的m序列满足周期性,在观察波形时易于发现误码的现象,一目了然。
分组后的一串数据即数组就进入下一级作为(7,4)编码器的信息位进行编码。
在编码过程中加入监督位。
这样,信息位和监督位就组成了七位码。
经译码后便可输出汉明码的数据位以及译码的m序列。
第2章设计方案的实施
2.1m序列模块
2.1.1m序列简介
m序列是最长线性反馈移位寄存器序列的简称,它是由线性反馈的移存器产生的周期最长的序列。
一般说来,一个n级反馈移位寄存器可能产生的最大周期等于(2n-1).现在我们引入m序列的本原多项式的概念。
若一个n次多项式f(x)满足以下条件
(1)f(x)为既约的;
(2)f(x)可整除(xm+1),m=2n-1;
(3)f(x)除不尽(xq+1),q<
m。
则f(x)为本原多项式。
m序列通过线形反馈移位寄存器产生如图:
图2-1m序列产生原理框图
设n级移位寄存器的初始状态:
a-1,a-2,a-3,a-4,…a-n经过一次移位后,状态变为a0,a1,…a-n+1,经过n次移位以后状态变为a-n-1,a-n-2,…a1,a0。
当n=4时,产生的m序列的长度为m=2n-1=15。
我们可以取x4++x+1为本原多项式。
2.1.2m序列模块设计流程
m序列流程图:
图2-2m序列设计流程图
在时钟信号触发下,4级m序列一位一位地移出,因为m序列的周期长度为15,(7,4)汉明码要求的信息位为4位,周期长度不能整除4,因而在m序列移出15位后在数组a中的最后一位添加一个“0”。
这样一个周期的m序列就可以周期性的分成4组,易于观察分组码是否正确或波形图是否吻合。
2.2(7,4)汉明码知识介绍
2.2.1基本概念
线性分组码是一类重要的纠错码,应用很广泛。
在(n,k)分组码中,若监督码元是按线性关系模2相加而得到的,则称其为线性分组码。
现在以(7,4)分组码为例来说明线性分组码的特点。
设其码字为A=[a6,a5,a4,a3,a2,a1,a0],其中前4位是信息码元,后3位是监督码元,可用下列线性方程组来描述该分组码产生监督元:
显然,这3个方程是线性无关的。
根据公式2-1可得(7,4)码的全部码组,如表1所示。
表2-1(7,4)汉明码的全部码组
根据线性码封闭性,再由表1可知(7,4)码的最小码距d0=3,它能纠1个错或检测2个错。
汉明码是能够纠正单个错误的线性分组码,其特点是:
最小码距d0=3,码长n与监督位满足n<
=2r-1的关系,说明上述的(7,4)线性分组码就是一个汉明码。
由于码率k/n=(n-r)/n=1–r/n,故当n很大和r很小时,码率接近1。
【1】可见,汉明码是一种高效码。
2.2.2监督矩阵
式(2-1)所示(7,4)汉明码的3个监督方程改写后可用矩阵形式表示为
简记为
H·
AT=0T或A·
HT=0
H称为监督矩阵,只要监督矩阵H给定,编码时信息位和监督位之间的关系就完全确定了。
H的行数就是监督矩阵的数目,等于监督数目r。
H序列可分为2部分:
H·
AT=0T,可以用来作为判断接收码字A是否出错的依据。
2.2.3生成矩阵
把监督方程补充完整并改写为矩阵形式
上式表示,在信息位给定后,用信息位的行矩阵乘矩阵Q就产生出监督位。
Q的左边加上1个kk阶单位方阵,就构成1个生成矩阵G。
而且可由G和信息组产生对应的全部码组。
在得出的码组中,信息位的位置不变,监督位附加于其后。
其中,
Q=PT。
2.2.4伴随式(校正子)S
设发送码组A=[an-1,an-2,…,a1,a0],在传输过程中可能发生误码。
接收码组B=[bn-1,bn-2,…,b1,b0
],则发送码组和接收码组之差为错误图样E:
B–A=E(模2)
令S=BHT,称为伴随式或校正子。
S=BHT=(A+E)HT
=EHT
用来指示错码的位置。
(7,4)汉明码的伴随式与错误图样的对应关系如表2所示。
汉明码S与E的对应关系
表2-2汉明码S与E的对应关系
S1S2S3
错码位置
001
a0
101
a4
010
a1
110
a5
100
a2
111
a6
011
a3
000
无错码
2.3汉明码编码模块
2.3.1汉明码编码原理
汉明码是在原编码的基础上附加一部分代码,使其满足纠错码的条件。
它属于线性分组码,由于汉明码的抗干扰能力较强,至今仍是应用比较广泛的一类码。
在(n,k)汉明码中,(n-k)个附加的监督码元是由信息码元的线性运算产生的。
码长为n,信息码元长度为k,2k个码组构成n维线性空间中的一个k维子空间,编码的实质就是要在n维空间中,找出一组长为n的k个线性无关的矢量g1⋯gk-1,使得每个码组a都可以表示为k个矢量的线性组合,即a=[an-1an-2⋯a0]=ak-1g0+ak-2g1+⋯a0gk-1
其中,ai∈{0,1},i=0,1,⋯,k-1。
将上式写成矩阵形式得
由此,[an-1an-2⋯a0]是带编码信息的信息组,G是一个k*n阶矩阵,G称为(n,k)汉明码的生成矩阵。
当G确定以后,编码的问题也就解决了。
根据监督码元是有信息码元的线性运算产生的关系可知,监督码(a0,a1,a2)满足以下关系式:
即可算出三位监督位,再与信息位结合,可得到(7,4)汉明码
2.3.2汉明码编码程序设计流程
汉明码编码设计流程图
图2-3编码设计流程图
输入信息码a3a2a1a0,输出(7,4)汉明码b6b5b4b3b2b1b0。
首先,输入信息码a3a2a1a0,即使用以下语句:
port(a:
instd_logic_vector(3downto0);
就可以得到监督位与信息码之间的对应关系,使用异或运算,即:
b
(2)<
=a(3)xora
(2)xora
(1);
b
(1)<
=a(3)xora
(2)xora(0);
b(0)<
=a(3)xora
(1)xora(0);
最后,将算好的监督位与原来输入的信息码一起输出,这样,编码程序就算完成了。
2.4汉明码译码模块
2.4.1汉明码译码原理
一般来说,若码长为n,信息位数为k,则监督位数为r=n-k。
如果希望用r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求
2r-1>
=n或2r>
=k+r+1(2-1)
设(7,4)汉明码中,n=7,k=4,为了纠错一位码,由表达式2-1可知,要求监督位数r>
=3。
用a6a5⋯a0表示要进行译码的码元,用S2、S1和S0表示监督关系式的校正子,则S0、S1和S2的值与错码对应关系可以规定如表2-3所示,由表可知,当一位错码的位置在a2、a4、a5或a6时,校正子为1;
否则为0,可推知,a2,a4,a5或a64个码元构成偶数监督关系
S2=a6⊕a5⊕a4⊕a2(2-2)
同理可得
S1=a6⊕a5⊕a3⊕a1(2-3)
S0=a6⊕a4⊕a3⊕a0(2-4)
接收到每个码组之后,先按照式2-2~2-4计算出S2,S1,S0,再按照表2-3判断错码情况。
例如接收码组为0000011,可计算出S1=0,S2=1,S3=1。
由于S1S2S3=011,可知a3位出错,只需对其取反即可
表2-3(7,4)码校正子与错误图样的对应关系
序号
错误码位
E
S
e6e5e4e3e2e1e0
S0
S1
S2
1
2
3
4
5
6
7
0
1
2.4.2汉明码译码程序设计流程
汉明码译码设计流程图
图2-4译码设计流程图
首先,输入7位汉明码a6a5a4a3a2a1a0,用以下语句来实现:
instd_logic_vector(6downto0);
然后,根据这7位码a6a5a4a3a2a1a0,计算校正子s2s1s0的值,可知校正子S与(7,4)汉明码各位之间的关系,即:
ss
(2):
=a(6)xora(5)xora(3)xora
(2);
ss
(1):
=a(6)xora(4)xora(3)xora
(1);
ss(0):
=a(5)xora(4)xora(3)xora(0);
第三,要判定校正子与0的关系,使用if语句,若等于0,则表示没有错误;
若不为0,则表示其中有一位出错。
根据表4-1,可以得到校正子S与错误图样E之间的关系,才用case语句,编写程序如下:
校正子错码纠正错码位置
when"
001"
=>
bb(0):
=notbb(0);
n<
="
000"
;
010"
bb
(1):
=notbb
(1);
100"
bb
(2):
=notbb
(2);
011"
bb(3):
=notbb(3);
101"
bb(4):
=notbb(4);
110"
bb(5):
=notbb(5);
111"
bb(6):
=notbb(6);
上述程序中,bb是变量,存放的是输入7位汉明码a6a5a4a3a2a1a0,
当S="
,时,表示a0出错,则只需将这一位的值取反,然后再送给输出。
a1、a2、a3、a4、a5、a6出错的原理也是一样的。
最后,将没有错误的(7,4)汉明码或已经纠正1个错误的(7,4)汉明码输出,这样译码程序就完成了。
为了方便阅读波形,加入输出了校正子S和错误位数N。
若第0位(a0)出错,则N输出0,依次类推;
若无错,则输出7。
第3章软件调试及遇到的问题
3.1软件调试仿真波形图
1.m序列仿真波形图
图3-1m序列仿真波形图
2.汉明码编码仿真波形图
图3-2汉明码编码仿真波形图
3.汉明码译码仿真波形图
图3-3汉明码译码仿真波形图
4.软件整体调试仿真波形图
图3-4软件整体测试仿真波形图
3.2软件调试过程中遇到的问题
在软件调试过程中主要遇到了以下问题:
(1)毛刺干扰问题:
相邻编码组之间存在毛刺干扰信号,可能是由于赋值语句的依次赋值顺延以及过程中的运算时延造成的。
(2)延时问题:
在m序列模块、编码模块中,存在一些延时现象,造成部分数据的丢失,为了尽可能减小延时,在编写程序时,尽量采用并行程序;
在定义数据类型时,要选择变量,尽可能少地用信号类型,以减少程序运行时间;
在传递参数时,尽可能用元件例化语句实现。
(3)数据丢失以及时序配合问题:
m序列分组时,要保证数据不丢失以及时序配合,用计数器配合时钟来实现,当时钟上升沿到来时,计数器才进行相应动作,才将数据放入数组。
(4)VHDL语法问题:
在写整个程序的元件例化语句时,元件例化的参量的定义应与元件例化说明语句一致,注意变量与信号赋值方式的不同,实体定义的名字应该与文件名一致。
在调试过程中也还遇到不少其他的问题,比如在生成总的电路图的过程中,如果没有新建工程,就有指示有错误。
并且新建工程名必须与程序实体名保持一直,否则会报错:
没有定义实体。
第4章总结体会
为期近两周的通信原理课程设计结束了,在这次课程设计中,也遇到了不少问题。
由于对QuartusII软件和VHDL语言不太熟悉,所以开始一段时间的主要精力就花在了这方面,通过借阅有关这方面的书籍和实际操作来熟悉他们。
后期的主要工作便是程序设计调试,虽然问题不断,但在和同学的共同探讨下,最终基本完成了汉明码的编译码的设计。
通过这次课程设计,我加深了对汉明码编译码过程的了解。
夯实了理论基础知识,也提高了实际运用方面的能力。
在这个过程中,每当一个个小问题被解决时,对自己来说都是令人欣喜的,每一点小小的进步,都是对自己的肯定。
这次课程设计是一次难忘的经历,让我从中学到了很多东西,将对我以后的学习工作有所帮助。
附录:
1.总电路图
2.程序清单
m序列:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYm4IS
PORT(CLK,CLR:
INSTD_LOGIC;
DATAOUT1:
outSTD_LOGIC;
DATAOUT16:
OUTSTD_LOGIC_vector(3downto0));
ENDm4;
ARCHITECTUREARTOFm4IS
signals1,s2:
std_logic_vector(3downto0);
signals5:
std_logic;
begin
process(clr,clk)is
begin
ifclr='
1'
thens1<
0001"
elsif(clk='
andclk'
event)then
s1<
=(s2(0)xors2(3))&
s2(3downto1);
endif;
s2<
=s1;
s5<
=s2(0);
endprocess;
process(clk,s5)is
begin
if(clk'
eventandclk='
)then
DATAOUT1<
=s5;
--m序列输出
endif;
endprocess;
process(clk,s5,clr)--实现分组以及数组补“0”
variabletemp:
integerrange0to3;
variabletemp1:
integerrange0to7;
variablea:
then
dataout16<
0000"
elsifrising_edge(clk)then
iftemp1<
7then
casetempis
when0=>
a(3):
temp:
=1;
when1=>
a
(2):
=2;
when2=>
a
(1):
=3;
when3=>
a(0):
=0;
temp1:
=temp1+1;
dataout16<
=a;
endcase;
else
='
0'
whenothers=>
null;
ENDART;
编码:
libraryieee;
useieee.std_logic_1164.all;
entityhamencis
port(datain:
inbit_vector(0to3);
hamout:
outbit_vector(0to6));
endhamenc;
architecturever2ofhamencis
signalp0,p1,p2:
bit;
p0<
=(datain(0)XORdatain
(1))XORdatain(2