kaiyun官方注册
您所在的位置: 首页> 可编程逻辑> 设计应用> 基于VHDL的汉明码编解码器实现
基于VHDL的汉明码编解码器实现
2014年微型机与应用第24期
孙志雄,谢海霞
(琼州学院 电子信息工程学院,海南 三亚 572022)
摘要:介绍了汉明码的原理,分析了汉明码编码、解码电路设计思路。利用VHDL语言设计(7,4)汉明码编解码器并通过Quartus II仿真平台进行仿真验证,最后下载到FPGA芯片EP1K30QC208-2实现了汉明码编解码电路。仿真及实验结果证明,该方法实现的汉明码编解码电路方案正确,并具有速度快、修改方便、可移植性好等优点。
Abstract:
Key words :

摘 要: 介绍了汉明码的原理,分析了汉明码编码、解码电路设计思路。利用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]。

005.jpg

2.png

  在信息传输中,在发送端编码时,信息位a6、a5、a4和a3的值由输入信号决定,是随机的。监督位a2、a1和a0根据信息位的取值按监督关系来确定,即监督位应使S2、S1和S0的值为0,如式(3)所示,即表示发送端编成的码组中应无错码。

3.png

  式(3)经过移项运算,解出监督位a2、a1和a0,如式(4)所示。

4.png

  因此,(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;

001.jpg

  用VHDL语言完成的汉明码编码器设计电路符号如图1所示,其中datain[3..0]为输入的4位信息码;en为编码输入使能端,高电平有效;hamout[6..0]为汉明码编码输出,其高4位hamout[6..3]为信息位,其低3位hamout[2..0]为监督位。

002.jpg

  实现的(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的汉明码解码仿真

003.jpg

  用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;

004.jpg

  (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.


此内容为AET网站原创,未经授权禁止转载。
Baidu
map