孙志雄,谢海霞
(琼州学院 电子信息工程学院,海南 三亚 572022)
由于数字信号在传输过程中受到干扰,码元波形将变坏,接收端收到后可能发生错误判决,因此在设计数字通信系统时,就要考虑差错控制编码。在差错控制编码中,每种编码所依据的原理是不同的,其中常用的是线性分组码,线性分组码中的信息位和监督位是由一些线性代数方程联系着的。而汉明码(Hamming Code)就是一种能够纠正一位错码且编码效率较高的线性分组码。由于汉明码的编解码在工程上较易实现,因此应用广泛。本文通过对信道纠错编码汉明码的研究,提出了利用FPGA实现汉明码编解码的方法,并实现了(7,4)汉明码的自动纠错和检错的功能[1]。
汉明码是由Richard Hamming于1950年提出的,它属于线性分组编码方式,用以纠正单个错误的线性分组码,在软件无线电中应用广泛。在线性码分组码(n,k)中,若码长为n,信息位数为k,则监督位数r=n-k。
如果用r个监督位构造出r个监督关系式来指示1位错码的n种可能位置,则要求:
这种能够纠正1位错码的线性分组码就称为汉明码。其基本原理是,将信息码元与监督码元通过线性方程式联系起来,每一个监督位被编在传输码字的特定比特位置上。系统对于错误的数位无论是原有信息位中的,还是附加监督位中的,都能把它分离出来。由汉明码的性质可知,(7,4)汉明码能纠正1位错码,检测2个错码[2]。
设汉明码(n,k)中k=4,为了纠正1位错码,由式(1)可知,要求监督位数r≥3。若取r=3,则n=k+r=7,即(7,4)汉明码。若用a6a5…a0表示这7个码元,其中a6、a5、a4和a3为信息位,a2、a1和a0为监督位; 用S2、S1和S0表示3个监督关系式中的校正子,则S2、S1和S0的值与错码位置的对应关系可以规定如表1所示,其对应监督关系式如式(2)所示[3]。
表1 (7,4)汉明码校正子和错码位置的关系
在信息传输中,在发送端编码时,信息位a6、a5、a4和a3的值由输入信号决定,是随机的。监督位a2、a1和a0根据信息位的取值按监督关系来确定,即监督位应使S2、S1和S0的值为0,如式(3)所示,即表示发送端编成的码组中应无错码。
式(3)经过移项运算,解出监督位a2、a1和a0,如式(4)所示。
因此,(7,4)汉明码给定信息位后,可以直接按式(4)算出监督位,结果如表2所示。
表2 (7,4)汉明码监督位的计算结果
接收端收到每个码组后,先计算出S2、S1和S0,若为000,则表示无错码;若不全为0,则表示有错码,这时可查表1判断错码情况。例如,若接收码组为0000011,按式(2)计算可得:S2=0,S1=1,S0=1。 由于S2S1S0=011,查表1可知在a3位有一错码,因此便可以在接收端纠正1位错码。表2中所列的(7,4)汉明码的最小码距d0=3,因此,这种码能够纠正1位错码或检测2位错码。由于码率k/n=(n-r)/n=1-r/n,故当n很大或r很小时,码率接近1。 可见,汉明码是一种高效码[4]。
根据汉明码的编码方法,利用VHDL语言编程实现一种(7,4)汉明码的编码及仿真,其码长为7位,信息位为高4位,监督位为低3位。对应上述编码方法实现的汉明码编码器的VHDL程序如下:
用VHDL语言完成的汉明码编码器设计电路符号如图1所示,其中datain[3..0]为输入的4位信息码;en为编码输入使能端,高电平有效;hamout[6..0]为汉明码编码输出,其高4位hamout[6..3]为信息位,其低3位hamout[2..0]为监督位。
图1 (7,4)汉明码编码器电路符号
实现的 (7,4)汉明码编码器仿真波形图如图2所示。从图2可以看出,当输入信息位datain[3..0]为0000时,输出hamout[6..0]汉明码编码为0000000;输入信息位datain[3..0]为0001时,输出hamout[6..0]汉明码编码为0001011,其余类推,其(7,4)汉明码编码结果与表2一致。
用VHDL语言完成的汉明码解码器设计电路符号如图3所示。其中hamin[6..0]为输入的汉明码。en1为译码器使能端,高电平有效。dataout[3..0]为汉明码解码输出,输出为4位信息位。ne为解码输出错误指示端,当ne为高电平1时表示接收的汉明码没有错误,相应的err为000;当ne为低电平0时表示接收的汉明码有一位错误,并用err指出错码的位置,当err为001时表示错码为a0,当err为010时表示错码为a1,其余类推。经过纠正后,解码输出dataout[3..0]正确。
图2 汉明码编码器仿真波形图
图3 汉明码解码器电路符号
与上述解码方法对应的汉明码解码器的VHDL程序如下:
(7,4)汉明码解码器仿真波形如图4所示。例如,当解码器输入hamin[6..0]为0001010,对应的ne为低电平0说明接收的汉明码有1位错误,相应的err为001时,表示错码为a0,经纠错后a0为1,所以正确接收码应为:0001011,对应的解码为0001。从图4可以看出,经解码器解码后,其正确解码结果与编码输入的信息位一致。
图4 汉明码解码器仿真波形图
在仿真的基础上,将汉明码编解码的配置程序下载到FPGA芯片EP1K30QC208-2,并在EDA实验开发板进行测试,实验结果表明汉明码编解码正确[5]。
本文利用VHDL语言编程,并基于FPGA实现了(7,4)汉明码编解码器的设计,体现了软件无线电设计通信系统的思想,实现了硬件设计实验软件化,其加速了数字通信系统设计的效率,降低了设计成本,为通信系统的设计提供了很好的平台[6]。
[1]盛孟刚.汉明码编译码的FPGA设计与实现[J].山西电子技术,2007(6):43-47.
[2]章学静,薛琳,李金平,等.汉明(Hamming)码及其编译码算法的研究与实现[J].北京联合大学学报(自然科学版),2008,22(1):46-49.
[3]方国涛.基于FPGA的汉明码编译码系统[J].信息技术,2010(7):79-81.
[4]樊昌信,曹丽娜.通信原理(第6版)[M].北京:国防工业出版社,2006.
[5]江国强.EDA技术与应用(第3版)[M].北京:电子工业出版社,2010.
[6]孙志雄,谢海霞.基于FPGA的CRC编解码器实现[J].电子器件,2012,35(6):657-660.