基于FPGA的CRC编解码器设计说明书
基于FPGA的CRC编解码器设计说明书,基于,fpga,crc,编解码器,设计,说明书,仿单
基于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,
收藏