基于FPGA的循环冗余校验码的实现

  • 格式:doc
  • 大小:811.00 KB
  • 文档页数:15

摘要:随着EDA技术的发展,FPGA已经在许多方面得到了广泛应用。

循环冗余码校验(CRC)是一种可靠性很高的串行数据校验方法。

本文首先介绍了循环冗余校验码(CRC,cyclic redundancy check)的基本原理,包括生成和校验两个部分。

其中模2除法是基本原理中最为核心的,本文做了着重说明。

其次,还重点分析了其硬件电路的实现方法,并在此基础上基于FPGA用VHDL语言设计了编程程序。

本设计将实现模块分成两部分进行介绍:一部分是CRC生成校验模块,另一部分是显示校验模块。

CRC生成校验模块是CRC 生成模块和校验模块通过握手信号连接起来的,这种方法在很大程度上简化了顶层文件,而显示校验模块主要功能是将发送数据以及生成数据用十六进制数表示,并且通过数码管显示出来,以便于检验程序是否正确。

最后,本文介绍如何利用Quartus Ⅱ分别对CRC生成模块和CRC校验模块进行波形仿真,并对调试验证。

目录摘要 (1)1 引言 (3)2 任务书 (3)3 CRC的研究状况 (4)4 CRC的特征和基本工作原理 (5)4.1 CRC的特征和码集选择的原则 (5)4.2 CRC生成原理 (5)4.3 CRC模块结构图 (6)5 CRC生成器和校验器的设计 (7)5.1 用VHDL设计串行的CRC码传输过程 (7)5.2 VHDL硬件描述语言设计CRC (8)5.2 CRC模块原理图 (11)6 CRC生成器和校验器的硬件实现 (12)7 波形仿真 (13)8 结束语 (13)9 CRC的发展方向 (14)10 致谢 (14)11 参考文献 (14)引言信息在传递过程中,可能因为各种原因使传输或接收的数据发生错误。

为了能在接收端判断数据的正确性,使用校验码是一种常用的方法。

循环冗余校验码CRC(Cyclic Redundancy Code)就是其中的一种。

CRC 在通讯传输中的应用范围十分广泛,如USB 协议、IEEE 802.3 标准、IEEE 802.11 标准、RFID 协议等都采用了 CRC 作为正确性校验的方法。

实际应用的过程一般是在发送端计算发送信息的 CRC 值,并将它作为信息包/帧的一部分传递给接收端;接收端将对接收到的信息进行 CRC 计算,并与发送过来的 CRC 进行比较,从而判断接收的信息是否正确。

CRC 的计算实现可以有多种方法,它可以通过软件方式计算,也可以通过硬件方式计算,还可以通过查表得到。

发送时,CRC的计算过程可以在传输之前完成,也可以在传输过程中进行;对 CRC 的校验可以在接收的同时进行,也可以在传输完成之后进行。

CRC的计算可以是按位串行进行的,也可以是多位并行进行的。

本文将对 CRC 的原理和并行计算方法进行介绍,并以 USB 协议中使用的 CRC的计算硬件设计实现为例进行讨论。

2 任务书3 CRC的研究状况CRC基本原理简单,实现硬件电路简单,且效果较好,目前得到广泛的运用下面这一些常见的标准CRC。

名称生成多项式简记式* 应用举例CRC-4 x4+x+1 3 ITU G.704CRC-12 x12+x11+x3+x+1CRC-16 x16+x15+x2+1 8005 IBM SDLCCRC-ITU** x16+ x12+x5+1 1021ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCSCRC-32 x32+x26+x23+...+ x2+x+1 04C11DB7ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394,PPP-FCSCRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP生成多项式的最高幂次项系数是固定的1,故在简记式中,将最高的1统一去掉了,如04C11DB7实际上是104C11DB7。

** 前称CRC-CCITT。

ITU的前身是CCITT。

备注:(1)生成多项式是标准规定的;(2)CRC校验码是基于将位串看作是系数为0或1的多项式,一个k位的数据流可以看作是关于x的从k-1阶到0阶的k-1次多项式的系数序列。

采用此编码,发送方和接收方必须事先商定一个生成多项式G(x),其高位和低位必须是1。

要计算m位的帧M(x)的校验和,基本思想是将校验和加在帧的末尾,使这个带校验和的帧的多项式能被G(x)除尽。

当接收方收到加有校验和的帧时,用G(x)去除它,如果有余数,则CRC校验错误,只有没有余数的校验才是正确的。

