1、 1 摘 要: 随着 EDA技术的发展, FPGA已经在许多方面得到了广泛应用。循环冗余码校验( CRC)是一种可靠性很高的串行数据校验方法。 本文首先介绍了循环冗余校验码( CRC, cyclic redundancy check)的基本原理,包括生成和校验两个部分。其中模 2 除法是基本原理中最为核心的,本文做了着重说明。其次,还重点分析了其硬件电路的实现方法,并在此基础上基于FPGA 用 VHDL 语言设计了编程程序。本设计将实现模块分成两部分进行介绍:一部分是 CRC 生成校验模块,另一部分是显示校验模块。 CRC 生成校验 模块是 CRC生成模块和校验模块通过握手信号连接起来的,这种
2、方法在很大程度上简化了顶层文件,而显示校验模块主要功能是将发送数据以及生成数据用十六进制数表示,并且通过数码管显示出来,以便于检验程序是否正确。最后,本文介绍如何利用 Quartus 分别对 CRC 生成模块和 CRC 校验模块进行波形仿真,并对调试验证。 2 目 录 摘 要 . 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 设计串行的 C
3、RC码传输过程 . 7 5.2 VHDL 硬件描述语言设计 CRC . 8 5.2 CRC 模块原理图 . 11 6 CRC 生成器和校验器的硬件实现 . 12 7 波形仿真 . 13 8 结束语 . 13 9 CRC 的发展方向 . 14 10 致谢 . 14 11 参考文献 . 14 3 引言 信息在传递过程中,可能因为各种原因使传输或接收的数据发生错误。为了能在接收端判断数据的正确性,使用校验码是一种常用的方法。循环冗余校验码 CRC( Cyclic Redundancy Code)就是其中的一种。 CRC 在通讯传输中的应用范围十分广泛,如 USB 协议、 IEEE 802.3 标准、
4、IEEE 802.11 标准、 RFID 协议等都采用了 CRC 作为正确性校验的方法。实际应用的过程一般 是在发送端计算发送信息的 CRC 值,并将它作为信息包 /帧的一部分传递给接收端;接收端将对接收到的信息进行 CRC 计算,并与发送过来的 CRC进行比较,从而判断接收的信息是否正确。 CRC 的计算实现可以有多种方法,它可以通过软件方式计算,也可以通过硬件方式计算,还可以通过查表得到。发送时, CRC 的计算过程可以在传输之前完成,也可以在传输过程中进行;对 CRC的校验可以在接收的同时进行,也可以在传输完成之后进行。 CRC 的计算可以是按位串行进行的,也可以是多位并行进行的。本文将
5、对 CRC 的原理和并行计算方法 进行介绍,并以 USB 协议中使用的 CRC 的计算硬件设计实现为例进行讨论。 2 任务书 4 3 CRC 的研究状况 CRC 基本原理简单,实现硬件电路简单,且效果较好,目前得到广泛的运用下面这一些常见的标准 CRC。 名称 生成多项式 简记式 * 应用举例 CRC-4 x4+x+1 3 ITU G.704 CRC-12 x12+x11+x3+x+1 CRC-16 x16+x15+x2+1 8005 IBM SDLC CRC-ITU* x16+ x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
6、 CRC-32 x32+x26+x23+.+ x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS CRC-32c x32+x28+x27+.+x8+x6+1 1EDC6F41 SCTP 生成多项式的最高幂次项系数是固定的 1,故在简记式中,将最高的 1 统一去掉了,如 04C11DB7 实际上是 104C11DB7。 * 前称 CRC-CCITT。 ITU的前身是CCITT。 备注 : ( 1) 生成多项式是标准规定的 ; ( 2) CRC 校验码是基于将位串看作是系数为 0 或 1 的多项式,一个 k 位的数据流可以
7、看作是关于 x的从 k-1 阶到 0阶的 k-1 次多项式的系数序列。采用此编码,发送方和接收方必须事先商定一个生成多项式 G(x),其高位和低位必须是 1。要计算 m位的帧 M(x)的校验和,基本思想是将校验和加在帧的末尾,使这个带校验和的帧的多项式能被 G(x)除尽。当接收方收到加有校验和的帧时,用G(x)去除它,如果有余数,则 CRC 校验错误,只有没有余数的校验才是正确的。 5 4 CRC 的特征和基本工作原理 4.1 CRC 的特征和 码集选择的原则 CRC 即循环冗余校验码 ( Cyclic Redundancy Check) 是数据通信领域中最常用的一种差错校验码 , 其特征是信
8、息字段和校验字段的长度可以任意选定。但是信息字段和校验字段的长度也要满足一定的要求,即有码集选择原则。 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)来验证收到
9、的CRC 码字。 4.2 CRC 生成原理 经过 CRC 方式编码的串行发送序列码,可称为 CRC码,共有两个部分组成:k位有效信息数据和 r位 CRC 校验码。其中 r位 CRC 校验码是通过 k位有效信息序列被一个事先选择的 r+1 位“生成多项式”相“除”后得到的( r位余数即是CRC 校验码)。 CRC校验码一 般在有效信息发送时产生,拼接在有效信息后被发送;在接收端, CRC码用同样的生成多项式相除,除尽表示无误,弃掉 r位 CRC 校验码,接收有效信息;反之,则表示传输出错,纠错或请求重发。 实际的 CRC校验生成是采用二进制模 2算法得到的,即加法不进位,减法不借位,是一种异或操
10、作。生成多项式 G(x)是经过严格的数学分析和实验后确定的,有相应的国际标准。 下面用一个例子简单说明一下 CRC的生成和校验过程。 设发送数据序列为 110101110100.生成多项式为 G(x)= 5X+4+2+1,k=5,6 对应的序列为 110101.将发送数据序列按模 2算法被生成多项式序列去除, (其中 1000001 为 Q(x), 01111为 R(x)得余数多项式比特序列 01111。将余数多项式比较序列加到新序列中去,得 110101111010 01111 发送数据比特序列 CRC校验比特序列 带有 CRC校验的实际发送比特序列 如果数据在传输过程中没有发生差错,那么接
11、收端收到的带 CRC 校验比特序列定能被同一生成多项式序列整除,即本设计完成 12位信息加 5 位 CRC校验发送,接收,有两 个功能模块构成, CRC校验生成模块(发送)和 CRC 校验检错模块(接收),采用输入、输出都为并行的 CRC 校验生成方式。 4.3 CRC 模块结构图 用 VHDL 设计并行的 CRC 码传输过程设计输入输出都为并行的 CRC 编码器的基本思想 : 信息源的并行传输速度相对串行传输要快的多, 我们就设计一个并行信源, 然后再根据 CRC 算法的基本原理, 利用 VHDL 语言将此并行 CRC 码实现的过程描述出来, 从而简化信息传输流程, 提高了运行速度。 并行
12、CRC 校验生成模块的设计本设计完成 12 100000111111101011110101101011011010111101101017 位信息加 5 位 CRC 校验码发送, 接收。由两个模块构成, CRC 校验生成模块 ( 发送 ) 和 CRC 校验生成模块 ( 接收 ) 。采用输入输出都为并行的 CRC 生成校验方式。 CRC 校验生成模块如下图: Sdata latacrco datacrci dfinish Dload hrecv rdata Clk hsend clk error 5 CRC 生成器和校验器的设计 5.1 用 VHDL 设计串行的 CRC 码传输过程 16 位串
13、行编码器对 2个 8位的信息源进行 CRC 编码,并产生 32 位的输出结果,其中前 16位为输入的信息位,后 16位为 CRC 校验位。串行 CRC 码传输过程的原理框图如 下 图所示。 串行 CRC码传输过程原理框图 CRC 产生 模块 CRC 接收 检错 模块 8 5.2 VHDL 硬件描述语言设计 CRC 根据 CRC 的生成原理以及校验原理用 VHDL 语言将其算法描述出来,并将生成模块与校验模块合二为一,运用 hrecv,hsend 两个握手信号来协调相互之间的关系。其具体程序 如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE I
14、EEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY crc5 IS PORT( 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
15、位 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 IS SIGNAL datacrco_r: STD_LOGIC_VECTOR(16 DO
16、WNTO 0); SIGNAL hsend_r: STD_LOGIC; SIGNAL rdata_r: STD_LOGIC_VECTOR(11 DOWNTO 0); 9 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)=x5 + x4 + x2 + 1 BEGIN PROCESS(clk,rs
17、t_n) -CRC码产生模块 . VARIABLE dtemp: STD_LOGIC_VECTOR(11 DOWNTO 0); VARIABLE sdtemp: STD_LOGIC_VECTOR(11 DOWNTO 0); BEGIN IF RISING_EDGE(clk) THEN IF rst_n=0 THEN hsend_r=0; datacrco_r=B“0_0000_0000_0000_0000“; ELSIF dload=1 THEN dtemp :=sdata; sdtemp :=sdata; IF dtemp(11)=1 THEN dtemp(11 DOWNTO 6):=dte
18、mp(11 DOWNTO 6) XOR POLYNOMIAL; END IF; IF dtemp(10)=1 THEN dtemp(10 DOWNTO 5):=dtemp(10 DOWNTO 5) XOR POLYNOMIAL; END IF; IF dtemp(9)=1 THEN dtemp(9 DOWNTO 4):=dtemp(9 DOWNTO 4) XOR POLYNOMIAL; END IF; IF dtemp(8)=1 THEN dtemp(8 DOWNTO 3):=dtemp(8 DOWNTO 3) XOR POLYNOMIAL; END IF; 10 IF dtemp(7)=1
19、THEN dtemp(7 DOWNTO 2):=dtemp(7 DOWNTO 2) XOR POLYNOMIAL; END IF; IF dtemp(6)=1 THEN dtemp(6 DOWNTO 1):=dtemp(6 DOWNTO 1) XOR POLYNOMIAL; END IF; IF dtemp(5)=1 THEN dtemp(5 DOWNTO 0):=dtemp(5 DOWNTO 0) XOR POLYNOMIAL; END IF; datacrco_r=sdtemp hsend_r=1; ELSE hsend_r=0; END IF; END IF; END PROCESS;
20、PROCESS(clk,rst_n) -接收端 CRC5校验模块 . VARIABLE rdtemp: STD_LOGIC_VECTOR(11 DOWNTO 0); BEGIN IF RISING_EDGE(clk) THEN IF rst_n=0 THEN rdata_r =X“000“; dfinish_r =0; error01_r =0; ELSIF hrecv=1 THEN rdatacrc =datacrci; rdtemp :=datacrci(16 DOWNTO 5); IF rdtemp(11)=1 THEN rdtemp(11 DOWNTO 6):=rdtemp(11 DOWNTO 6) XOR POLYNOMIAL;
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。