原创 【转】VHDL的CRC编码器的设计

2010-11-25 19:41 1532 6 6 分类: FPGA/CPLD
 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编译码系统奠定了良好的基础,同时也可以使该模块成为其他设计人员可共享的设计资源。


文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条