4 CRC的特征和基本工作原理4.1 CRC的特征和码集选择的原则CRC即循环冗余校验码(Cyclic Redundancy Check)是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

但是信息字段和校验字段的长度也要满足一定的要求,即有码集选择原则。

CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R 位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得 V(x)=A(x)g(x)=xRm(x)+r(x);其中:m(x)为K-1次信息多项式, r(x)为R-1次校验多项式, g(x)称为生成多项式,g(x)=g0+g1x1+ g2x2+...+g(R-1)x(R-1)+gRxR发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。

4.2 CRC生成原理经过CRC方式编码的串行发送序列码,可称为CRC码,共有两个部分组成:k位有效信息数据和r位CRC校验码。

其中r位CRC校验码是通过k位有效信息序列被一个事先选择的r+1位“生成多项式”相“除”后得到的(r位余数即是CRC校验码)。

CRC校验码一般在有效信息发送时产生,拼接在有效信息后被发送;在接收端,CRC码用同样的生成多项式相除,除尽表示无误,弃掉r位CRC校验码,接收有效信息;反之,则表示传输出错,纠错或请求重发。

实际的CRC校验生成是采用二进制模2算法得到的,即加法不进位,减法不借位,是一种异或操作。

生成多项式G(x)是经过严格的数学分析和实验后确定的,有相应的国际标准。

下面用一个例子简单说明一下CRC的生成和校验过程。

设发送数据序列为110101110100.生成多项式为G(x)= 5X+1,k=5,X+2X+4对应的序列为110101.将发送数据序列按模2算法被生成多项式序列去除,(其中1000001为Q(x),,01111为R(x))得余数多项式比特序列01111。

将余数多项式比较序列加到新序列中去,得11010111101001111发送数据比特序列 CRC 校验比特序列带有CRC 校验的实际发送比特序列如果数据在传输过程中没有发生差错,那么接收端收到的带CRC 校验比特序列定能被同一生成多项式序列整除,即本设计完成12位信息加5位CRC 校验发送,接收,有两个功能模块构成,CRC 校验生成模块(发送)和CRC 校验检错模块(接收),采用输入、输出都为并行的CRC 校验生成方式。

4.3 CRC 模块结构图用 VHDL 设计并行的 CRC 码传输过程设计输入输出都为并行的 CRC 编码器的基本思想: 信息源的并行传输速度相对串行传输要快的多, 我们就设计一个并行信源, 然后再根据 CRC 算法的基本原理, 利用 VHDL 语言将此并行 CRC 码实现的过程描述出来, 从而简化信息传输流程, 提高了运行速度。

并行 CRC 校验生成模块的设计本设计完成 1210000011111110101111010110101101101011110110101位信息加 5 位 CRC 校验码发送, 接收。

由两个模块构成, CRC 校验生成模块( 发送) 和 CRC 校验生成模块( 接收) 。

采用输入输出都为并行的 CRC 生成校验方式。

CRC 校验生成模块如下图:Sdata latacrco datacrci dfinishDload …… hrecv rdataClk hsend clk error5 CRC 生成器和校验器的设计5.1 用 VHDL 设计串行的 CRC 码传输过程16位串行编码器对2个8位的信息源进行CRC 编码,并产生32位的输出结果,其中前16位为输入的信息位,后16位为CRC 校验位。

串行CRC 码传输过程的原理框图如下图所示。

串行CRC 码传输过程原理框图CRC产生 模块CRC接收 检错模块5.2 VHDL硬件描述语言设计CRC根据CRC的生成原理以及校验原理用VHDL语言将其算法描述出来,并将生成模块与校验模块合二为一,运用hrecv,hsend两个握手信号来协调相互之间的关系。

