摘 要: 介绍了汉明码的原理,分析了汉明码编码、解码电路设计思路。利用VHDL语言设计(7,4)汉明码编解码器并通过Quartus II仿真平台进行仿真验证,最后下载到FPGA芯片EP1K30QC208-2实现了汉明码编解码电路。仿真及实验结果证明,该方法实现的汉明码编解码电路方案正确,并具有速度快、修改方便、可移植性好等优点。
关键词: 汉明码;编码器;解码器;FPGA;VHDL
0 引言
由于数字信号在传输过程中受到干扰,码元波形将变坏,接收端收到后可能发生错误判决,因此在设计数字通信系统时,就要考虑差错控制编码。在差错控制编码中,每种编码所依据的原理是不同的,其中常用的是线性分组码,线性分组码中的信息位和监督位是由一些线性代数方程联系着的。而汉明码(Hamming Code)就是一种能够纠正一位错码且编码效率较高的线性分组码。由于汉明码的编解码在工程上较易实现,因此应用广泛。本文通过对信道纠错编码汉明码的研究,提出了利用FPGA实现汉明码编解码的方法,并实现了(7,4)汉明码的自动纠错和检错的功能[1]。
1 汉明码的编解码原理
汉明码是由Richard Hamming于1950年提出的,它属于线性分组编码方式,用以纠正单个错误的线性分组码,在软件无线电中应用广泛。在线性码分组码(n,k)中,若码长为n,信息位数为k,则监督位数r=n-k。
如果用r个监督位构造出r个监督关系式来指示1位错码的n种可能位置,则要求:
2r-1≥n或2r≥k+r+1(1)
这种能够纠正1位错码的线性分组码就称为汉明码。其基本原理是,将信息码元与监督码元通过线性方程式联系起来,每一个监督位被编在传输码字的特定比特位置上。系统对于错误的数位无论是原有信息位中的,还是附加监督位中的,都能把它分离出来。由汉明码的性质可知,(7,4)汉明码能纠正1位错码,检测2个错码[2]。
2 汉明码的编解码方法
设汉明码(n,k)中k=4,为了纠正1位错码,由式(1)可知,要求监督位数r≥3。若取r=3,则n=k+r=7,即(7,4)汉明码。若用a6 a5…a0表示这7个码元,其中a6、a5、a4和a3为信息位,a2、a1和a0为监督位;用S2、S1和S0表示3个监督关系式中的校正子,则S2、S1和S0的值与错码位置的对应关系可以规定如表1所示,其对应监督关系式如式(2)所示[3]。
在信息传输中,在发送端编码时,信息位a6、a5、a4和a3的值由输入信号决定,是随机的。监督位a2、a1和a0根据信息位的取值按监督关系来确定,即监督位应使S2、S1和S0的值为0,如式(3)所示,即表示发送端编成的码组中应无错码。
式(3)经过移项运算,解出监督位a2、a1和a0,如式(4)所示。
因此,(7,4)汉明码给定信息位后,可以直接按式(4)算出监督位,结果如表2所示。
接收端收到每个码组后,先计算出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]。
3 基于VHDL的汉明码编解码仿真及实现
3.1基于VHDL的汉明码编码仿真
根据汉明码的编码方法,利用VHDL语言编程实现一种(7,4)汉明码的编码及仿真,其码长为7位,信息位为高4位,监督位为低3位。对应上述编码方法实现的汉明码编码器的VHDL程序如下:
//A 4-bit Hamming Encoder
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY hammingenc IS
PORT(datain : IN BIT_VECTOR(0 TO 3);
//d0 d1 d2 d3
en :IN bit;
hamout : OUT BIT_VECTOR(0 TO 6));
//d0 d1 d2 d3 p0 p1 p2
END hammingenc;
ARCHITECTURE one OF hammingenc IS
SIGNAL p0,p1,p2 : BIT; //check bits
BEGIN
//generate check bits
p0<=(datain(0)XOR datain(1))XOR datain(3)WHEN EN=′1′ELSE′0′;
p1<=(datain(0)XOR datain(2))XOR datain(3)WHEN EN=′1′ ELSE′0′;
p2<=(datain(1)XOR datain(2))XOR datain(3)WHEN EN=′1′ ELSE ′0′;
//connect up outputs
hamout(0 TO 2)<=(p0&p1&p2);
hamout(3 TO 6)<=datain(0 TO 3);
END one;
用VHDL语言完成的汉明码编码器设计电路符号如图1所示,其中datain[3..0]为输入的4位信息码;en为编码输入使能端,高电平有效;hamout[6..0]为汉明码编码输出,其高4位hamout[6..3]为信息位,其低3位hamout[2..0]为监督位。
实现的(7,4)汉明码编码器仿真波形图如图2所示。从图2可以看出,当输入信息位datain[3..0]为0000时,输出hamout[6..0]汉明码编码为0000000;输入信息位datain[3..0]为0001时,输出hamout[6..0]汉明码编码为0001011,其余类推,其(7,4)汉明码编码结果与表2一致。
3.2 基于VHDL的汉明码解码仿真
用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]正确。
与上述解码方法对应的汉明码解码器的VHDL程序如下:
//A 7 bit Hamming Decoder
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY hammingdec IS
PORT(hamin:IN BIT_VECTOR(6 downTO 0);
//a6 a5 a4 a3 p2 p1 p0
EN1:IN BIT;
dataout : OUT BIT_VECTOR(3 downto 0);
//a6 a5 a4 a3
ne: OUT BIT;
err:OUT STD_LOGIC_VECTOR(2 downto 0)); //diagnostic outputs
END hammingdec;
ARCHITECTURE ONE OF hammingdec IS
BEGIN
PROCESS(hamin)
VARIABLE syndrome:BIT_VECTOR(2 DOWNTO 0);
BEGIN
//generate syndrome bits
IF EN1=′1′ THEN
syndrome(0):=(((hamin(0) XOR hamin(3))
XOR hamin(4)) XOR hamin(6));
syndrome(1):=(((hamin(1) XOR hamin(3))
XOR hamin(5)) XOR hamin(6));
syndrome(2):=(((hamin(2) XOR hamin(4))
XOR hamin(5)) XOR hamin(6));
IF (syndrome="000") THEN //no errors
ne<=′1′;
err<="000";
dataout(3 downTO 0)<=hamin(6 downTO 3);
ELSE ne<=′0′;
CASE syndrome IS
WHEN "001"=>err<="001";dataout(3 downTO 0)
<=hamin(6 downTO 3);
WHEN"010"=>err<="010";dataout(3 downTO 0)
<=hamin(6 downTO 3);
WHEN"100"=>err<="011";dataout(3 downTO 0)
<=hamin(6 downTO 3);
WHEN "011"=>err<="100";dataout(0)<=NOT hamin
(3);dataout(3 downTO 1)<=hamin(6 downTO 4);
WHEN "101"=>err<="101";dataout(1)<=NOT hamin(4);dataout(3 downTO 2)<=hamin(6 downTO 5);dataout(0)<=hamin(3);
WHEN "110"=>err<="110";dataout(2)<=NOT hamin(5);dataout(1 downTO 0)<=hamin(4 downTO 3);dataout(3)<=hamin(6);
WHEN "111"=>err<="111";dataout(3)<=NOT hamin(6);dataout(2 downTO 0)<=hamin(5 downTO 3);
WHEN OTHERS=>err<="000";
END CASE;
END IF;
END IF;
END PROCESS;
END ONE;
(7,4)汉明码解码器仿真波形如图4所示。例如,当解码器输入hamin[6..0]为0001010,对应的ne为低电平0说明接收的汉明码有1位错误,相应的err为001时,表示错码为a0,经纠错后a0为1,所以正确接收码应为:0001011,对应的解码为0001。从图4可以看出,经解码器解码后,其正确解码结果与编码输入的信息位一致。
在仿真的基础上,将汉明码编解码的配置程序下载到FPGA芯片EP1K30QC208-2,并在EDA实验开发板进行测试,实验结果表明汉明码编解码正确[5]。
4 结论
本文利用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.