循环冗余校验模块的FPGA设计.doc_第1页
循环冗余校验模块的FPGA设计.doc_第2页
循环冗余校验模块的FPGA设计.doc_第3页
循环冗余校验模块的FPGA设计.doc_第4页
循环冗余校验模块的FPGA设计.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录引言3 CRC的研究状况33 CRC的特征和基本工作原理43.1 CRC的特征和码集选择的原则43.2 CRC生成原理43.3 CRC模块结构图54 CRC生成器和校验器的设计54.1 VHDL硬件描述语言设计CRC51) CRC编码解码程序52)显示验证模块85 CRC生成器和校验器的硬件实现135.1利用Quartus 进行调试135.2检验CRC生成器和校验器146 CRC的发展方向14结束语14参考文献15循环冗余校验模块的FPGA设计摘 要:本文首先介绍了循环冗余校验码(CRC,cyclic redundancy check)的基本原理,包括生成和校验两个部分。其中模2除法是基本原理中最为核心的,本文做了着重说明。其次,还重点分析了其硬件电路的实现方法,并在此基础上基于FPGA用VHDL语言设计了编程程序。本设计将实现模块分成两部分进行介绍:一部分是CRC生成校验模块,另一部分是显示校验模块。CRC生成校验模块是CRC生成模块和校验模块通过握手信号连接起来的,这种方法在很大程度上简化了顶层文件,而显示校验模块主要功能是将发送数据以及生成数据用十六进制数表示,并且通过数码管显示出来,以便于检验程序是否正确。最后,本文介绍如何利用Quartus 分别对CRC生成模块和CRC校验模块进行波形仿真,并对调试验证。关键词:循环冗余校验码;模2除法;VHDL语言;Quartus The Design of CRC Based on FPGAZhang Yun,The College of Physics and Electronic InformationAbstract:This paper not only introduces basic principle and calculating method of CRC, including production principle and verification principle, which the most important principle of is module2 division, but also presents a hardware implementation of CRC on FPGA with the VHDL language and how to debug program by Quartus II. The realization module divides into two parts: a part is the CRC code decoding module,and another part is the demonstration and verification module. The CRC code decoding module is the CRC production module and the verification module combined through the handshake signal, so that the programming procedure is simplified to a great extent, while the main function of the demonstration and verification module is to transmit the data as well as the production data indicated with the sexadecimal number, and to demonstrate through the nixietube, which is advantageous for testing.In the debugging process, separately carries on the profile simulation to the CRC production module and the CRC verification module by Quartus II.Key words:CRC, module2 division, VHDL, Quartus II.引言数字通信要求传输过程中所造成的数字差错足够低。引起传输差错的根本原因是信道内存在噪声及信道传输特性不理想造成的码间串扰。为了尽可能地提供通信的可靠性,就需要采用信道编码技术,对可能或已经出现的差错进行控制,CRC码就是其中的一种编码技术。 CRC的研究状况 CRC基本原理简单,实现硬件电路简单,且效果较好,目前得到广泛的运用下面是一些常见的标准CRC。 名称 生成多项式 简记式* 应用举例 CRC-4 x+x+1 3ITU G.704 CRC-12 x+x+x+x+1 CRC-16 x+x+x+1 8005 IBM SDLC CRC-ITU* x+ x+x+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS CRC-32 x+x+x+.+ x+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS CRC-32c x+x+x+.+x+x+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校验错误,只有没有余数的校验才是正确的。 3 CRC的特征和基本工作原理3.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码字。 3.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)= +1,k=5,对应的序列为110101.将发送数据序列按模2算法被生成多项式序列去除,(其中1000001为Q(x),01111为R(x)得余数多项式比特序列01111。将余数多项式比较序列加到新序列中去,得 11010111101001111 发送数据比特序列 CRC校验比特序列 带有CRC校验的实际发送比特序列。如果数据在传输过程中没有发生差错,那么接收端收到的带CRC校验比特序列定能被同一生成多项式序列整除,即本设计完成12位信息加5位CRC校验发送,接收,有两个功能模块构成,CRC校验生成模块(发送)和CRC校验检错模块(接收),采用输入、输出都为并行的CRC校验生成方式3.3 CRC模块结构图CRC校验码接收检错模块CRC 校验码产生模块 Sdata datacrco datacrci dfinish Dload hsend 。hrecv rdata Clk RC clk error4 CRC生成器和校验器的设计4.1 VHDL硬件描述语言设计CRC1) 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 crc5ISPORT(clk: IN STD_LOGIC;-系统时钟rst_n:INSTD_LOGIC;-复位信号sdata: INSTD_LOGIC_VECTOR(11 DOWNTO 0); -12位有效信息输入dload:INSTD_LOGIC;-数据装载信号hrecv:INSTD_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)=x5 + x4 + x2 + 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)THENIFrst_n=0 THENhsend_r=0;datacrco_r=B0_0000_0000_0000_0000;ELSIFdload=1THENdtemp:=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=0THENrdata_r=X000;dfinish_r=0;error01_r=0;ELSIFhrecv=1THENrdatacrc=datacrci;rdtemp:=datacrci(16 DOWNTO 5);IFrdtemp(11)=1THEN rdtemp(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;END IF;IF rdtemp(8)=1 THENrdtemp(8 DOWNTO 3):=rdtemp(8 DOWNTO 3) XOR POLYNOMIAL;END IF;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=X000;-校验错误,输出全零.error01_r=1;END IF;ELSEdfinish_r=0;END IF;END IF;END PROCESS;2)显示验证模块利用实验面板的8块数码显示管将发送数据以及生成的新数据,以便于我们检查是否正确。发送数据有12位,用3位十六进制数表示,每一位用一个数码管显示;生成的新数据有17位,将5位CRC校验码前补3个零,从而新数据变成20位,用5位十六进制数表示,用5个数码管显示。其中也有键盘消抖程序,数码管显示程序。具体程序如下:LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_Unsigned.ALL;ENTITY crc5_test ISPORT(clock:INSTD_LOGIC;key: INSTD_LOGIC_VECTOR(4 DOWNTO 0);sdata: OUT STD_LOGIC_VECTOR(11DOWNTO 0); -3位16进制数输出(在数码管13显示)rdata:IN STD_LOGIC_VECTOR(11 DOWNTO 0); -3位16进制数输入(在数码管68显示)crc: IN STD_LOGIC_VECTOR(4 DOWNTO 0); -crc冗余码输入.dload: OUT STD_LOGIC;-加载信号输出rst_n: OUT STD_LOGIC;-复位信号输出.led : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -数码管段码输出dig: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) -数码管位码输出);END;ARCHITECTURE one OF crc5_test ISSIGNAL seg_r: STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL dig_r: STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL sdata_r: STD_LOGIC_VECTOR(11 DOWNTO 0);SIGNAL dload_r: STD_LOGIC;SIGNAL rst_n_r: STD_LOGIC;SIGNAL count: STD_LOGIC_VECTOR(16 DOWNTO 0); -时钟分频计数器SIGNAL dout1,dout2,dout3: STD_LOGIC_VECTOR(4 DOWNTO 0);-消抖寄存器SIGNAL cnt3: STD_LOGIC_VECTOR(2 DOWNTO 0); -数码管扫描计数器SIGNAL disp_dat: STD_LOGIC_VECTOR(3 DOWNTO 0); -数码管扫描显存SIGNAL k_debounce: STD_LOGIC_VECTOR(4 DOWNTO 0);-按键消抖输出SIGNAL clk: STD_LOGIC;-分频时钟,用于消抖和扫描.SIGNAL key_edge: STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINPROCESS(clock)BEGINIF RISING_EDGE(clock) THENIF count120000 THENcount=count+1;clk=0;ELSEcount=B0_0000_0000_0000_0000;clk=1;END IF;END IF;END PROCESS;-按键消抖部分PROCESS (clock)BEGINIF RISING_EDGE(clock) THENIF clk=1 THENdout1=key;dout2=dout1;dout3=dout2;END IF;END IF;END PROCESS;PROCESS (clock)BEGINIF RISING_EDGE(clock) THENk_debounce=dout1 OR dout2 OR dout3;-按键消抖输出.END IF;END PROCESS;key_edge=NOT (dout1 OR dout2 OR dout3) AND k_debounce;-3位16进制输出部分PROCESS(clock)-按键1BEGINIF RISING_EDGE(clock) THENIF key_edge(0)=1 THENsdata_r(11 DOWNTO 8)=sdata_r(11 DOWNTO 8)+1;END IF;END IF;END PROCESS;PROCESS(clock)-按键2BEGINIF RISING_EDGE(clock) THENIF key_edge(1)=1 THENsdata_r(7 DOWNTO 4)=sdata_r(7 DOWNTO 4)+1;END IF;END IF;END PROCESS;PROCESS(clock)-按键3BEGINIF RISING_EDGE(clock) THENIF key_edge(2)=1 THENsdata_r(3 DOWNTO 0)=sdata_r(3 DOWNTO 0)+1;END IF;END IF;END PROCESS;PROCESS(clock)-按键4BEGINIF RISING_EDGE(clock) THENIF key_edge(3)=1 THENdload_r=NOT dload_r;END IF;END IF;END PROCESS;rst_n_r=k_debounce(4);-按键5PROCESS(clock)BEGINIF RISING_EDGE(clock) THENIF clk=1 THENcnt3disp_datdisp_datdisp_datdisp_datdisp_datdisp_datdisp_datdisp_datdig_rdig_rdig_rdig_rdig_rdig_rdig_rdig_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_rseg_r seg_r=XFF;END CASE;END PROCESS;seg=seg_r;dig=dig_r;sdata=sdata_r;dload=dload_r;rst_n=rst_n_r;led=(NOT dload_r) & rst_n_r);END;4.2 CRC模块原理图下图即为CRC测试顶层模块。顶层模块图主要是根据程序自动生成的,便于对硬件的理解。5 CRC生成器和校验器的硬件实现 5.1利用Quartus 进行调试 其具体步骤如下:1. 启动Quartus II 建立一个空白工程,然后命名为crc5.qpf。2. 新建Verilog HDL源程序文件crc5.v,写出程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。3. 建立波形仿真文件并进行仿真验证,分析其运行最高时钟频率。4. 将crc5_test.bsf,crc5_test.v拷贝到工程目录中。5. 新建图形设计文件进行硬件测试,命名为crc5_top.bdf并保存。6. 选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为Altera公司Cyclone系列的EP1C6Q240C8芯片,引脚锁定方法如表3.21所示。将未使用的管脚设置为三态输入(一定要设置,否则可能会损坏芯片)。表 3.21 引脚锁定方法信号 引脚信号 引脚信号 引脚1C61C12EDA1C61C12EDA1C61C12EDASeg0169169169dig1159159159key2123123123Seg1170170170dig2162162162key3124124124Seg2167167167dig3161161161key4143143143Seg3168168168dig4204236215led0505050seg4165165165dig5199237216led1535353seg5166166166dig6198238213dfinih545454seg6163163163dig7205239214error555555seg7164164164key0121121121clock282828dig0160160160key1122122122 7.将crc5_top.bdf设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。8. 硬件连接,下载程序。1) 如果核心板是QuickSPOC-1C12需执行此步骤,如果不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论