基于FPGA的CRC编解码器设计说明书
基于FPGA的CRC编解码器设计说明书,基于,fpga,crc,编解码器,设计,说明书,仿单
设计任务书课题: 基于FPGA的CRC编解码器设计 专业学生姓名班级学号指导教师专业系主任发放日期XXX1. 毕业设计(论文)任务的内容和要求(包括原始数据、技术要求、工作要求)1、 主要内容以及技术参数在通信系统中,数据在传输过程中,由于通道传输特性不理想,并且受到干扰或噪声的影响。循环冗余校验(CRC)是一种最常用的信道编码方法,广泛应用于通信领域以提高数据传输的可靠性。随着半导体技术的迅速发展,在现代数字系统设计中,FPGA和CPLD的使用越来越广泛。与此同时,基于大规模可编程逻辑器件的EDA硬件通信解决方案也被广泛采用。分析CRC编解码算法,采用VHDL语言实现CRC码的生成和校验模块。在Quartus II+ModelSim的仿真平台上进行仿真验证。2、设计中要求做的工作a) 搭建Quartus II+ModelSim仿真开发平台。b) 搞清楚CRC工作原理。c) 给出CRC实现思路。d) 完成系统程序的编写。e) 仿真调试。f) 完成毕业设计论文的编写。3、 工作要求a) 对待设计工作要具有认真的态度、严谨的作风b) 要求每天按照计划保质保量地完成当天的任务c) 遵守设计场所的纪律制度,做好值日生工作2. 图纸内容及张数:1、系统总体实现框图 1张3. 实物内容及要求(包括开题报告、毕业设计说明书(论文)、源程序、成果实物、资料光盘等):(1) 完成毕业实习报告一份。(2) 完成开题报告一份。写明课题研究的意义,设计或研究的思路,采用的主要器件,以及设计最终所获得的成果。详细列出在毕业设计期间各个时间段要完成的工作。(3) 完成8000字的资料摘要一份。(4) 完成与本课题相关的外文资料译文一份(3000汉字以上)。(5) 按照盐城工学院毕业设计(论文)教学工作手册中的要求完成毕业设计说明书一份。符合学校制定的本科毕业设计(论文)的格式要求、字数要求,文笔流畅、条理清晰,无原则性错误。任务书、开题报告、设计说明书等资料刻成光盘。4. 其他:无5. 参考文献: 1 梅文龙,王辉. 基于FT245BM和FPGA的数据采集设计J. 电子技术应用. 2013(06) 2 周悦芝,董代洁. 基于FPGA的计算机系统接口实验平台的设计与研制J. 实验技术与管理. 2013(05) 3 陈乔,姚远,梁志毅. 基于FPGA的高帧频CCD成像系统设计J. 科学技术与工程. 2013(12) 4 初华,万强,曹海源,张广远,黎伟. 基于DSP和FPGA的数字示波器设计J. 自动化仪表. 2013(03) 5 潘家顶,杨光杰. TS流的CRC译码器设计J. 现代电子技术. 2012(19) 6 霍旭东,朱卫华. 大数据量高复杂度CRC校验的串并优化设计J. 铁道通信信号. 2012(04) 7 杨利娟,陈多观. 循环冗余校验CRC的分析及硬件实现J. 苏州科技学院学报(自然科学版). 2010(04)8 黄戈,余松煜,管云峰,潘宇. LDPC码构造及编译码技术研究J. 光通信技术. 2006(02) 9 王文君,朱晓暄,康桂霞,张平. 结构化LDPC码的高速编译码器FPGA实现J. 数据采集与处理. 2008(S1) 10 刘朋利,何欢. 基于ACE约束的S-IRA编译码器设计J. 山西电子技术. 2010(02) 11 周美红,黎海涛,陈晨. IEEE802.11n信道编译码器的FPGA设计J. 中国电子科学研究院学报. 2010(05)6. 毕业设计(论文)进度计划起讫日期工 作 内 容备 注3月8日3月28日毕业实习以及毕业设计的前期工作,完成中文文献摘要、英文文献翻译、实习报告和设计的开题报告3月29日4月7日进行开题陈述和答辩,设计正式开题4月8日4月14日软件开发平台搭建4月15日5月10日CRC工作原理5月11日5月24日用VHDL语言实现5月25日6月10日仿真调试与优化6月11日6月20日撰写毕业设计说明书,准备毕业答辩6月21日6月27日完成毕业答辩以及设计资料的归档工作7.教师签字: 制定日期: 年 月 日8. 审批专业系意见:专业系主任(签字) 年 月 日 设计开题报告课题:基于FPGA的CRC编解码器的设计专业学生姓名班级学号指导教师专业系主任撰写日期XXXXX课题名称:基于FPGA的CRC编解码器的设计课题类型: () 应用型 ( ) 研究型1. 本课题的意义(本部分字数不小于600字)在高速通信系统中,为了适应速度和通信传输的要求,CRC校验部分往往都设计为串行输入的硬件实现。在数字通信系统中可靠与快速往往是一对矛盾的词。若要求快速,则必然使得每个数据码元所占的时间缩短、波形变窄、数量减少,从而在受到干扰后产生错误的可能性增加,传送信息的可靠性下降。若是要求可靠,则使得传送信息的可靠性下降。若是要求可靠,则使得传送消息的速率变慢。因此,如何合理地解决可靠性和速度这一对矛盾,是正确设计一个通信系统的关键问题之一。引起传输差错的根本原因是信道内存在噪声及信道传输特性不理想造成的码间串扰。为了尽可能地提供通信的可靠性就需要采用信道编码技术,对可能或已经出现的差错进行控制,CRC码就是其中的一种编码技术。循环冗余校验是由分组线性码的分支而来,其主要应用是二元码组。编码简单而且误判概率很低,在通信系统中得到广泛的应用,各种现场总线协议中的数据帧的校验一般采用这种检验方式。循环冗余校验(Cyclic redundancy check,CRC)是一类重要的线性分组码,因其编码和解码的方法简单、检错纠错能力强而被广泛应用于许多领域以实现差错控制。目前已经有多种CRC的生成多项式被列为国际标准中,如在数字通信中使用的CRC-4、CRC-16以及ZIP,RAR,LANFDDI,IEEE1394中使用的CRC-32等。数字通信中的CRC实现主要分为硬件实现和软件实现两类。近年来迅速发展的FPGA技术改变了基于芯片集成的数字系统设计理念,在使用FPGA实现复杂数字系统时,可以利用FPGA的剩余资源实现一些简单的功能模块如(UART,CRC等)以替代专用集成电路芯片(ASIC),从而提高系统的集成度。循环冗余码CRC校验技术广泛应用于检测及通信领域,是当前在信源编码中用来降低误码率的有效手段之一。2. 课题的基本内容: CRC码由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码。实际的CRC校验生成是采用二进制模2算法得到的,即加法不进位,减法不借位,是一种异或操作。如果数据在传输过程中没有发生差错,那么接收端收到的带CRC校验比特序列定能被同一生成多项式序列整除,即本设计完成12位信息加5位CRC校验发送,接收,有两个功能模块构成,CRC校验生成模块(发送)和CRC校验检错模块(接收),采用输入、输出都为并行的CRC校验生成方式。3. 课题的研究方法、技术路线、设计(研究)方案:研究方法:搞清楚CRC码的原理,分析CRC编码、解码电路设计思路.利用VHDL语言设计CRC编解码器并通过Quartus仿真平台进行仿真验证,最后下载到FPGA芯片实现CRC编解码电路.技术线路:运用CRC编码的原理,分析CRC的三种算法:比特型算法、查表型算法以及公式法,并进行公示推导,可以得到CRC码的产生与校验算法,并利用软件实现。设计方案:结合多数字信号处理间串行通信的应用,采用标准的CRC码,设计系统结构,写入模块代码。4. 课题的效果预测 本课题CRC编解码器的设计运用FPGA实现时由于内部的LUT单元可实现任何4输入的组合逻辑,故该设计的最大延迟有两个逻辑门的延迟。编码器设计无误,则输出的循环码与计算结果一致。解码器输出为正确信息序列,信号位为低电平,解码正确,如果输出为接受信息与输入信息一致且信息位为高电平则接受误码。5. 毕业设计(论文)进度计划起讫日期工 作 内 容备 注3月8日3月28日毕业实习以及毕业设计的前期工作,完成中文文献摘要、英文文献翻译、实习报告和设计的开题报告3月29日4月7日进行开题陈述和答辩,设计正式开题4月8日4月14日软件开发平台搭建4月15日5月10日CRC工作原理5月11日5月24日用VHDL语言实现5月25日6月10日仿真调试与优化6月11日6月20日撰写毕业设计说明书,准备毕业答辩6月21日6月27日完成毕业答辩以及设计资料的归档工作6. 开题报告审批意见指导教师意见:指导教师(签字):年 月 日专业系意见:专业系主任(签字):年 月 日毕业设计外文翻译专业电气工程及其自动化学生姓名张志成班级电气115学号1110603517指导教师周磊专业系主任顾春雷撰写日期2015.3.06电气工程学院5 基于FPGA的CRC编解码器的设计摘要:CRC校验码是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。它依靠某种数学上约定的形式进行检查。校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。接收端根据同样的规则校验,以确定传送中是否出错。CRC循环冗余校验具有比奇偶校验强得多的检错能力。在实际设计中CRC校验码获得了非常广泛的应用。本论文首先介绍了FPGA的基本知识,包括对FPGA的开发软件工具Quartus II 和硬件描述语言VHDL的详细介绍,然后对循环校验码的原理进行了分析,给出设计方案,进行编写VHDL代码设计,用Quartus II软件自动生成封装图进行连线,利用Modelsim进行软件仿真,并对结果与进行验证,验证显示设计完全正确。关键词:CRC;VHDL;FPGA;检错 Cyclic code circuit design based on FPGA Abstract:CRC checksum is the most common kind of error checking code in data communications, that the length of the information field and a check field can be arbitrarily selected is its feature. It checks relaying on some kind of agreement in the form of mathematics. Whether results of the check is reliable, if its reliable,then process the data, if its not reliable, then discarded and retransmitted or repair. The basic idea of CRC check is using linear coding theory, at the transmitting end according to k-bit binary code sequence to be transmitted, in certain rules to generate a r bits -checksum(this is CRC data). And attached the information to the back, to form a new binary Total number of code sequences (k + r) bits, and finally sent. The receiving end according to the same rules check to determine whether transmission error. CRC cyclic redundancy check error detection capability than parity much stronger. In the actual design of CRC received very wide range of applications.This thesis introduces the basic knowledge of FPGA, including details of Quartus II development software tools of FPGA and hardware description language VHDL. Then analysised the principle of cyclic checksum, be written in VHDL code design automatically generated by the Quartus II software package, and wiring diagram. Using Modelsim simulation software to simulate, and verif the results and the verification display design is correct.Keywords: CRC ; VHDL;FPGA; error detection目 录1概述11.1 背景意义11.2 发展现状11.3 EDA技术21.4 课题的主要工作22 算法实现42.1 CRC编解码理论42.2 模2运算原理62.3 CRC基础计算62.4 CRC编码方法82.4.1 CRC产生操作过程92.5循环码解码方法92.5.1 CRC解码操作过程103 仿真实现113.1 仿真实现方案分析113.1.1 查表法实现方案分析113.1.2逐位运算法实现方案分析123.1.3 需求分析143.2 编解码设计143.2.1 编码模块143.2.2 解码模块173.3 仿真验证193.3.1 编码器仿真193.3.2 解码器仿真213.4分析与总结234 结束语25参考文献26致谢27附录1:程序清单28附录2:设计图纸31基于FPGA的CRC编解码器的设计1概述1.1 背景意义如今科技的发展突飞猛进,尤其是在通训这个方面,几乎人手一部手机、一台PC。然而人们在物质水平提高的同时,对科技的需求也越来越高。比如在通信方面,人们会要求各种信息、数据准确无误的传达,并且一定要足够清晰,几乎不受外界的干扰。但在实际应用中,传输数据的无线信道非常复杂。由于信道有时变性、衰减性、带宽资源有限、干扰大等特点。信号会受到信道噪声的干扰,也会因为信道本身的复杂衰落变化而造成影响;而这两种因素也是导致接收出现误码的主要原因。对于话音或图像,误码会造成话音或图像质量的下降;而对于各种数据文件,误码则可能使得整个文件作废。差错控制中的循环码技术正是降低误比特率、提高通信质量的主要技术手段之一。在本课题的研究中,我们还要涉及到VHDL语言的编程,利用它来实现差错控制中的循环码。即使使用当前最先进的计算机,如果使用人类语言来描述数字系统,并希望计算机能够理解设计者的意图,这仍然是不可能的。计算机要求定义具有严格规则的语言。VHDL就是一种应用广泛的计算机编程语言。通过本课题的研究,我可以深入了解循环码,熟悉并掌握其实现方法;熟悉VHDL的编程方法,并能熟练地运用VHDL编程实现循环码CRC-8实现电路;熟悉Quatus 的基本功能,能利用它进行仿真并用其产生电路,实现循环码的功能;掌握通信原理二次开发模板上各个按钮的功能,并能在二次模板上实现循环码的实测。由此亲身体验循环码在生活中的重要性。1.2 发展现状信息在传递数据的过程中,有可能会因为某种因素使信息所包含的数据发生错误.为了减少并且防止这一类错误的发生,除了从外部减弱干扰提高可靠性外,也应该在数据的编码上完成检查错误和纠正错误的过程。可以这样来完成:在要传递的数据代码中加入数个校验位,在传递的过程中如果收到干扰发生错误就会生成错误代码而被发现,更能够根据错误代码而确定错误的位置并且纠错。这就是校验码。当传递数据时校验位和数据位一起被发出,如果在传输过程中没有错误发生时,接收的一方去掉校验位而留住数据位,否则检验后得到正确的代码,或请求重传(错误检测码),其中循环冗余校验可以实现两种功能,而且误差校正(关于选择和生成多项式),是一个以数据块为对象有效和可靠的误差检测和校正方法,因为它的编解码器设计简单,强纠错功能和低的概率发生错误的判断,这已经在工业测量和控制应用程序和通信系统中应用很广。FPGA在过去30年产生了长足的发展。尤其是工艺的不断提高使得FPGA的生产成本不断降低,同时性能却在大幅度的提升。他的应用成本已经能够为一些设计所接受。另外由于其具有通用性好,代码的可移植性强。设计的保密性和稳定性高等特点受到越来越多的设计者青睐,他们已经不再只是军工领域的专享产品。由于FPGA的结构可以很好的并行,适合做大量的数据处理的工作。能更有效的保证系统的实时性,另外基于FPGA的设计能够具有很好的灵活性和可重用性。1.3 EDA技术EDA是一门新兴技术,发展快速,它在设计上的载体主要是规模庞大并且可以编程运行的逻辑器件。主要的系统描述方式是硬件描述语言。可以自动用软件完成各种设计,非常的方便快捷。国际上对于EDA应用的范畴很宽。在机械、通信、航天航空、化工、电子、医学等多个领域中都有广泛的应用。相比之下国内定义的EDA范围就比较狭隘了,主要是指IC、PCB以及电子电路的设计。本次设计所涉及的EDA技术主要是对CRC生成及校验进行验证仿真,先通过Quartus 对设计程序进行编译无误后,再使用Modelsim仿真验证,确保设计可以准确无误的运行。FPGA是现场可编程门阵列的简称,可分为逻辑元件、输入输出元件和连线三个部分,最能代表的优点就是高集成度,高速和高可靠性。时钟延时短,在很多应用领域具有广阔的应用前景。设计完善的话,不会出现别的软件会出现的一系列问题。而且它的集成规模很大,可以用EDA技术进行前期设计和后期开发。强大的兼容性使得FPGA可以与EDA技术很好的结合在一起,使得产品的设计速度大幅变快。VHDL语言是一种设计数字电子系统的描述语言,在美国发起,经过一段时间的调整、完善、开发,最终标准化并且使得集成电路高度系统化。VHDL的语法很严格,描述方法多样,对新手来说难以上手,但是对于熟练的用户来说就是一种很棒的编程语言。归纳起来,VHDL语言具有以下优点:功能强大,设计方式多样;具有强大的硬件描述能力;具有很强的移植能力;设计描述与器件无关;程序易于共享和复用。Quartus II 13.1是Altera公司淘汰Maxplus II后开发出来的一款PLD开发平台软件。支持多种设计以及器件的开发,并且还支持多种设计方式,内部自带多种综合仿真器,可以完成完整的PLD设计。Quartus II与Modelsim结合在一起,可以实现设计,仿真的一个很好的平台,并且方便。随着Quartus II版本不断更新,软件的更新主要体现在对于支持的芯片类型更多。本文设计中采用了比较可靠的Quartus II 13.1版本。1.4 课题的主要工作本论文设计了一款基于FPGA的循环码产生电路,通过对在Quartus II上进行具体的设计;完成了功能仿真和验证、分析、改进,直至能够得出功能完善并且方便的CRC编解码器。本论文的具体内容共分为四节:第一节概述主要介绍了本设计的研究背景以及意义、发展的现状以及EDA技术的概述。第二节主要介绍了CRC编解码的算法理论、实现以及各视图的解释。第三节主要介绍了编解码器的仿真验证。 第四节是结论,对整个研究工作进行归纳和综合的总结,包括研究所得结果、与已有结果的比较、本次研究中尚存在的问题、对进一步研究的见解与建议。2 算法实现2.1 CRC编解码理论 需要额外增加数个监督码元来完成信道的编码,可以用来检查错误和纠正错误。举个例子,用三位二进制码组来说明检查错误和纠正错误的原理。三位二进制码组共有8种可能的组合,下面分三种情况讨论: a)如果这8种码组都用于传送消息,就是说其中的每个码组都是可用的。在传输信息的过程如果出现误码,那么一种码组会错误地成为另外七个码组中的一个。这样的编码既不能检查错误,也不能纠正错误,没有任何抵抗抗干扰的能力。 b)如果选择其中的000、011、101、110作为可用的码组。除上述4种可用的码组以外,另外的4种码组称为不可用码组。经观察我们可以发现,可用码组中“1”偶数个,不可用码组中“1”为奇数个。如果在传输过程中发生了一位或三位的错码,则“1”的个数就变为奇数个,许用码组就变为禁用码组;如果不可用码组被接收方发现,就可以说明传输过程有错。有一个或者有三个错误可以被这种简单的校验发现,但是并不能纠错。比如说,接收到的码组是010,可以确定它是不可用码组,不过不能看出来原来的正确的码组是哪个。即使原发送码组是101的可能性很小,但是还是会有这种情况发生的;哪怕传输信息的过程中只出现了一个误码,也有三种可能的发送码组。显然,上述编码无法发现2个错码。上面所描述的编码方法只是传递了三位二进制码组的前两位一共四种信息,并且第三位是额外的监督位。这位附加的监督码位与前面两位信息码元和在一起,保证码组中“1”码的个数为偶数。下表示出了这种情况:表2-1信息位与监督位的关系信息位监督位晴000云011阴101雨110 c)假设限制两种可用码组:000和 111。那么可以看出,这种明了的方法可以发现小于等于2个的误码;或者能够纠正一位错码。纠正一位错码的方法是:将 8个码组分成二个子集,其中000、 100、 010、001与许用码组000对应,111、011、101、110与许用码组111对应;这样,在接收端如果认为码组中仅有一个错码,只要收到第一子集中的码组即判为 000,收到第二子集中的码组即判为 111。如果接收的码组是不可用码组100时,假设这个码组中只有1个错误的码,就可以确定这个错码发生在“1”位,然后吧错误纠正成000;假设接收码组中的错码的个数小于等于两个,就可能有两种情况:000错一位,111错两位都有成为100的可能,所以不能纠错只能检验到错误。分组码一般用数学符号表示,符号中k是每个码组中信息码的数目;n是每个码组的总位数,又称为码组长度(码长),的数字是每码组中的监督码元的个数。通常,将分组码规定为具有如下图所示的结构。图中前面k位(an-1ar)为信息位,后面附加个监督位(ar-1a0)。 K个信息位码长n=k+rr个监督位图2-1分组码的结构 在信道编码中,码重就是码组中不是零的码元的个数,比如说, 1101码组的码重是3,1100码组的码重为2。两个码组中所对应码位上所具有的不同二进制码元的位数就是两个码组之间的距离,称为码距。最小码距可记为。上面三位二进制码组的讨论中,8种码组都是可以用的码组的时候,两个码组之间的最小距离是1,可以记成。四种码组都是可用码组的话,最小码距式中;使用了两种可用码组的时候,。从上面可以知道,最小码距关系到编码码的纠正错误和检测错误的能力,所以说最小码距在信道编码中是重要参数。没有特殊的情况下,对于分组码有下面几个结论: a)为检测e个误码,要求该编码的最小码距 b)为纠正t个误码,要求该编码的最小码距 c)为纠正t个误码,同时检测e(et)个误码,要求最小码距 “检测e个误码的同时纠正t个误码”,说的是当接收码组与某一个可用码组间的距离在纠错能达到的范围内,就自动纠正误码;与随意可用码组间的距离都超过t时,则按“纠检结合的方式”工作。简单分析了编码的纠错和检错的能力之后,再看看差错控制编码的能力。如果在信道中传输“0”和“l”并且发生错误的概率P一样,并且P1,那么在码长为n位的码组中出现r位错码的概率为; 例如,当码长n7,时,则有: 可见,采用了差错控制编码,哪怕仅仅纠正(或检测)出了码组中的一或二个错误码,还是能够让误码率下降许多。这就能够说明,仅仅纠错(检测)出一到二个错码编码也很有用,即使只是很简单的编码。2.2 模2运算原理模2运算是一种二进制算法,CRC校验技术中的核心部分,因此,我们在分析CRC算法之前,必须掌握模2运算的规则。与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种二进制运算。而且,模2运算也使用与四则运算相同的运算符,即“”表示模2加,“”表示模2减,“”或“”表示模2乘,“”或“/”表示模2除。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。 a)模2加法运算定义为: 000; 011; 101; 110 b)模2减法运算定义为:000; 011; 101; 110 c)模2乘法运算定义为:000; 010; 100; 111多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果(或称部分积)时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。 d)模2除法运算定义为:010 111多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。按带借位的二进制减法,通过计算余数减除数能不能够减确定商0还是商1,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2除法运算法则,那么余数首位是1就商1,是0就商0。2.3 CRC基础计算循环码属于分组码也记为(n,k),可分为线性循环码和非线性循环码两种。循环码仍是线性分组码,但另有循环移位不变特性。循环码的码字和多项式:设循环码的任一个码字为:在二元情况下,只取1或0,为了完整描述一个码字,需要知道的取值及其在码字中的位置。用多项式来描述码字是很方便的,于是表示的码字用次多项式来表示,即:上式表示一个n位长的码字可以用一个次多项式来表示。可见多项式仅是码字的一个数学描述工具,但不是码字本身,但两者有一一对应的关系。如果改写为:就可以让码字中的码元循环向左移一位,所对照的多项式就相当于乘以:上式中采用了模多项式运算,表明码字的左移,相对于多项式乘(升幂)后取的模剩余。同理左移位相对于乘。两多项式间一个常用的运算是加法,应为同幂次项系数相加,在二元的情况下应做模2加,例如:则:其中的一对和由于模2加消掉了,也可以认为做了减法。多项式另一个常用的运算是除法,可排竖式长除法。已知多项式: 列竖式做:可见不能除尽,故有余式。如果将余式加到被除式即:2.4 CRC编码方法在编码时,首先要根据给定的(n,k)值选定生成多项式,即从()的因子中选一个(n-k)次多项式作为。所有码多项式都可以被整除。根据这条原则,就可以对给定的信息位进行编码:设为信息码多项式,其次数小于k。用乘,得到的次数必定小于n。用除,得到余式,的次数必定小于的次数,即小于。把这个余式加在信息位后面当成监督位,就是让+,他们加的结果的多项式肯定是一个多项式。是因为它一定会被整除。 根据上述原理,编码步骤如下: 用乘。用除,得到商和余式,即:编出的码组为:2.4.1 CRC产生操作过程以下是一个8位的数据0x02产生一个16位的CRC的过程。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 240 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 8 0 0 F图2-2 8位数据0x02的16位CRC数据产生可以从上图得出,0x02扩充到了24位,之后和0x8005(CRC16生成多项式)做模2运算。运算的时候,第17位一直被丢掉。第16位如果是0的话,只能和0x0000异或,就是数据向左移一位。如果是1的话,就要和0x8005作异或运算。每次计算完,抛弃最高的位,然后将数据的下一位移过来,继续进行模2运算,一直到所有的数位移完才停止。2.5循环码解码方法解码器有两个要求:检测错误和纠正错误。因为随便一个码组多项式都是能够被生成多项式整除的,那么在接收端接收的码组用多项式去除。如果传输的过程中并没有发生错误,那么接收码组与发送码组一样,就是,所以接收码组一定能够被整除;如果码组在传输的过程有错,那么,被除时会出现除不尽而有余项的情况,所以,可以看余项是否为零判断接收码组中有没有错的码。提出一点,有可能除的尽R(x)。这个时候的错误码就不能检测出来。这种不在误差之内的错误就叫做不可检错误。不可检错误中的误码数超出了这种编码的检错能力。2.5.1 CRC解码操作过程以前文0x02数据(CRC = 0x800F)为例,计算如下:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 240 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0图2-3 8位数据0x02的16位CRC数据校验当然,也可以使用比较直观的办法,求数据0x02的CRC值,如果相等,那么也可以表明数据没有问题。3 仿真实现3.1 仿真实现方案分析硬件和软件都可以实现CRC算法,硬件实现的方式电路结构复杂,使得应用系统功能模块增多,增大系统体积降低了集成度,批量生产的产品中提高了产品成本;使用软件实现的方法计算的速度受限于系统CPU的速度,但是随着科技的发展,CPU已经足以让这样的影响忽略不计,所以采用软件实现的方法增加了系统集成度,从而提升系统的通信效率,在进行批量生产时可以极大的降低成本。利用软件实现可以采用的器件有MCU和CPLD,基于MCU的方案中由于MCU的处理数据的位宽固定,且运行速度不如基于CPLD的方法快,基于CPLD的方案管脚配置更灵活,运行速度更快更稳定。故次设计中采用基于CPLD的软件实现方法来完成CRC的编解码校验。 根据应用的需要,有两种常用的方法,来实现CRC的算法,查表法和逐位运算法,它们特点如下。3.1.1 查表法实现方案分析查表法,就是在编写代码之前计算好各种基本CRC的值,并且存储在存储器里面,需要时直接查询存储器中的CRC数据表,不用进行耗时的位运算,因为使用字和字节存在里面的。这样查表法的速度就会增加,与基于位运算的方法相比在达到同等效果的时候就可以降低系统主频和功耗,但是需要大量的寄存器来存储CRC值。 8位数据的CRC查表法实现流程图如下:是否CRC与表数据做异或运算运算结束CRC左移n位产生CRC表索引初始化CRC寄存器开始最后异或运算结束图3-1 查表法流程图3.1.2逐位运算法实现方案分析逐位运算法,利用表3-2的原理来实现。数据左移一位时,要再次对每一位进行第二次运算,所以,总的数据位数 - 16=移位操作的次数。这样子就可以得到,CPU使用的时间也不是太多的,当数据位数比较多时。数据位数越多,就要使用更多的CPU,为了超越查表法的速度,需要大幅度提高系统主频,会增加功耗。 8位数据逐位运算法实现CRC的流程图如下:否是否是高位为1?左移1位异或运算最后异或运算结束运算结束吗初始化CRC寄存器设定下一个字节开始左移1位 图3-2 逐位运算法流程图3.1.3 需求分析 根据对查表法和逐位运算法的分析与比较,发现虽然查表法能够使用系统主频低的cpu,而且只需要很小的功耗,但是,现在科技发展迅速,系统主频的要求并不算难以应付,就是功耗会大一点,而且逐位运算法的速度很快,比较方便。所以,决定使用逐位运算法来实现CRC编解码的设计。3.2 编解码设计先进行简单的12位信息加5位CRC校验码发送、接收设计,由两个模块构成CRC校验生成模块(发送)和CRC校验检错模块(接收),其中CRC生成多项式采用,二进制表示为110101。输入、输出都为并行的CRC校验生成方式。3.2.1 编码模块数据生成模块就是要生成17位串行的数据,用这个数据来做CRC校验的输入,该部分代码的实体定义如下所示:entity shishikan isPort ( clk: in std_logic; coded_data : out STD_LOGIC_VECTOR(16 downto 0);send : out std_logic; data: in std_logic_vector(11 downto 0):=110011010101; load : in std_logic );end shishikan; 其中,每个实体的含义如下:data:12位的待发送信息;clk:时钟信号;load:data的装载信号;send:生成、检错模块的握手信号,协调相互之间关系;coded_data:在生成模块被发送。该部分代码生成的模块如下图: 图3-3 CRC生成模块该部分的结构体定义如下图:architecture Behavioral of shishikan isconstant multi_coef: std_logic_vector(5 downto 0) :=110101; signal data_r: std_logic_vector(11 downto 0):=110011010101;signal cnt: std_logic_vector(7 downto 0);beginprocess(clk) variable crcvar : std_logic_vector(5 downto 0); VARIABLE dtemp: STD_LOGIC_VECTOR(11 DOWNTO 0); VARIABLE sdatam: STD_LOGIC_VECTOR(11 DOWNTO 0); variable st: std_logic :=0;begin if(clkevent and clk = 1)then if(st=0and load=1)then dtemp:=data_r; sdatam:=data_r;cnt0);send=0; st:=1; elsif(st=1 and cnt7)then cnt=cnt+1; if(dtemp(11)=1)then crcvar:=dtemp(11 downto 6)xor multi_coef(5 downto 0); dtemp:=crcvar(4 downto 0)& dtemp(5 downto 0) & 0; else dtemp:=dtemp(10 downto 0) & 0; end if; elsif(st=1 and cnt=7)then coded_data=sdatam & dtemp(11 downto 7); data=data_r; send=1;cnt=cnt+1; elsif(st=1 and cnt=8)then send=0; st:=0;end if;end if;end process; end Behavioral;对该部分代码进行编译综合之后产生的rtl视图和technology视图见附录2.1-2.5附录2.1-2.3表示的是寄存器cnt通过加法器自加,并且通过触发器向内部传输信号。Coded_data通过与dtemp的不停的互动输出最后的数据,而dtemp则不停的左移然后和crc-5异或得到数据送给coded_data. 资源使用图如下:图3-4 编码器资源使用图3.2.2 解码模块解码模块的设计是本文的主要功能,该部分的代码的实体定义如下所示:entity jiemaqia isPort ( clk: in std_logic; coded_data : in STD_LOGIC_VECTOR(16 downto 0):=11001101010101000;reception : in std_logic; decode_data: out std_logic_vector(11 downto 0); error1: out std_logic;datafini : out std_logic );end jiemaqia;每个实体的含义如下:clk:时钟信号;error1:误码警告信号 ; datafini:数据接收校验完成;reception:解码模块的握手信号,协调相互之间关系;decode_data:接收模块(检错模块)接收的12位有效信息数据;coded_data:附加上5位CRC校验码的17位CRC码,在生成模块被发送。该部分代码生成的模块如下图: 图3-5 crc解码模块该部分的结构体定义如下:architecture Behavioral of jiemaqia isconstant multi_coef: std_logic_vector(5 downto 0) :=110101; signal coded_data_r: std_logic_vector(16 downto 0):=11001101010101000;signal rcnt: std_logic_vector(7 downto 0);beginprocess(clk,reception) variable rcrcvar : std_logic_vector(5 downto 0); variable rdtemp : std_logic_vector(11 downto 0); variable rt: std_logic :=0; variable rdatacrc : std_logic_vector(16 downto 0);begin if(clkevent and clk = 1)then if(rt=0and reception=1)then rdtemp:=coded_data_r(16 DOWNTO 5);rdatacrc:=coded_data_r;rcnt0);error1=0;rt:=1; elsif(rt=1and rcnt7)then datafini=0;rcnt=rcnt+1; rcrcvar:=rdtemp(11 downto 6)xor multi_coef; if(rdtemp(11)=1)then rdtemp:=rcrcvar(4 downto 0)& rdtemp(5 downto 0)& 0; elserdtemp:=rdtemp(10 downto 0) & 0; end if; elsif(rt=1 and rcnt=7)then datafini=1; decode_data=rdatacrc(16 downto 5); rt:=0; if(rdatacrc(4 downto 0) /=rdtemp(11 downto 7) then error1 load , coded_data = coded_data , data = data , send = send , clk = clk ) ; clk = not clk after 10ns; load =1 after 20ns;END ; 给clk赋初值为0,给load赋初值为0,添加代码clk = not clk after 10ns;和 load datafini , coded_data = coded_data , decode_data = decode_data , reception = reception , clk = clk , error1 = error1 ) ; clk = not clk after 10ns;END ; 同样的,给clk赋初值0,
收藏