VHDL的CRC编码器的设计
2012-06-02
郑春来

CRC码是线性分组码的一个重要子集,它是为了保证通信系统中的数据传输可靠性而采取的信道编码技术。CRC码除了具有分组码的线性外,还具有循环性,其码字结构一般用符号(n,k)表示,其中,n是该码组中的码元数,k是信息码位数,r=n-k是监督码元位数。循环码具有许多特殊的代数性质,这些性质有助于按照要求的纠错能力系统地构造这类码,并能相应地简化译码算法。目前应用的CRC编码器主要由硬件电路实现,可以保证编码的快速性和实时性,但其缺点是系统复杂,可维护性差。本文介绍了一种以EDA设计工具MAX+PLUSII软件为基础,利用VHDL语言设计一个CRC(7,3)编码器的方法,采用此方法实现的编码器具有编码速度快,可靠性高以及易于大规模集成等优点。

1 编码原理

在CRC(7,3)编码过程中,要将任意的三位信息码转换为CRC码,实施编码时的主要决定因素有两个:信息码多项式m(x)和生成多项式g(x)。

信息码多项式就是以待转换信息码字为系数所构成的多项式,一旦信息码确定,则该多项式就是唯一的。信息码多项式只是编码器处理的对象,在整个编码过程中起决定作用的是生成多项式。

以CRC(7,3)码构成来说明生成多项式在编码中的作用,如表一所示。

表一 CRC(7,3)码构成过程

由表一所示的构成2k-1=7个非全0码字多项式的过程与结果看,编码时从x4+x3+x2+x=T(x)开始进行逐一循环,并以模x7+1进行运算,该码字正是信码组中最低位为1,对应码字多项式T(x),在全部非全0码字中,它的最高位阶次也最低,并等于n-k=4,即最高次项为x4。随后一系列码字都源于它的移i位(i=1,2,1,6)而形成,因此称其为生成多项式g(x),即生成多项式是(x7+1)的一个最高阶次为 (n-k)即4的因子,再将x7+1分解如下:

x7+1=(x+1)(x3+x+1)(x3+x2+1)

从该分解式中可以看到其中可以组合为二因式中包含最高次为4次的情况有两种,即

g1(x)=(x+1)(x3+x+1)=x4+x3+x2+x

g2(x)=(x+1)(x3+x2+1)=x4+x2+x+1

这两个式子都可以作为生成多项式,所不同的是选用不同的生成多项式所生成的CRC码组不同。

当信息码多项式m(x)(次数小于k)和生成多项式g(x)确定以后,用xn-k乘m(x),得到xn-k(x)的次数必然小于n。用g(x)除xn-km(x),得到余式r(x),r(x)的次数必小于g(x)的次数,即小于(n-k)。将此余式加与xn-km(x)之后作为监督位。得到的多项式就是CRC码多项式,通过CRC码多项式的系数即可得到所编的CRC码字。

2 编码器设计

2.1编码框图

CRC编码器的主体是由移位寄存器和模2除法器构成的除法电路,通过逻辑开关的控制实施信息码的输入和CRC码的输出,编码电路框图如图一所示。

2.2 VHDL实现

本次设计的CRC编码器,利用MAXPLUS II软件平台,据CRC编码原理,采用VHDL文本输入法。为了提高编码的速度,在设计时采用信息位并行输入,CRC码并行输出的算法。程序经编辑调试通过后所生成的编码模块如图二所示。具体程序代码如下:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity yancrc4 is

port(sdata : in STD_LOGIC_VECTOR(2 DOWNTO 0);

datacrco :out STD_LOGIC_VECTOR(6 DOWNT 0);

hsend :out std_logic;

clk,datald:IN_STD_LOGIC

);

END yancrc4;

ARCHITECTURE rtl OF yancrc4 IS

constant multi_coef : STD_LOGIC_VECTOR(4 DOWNTO 0) :="10111";

SIGNAL cnt,rcnt,ttemp :STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL dtemp :STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL sdatam,rdtemp:STD_LOGIC_VECTOR(2 DOWNTO 0);

SIGNAL rdatarcr:STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL st,rt:STD_LOGIC;

BEGIN

process(clk)

variable crcvar :STD_LOGIC_VECTOR(4 DOWNTO 0)

begin

if clk'event and clk='1''then

if st='0' and datald='0' then

-crcvar:=crcvar(3 downto 0)&'0';

dtemp<=sdata&'0'&'0'&'0'&'0';

sdatam<=sdata;

-crcvar:=sdata

cnt<= (others=>'0');

hsend<= '0';

st<='1';

elsif st='1'and cnt<3 then

cnt<= cnt+1;

if dtemp(6)='1'then

crcvar:=dtemp(6 downto 2)xor multi_coef;

dtemp<=crcvar(3 downto 0)& dtemp(1 downto 0)&'0';

else

dtemp<=dtemp(5 downto 0)&'0';

end if;

elsif st='1' and cnt=3 then

hsend<='1';

elsif st='1' and cnt=4 then

hsend<='0';

st<='0';

end if;

end if;

end process;

end rtl;

2.3仿真结果

系统设计完成后仿真结果如图三所示。

3 结束语

本次设计的CRC编码器经下载测试,具有编码速度快、编码准确率高等特点,达到了预期的设计要求。所生成的CRC编码模块可以以存档模块的方式存储在模块库中,这为后续开发CRC编译码系统奠定了良好的基础,同时也可以使该模块成为其他设计人员可共享的设计资源。

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号