其具体程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_Unsigned.ALL;ENTITY crc5 ISPORT(clk: IN STD_LOGIC; --系统时钟rst_n: IN STD_LOGIC; --复位信号sdata: IN STD_LOGIC_VECTOR(11 DOWNTO 0); --12位有效信息输入dload: IN STD_LOGIC; --数据装载信号hrecv: IN STD_LOGIC; --握手信号输入. datacrci: IN STD_LOGIC_VECTOR(16 DOWNTO 0);--带5位冗余信息的17位CRC码输入datacrco: OUT STD_LOGIC_VECTOR(16 DOWNTO 0); --带5位冗余信息的17位CRC码输出hsend: OUT STD_LOGIC; --握手信号输出rdata: OUT STD_LOGIC_VECTOR(11 DOWNTO 0); --12位有效信息输出dfinish: OUT STD_LOGIC; --数据接收完毕error01: OUT STD_LOGIC --数据接收错误);END;ARCHITECTURE one OF crc5 ISSIGNAL datacrco_r: STD_LOGIC_VECTOR(16 DOWNTO 0);SIGNAL hsend_r: STD_LOGIC;SIGNAL rdata_r: STD_LOGIC_VECTOR(11 DOWNTO 0);SIGNAL dfinish_r: STD_LOGIC;SIGNAL error01_r: STD_LOGIC;SIGNAL rdatacrc: STD_LOGIC_VECTOR(16 DOWNTO 0);CONSTANT POLYNOMIAL: STD_LOGIC_VECTOR(5 DOWNTO 0):="110101";--生成多项式G(x)=x^5 + x^4 + x^2 + 1BEGINPROCESS(clk,rst_n) --CRC码产生模块. VARIABLE dtemp: STD_LOGIC_VECTOR(11 DOWNTO 0);VARIABLE sdtemp: STD_LOGIC_VECTOR(11 DOWNTO 0);BEGINIF RISING_EDGE(clk) THENIF rst_n='0' THENhsend_r<='0';datacrco_r<=B"0_0000_0000_0000_0000";ELSIF dload='1' THENdtemp :=sdata;sdtemp :=sdata;IF dtemp(11)='1' THENdtemp(11 DOWNTO 6):=dtemp(11 DOWNTO 6) XOR POLYNOMIAL;END IF;IF dtemp(10)='1' THENdtemp(10 DOWNTO 5):=dtemp(10 DOWNTO 5) XOR POLYNOMIAL;END IF;IF dtemp(9)='1' THENdtemp(9 DOWNTO 4):=dtemp(9 DOWNTO 4) XOR POLYNOMIAL;END IF;IF dtemp(8)='1' THENdtemp(8 DOWNTO 3):=dtemp(8 DOWNTO 3) XOR POLYNOMIAL;END IF;IF dtemp(7)='1' THENdtemp(7 DOWNTO 2):=dtemp(7 DOWNTO 2) XOR POLYNOMIAL;END IF;IF dtemp(6)='1' THENdtemp(6 DOWNTO 1):=dtemp(6 DOWNTO 1) XOR POLYNOMIAL;END IF;IF dtemp(5)='1' THENdtemp(5 DOWNTO 0):=dtemp(5 DOWNTO 0) XOR POLYNOMIAL;END IF;datacrco_r<=sdtemp & dtemp(4 DOWNTO 0);hsend_r<='1';ELSEhsend_r<='0';END IF;END IF;END PROCESS;PROCESS(clk,rst_n) --接收端CRC5校验模块. VARIABLE rdtemp: STD_LOGIC_VECTOR(11 DOWNTO 0);BEGINIF RISING_EDGE(clk) THENIF rst_n='0' THENrdata_r <=X"000";dfinish_r <='0';error01_r <='0';ELSIF hrecv='1' THENrdatacrc <=datacrci;rdtemp :=datacrci(16 DOWNTO 5);IF rdtemp(11)='1' THENrdtemp(11 DOWNTO 6):=rdtemp(11 DOWNTO 6) XOR POLYNOMIAL;END IF;IF rdtemp(10)='1' THENrdtemp(10 DOWNTO 5):=rdtemp(10 DOWNTO 5) XOR POLYNOMIAL;END IF;IF rdtemp(9)='1' THENrdtemp(9 DOWNTO 4):=rdtemp(9 DOWNTO 4) XOR POLYNOMIAL;IF rdtemp(8)='1' THENrdtemp(8 DOWNTO 3):=rdtemp(8 DOWNTO 3) XOR POLYNOMIAL;IF rdtemp(7)='1' THENrdtemp(7 DOWNTO 2):=rdtemp(7 DOWNTO 2) XOR POLYNOMIAL;END IF;IF (rdtemp(4 DOWNTO 0) XOR rdatacrc(4 DOWNTO 0))="00000" THENrdata_r <=rdatacrc(16 DOWNTO 5); --校验正确,输出数据. dfinish_r<='1';error01_r<='0';ELSErdata_r<=X"000"; --校验错误,输出全零.error01_r<='1';END IF;ELSEdfinish_r<='0';END IF;END IF;END PROCESS;5.2 CRC模块原理图下图即为CRC测试顶层模块。