基于FPGA的CRC校验设计
- 格式:doc
- 大小:532.00 KB
- 文档页数:27
基于FPGA的CRC校验设计基于FPGA的CRC(循环冗余校验)校验设计是一种用于数据完整性验证的算法。
在通信和数据传输中,CRC校验可用于检测数据传输错误。
FPGA(现场可编程门阵列)是一种可重新编程的硬件设备,可实现定制的数字逻辑电路。
将CRC校验算法实现在FPGA上,可以提高校验的速度和效率。
CRC校验算法通过生成和校验数据块的校验码来验证数据的完整性。
它基于多项式除法,将数据块与一个预定义的生成多项式进行除法运算,生成的余数作为校验码。
接收方收到数据时,再次进行CRC计算,如果生成的校验码与接收到的校验码一致,则说明数据传输没有错误。
在FPGA上实现CRC校验设计,需要将CRC校验算法转化为硬件逻辑电路。
以下是一个基于FPGA的CRC校验设计的示例:1.数据块输入:从输入端口接收数据块。
使用FPGA中的输入引脚来接收数据。
数据块可以是任意长度的二进制数据。
2.寄存器初始化:CRC校验算法需要一个初始寄存器值,用于生成校验码。
通过在FPGA中定义一个初始化寄存器,并将其值设为所有位都为1的初始值。
3.寄存器移位:将数据块输入与当前寄存器存储的值进行XOR操作,并将结果存入一个新的寄存器。
4.数据块除法:执行多项式除法操作,将新的寄存器值与生成多项式进行除法运算。
5.寄存器更新:将除法操作的余数存入一个更新的寄存器,并将该寄存器的值作为下一个循环的输入。
6.循环:重复执行步骤3至步骤5,直到所有的数据块输入被处理完。
7.生成校验码:当所有的数据块输入都被处理完后,从最后一个更新的寄存器中读取生成的校验码。
校验码可用于后续的数据传输完整性验证。
8.输出校验码:将生成的校验码从FPGA输出,可以将校验码发送到接收端进行验证,或进行显示和保存等操作。
以上是一个基于FPGA实现的CRC校验设计的基本步骤。
实际设计中,还可以根据具体需求进行优化和改进,例如使用流水线技术以提高计算效率,或者添加错误检测和纠正机制以增强鲁棒性。
CRC冗余校验编码与解码的FPGA实现CRC(Cyclic Redundancy Check)冗余校验编码是一种常用的错误检测技术,它通过对数据进行多项式除法运算,生成一个校验码。
接收方可以利用这个校验码来检测数据传输是否出现错误或损坏。
在FPGA中实现CRC的编码和解码功能可以提供硬件级别的实时性能和效率,并且可以与其他模块轻松集成在一起。
首先,我们需要准备FPGA开发板、软件开发工具和一个CRC多项式。
CRC多项式的选择取决于所使用的CRC标准和数据宽度。
编码的FPGA实现主要包含以下步骤:1.数据输入:将待编码的数据通过输入端口输入到FPGA中。
2.除数寄存器初始化:初始化一个与CRC多项式位数相等的寄存器,初始值为0。
3.循环除法:采用循环除法算法,将输入数据和除数寄存器中的值进行除法运算。
每次计算结果都更新除数寄存器。
4.生成校验码:当所有输入数据都被除尽后,生成最终的校验码。
5.输出校验码:将生成的校验码通过输出端口输出到外部。
解码的FPGA实现主要包含以下步骤:1.接收数据:将接收到的数据通过输入端口输入到FPGA中。
2.除数寄存器初始化:与编码过程相同,初始化一个与CRC多项式位数相等的寄存器。
3.循环除法:采用同样的循环除法算法进行运算,将输入数据和除数寄存器中的值进行除法运算。
4.判断错误:当除数寄存器的值为零,说明数据没有出现错误。
否则,数据出现错误。
通过使用FPGA来实现CRC冗余校验编码和解码,可以获得高速、高效的数据传输,尤其适用于在低延迟和高吞吐量的系统中。
此外,FPGA的可编程性使得我们可以灵活地配置不同标准和多种数据宽度的CRC。
需要注意的是,在实现CRC编码和解码时,需要根据具体的CRC标准和数据宽度来确定多项式的选择以及对应的除法算法。
此外,合理的硬件设计和时序控制对于FPGA实现CRC的性能和正确性也至关重要。
综上所述,CRC冗余校验编码与解码的FPGA实现可以提供高效的数据传输和错误检测功能,适用于各种应用场景。
CRC校验电路
CRC码检错的工作原理:CRC码检错是将被处理报文的比特序列当作一个二进制多项式A(x)的系数,该系数除以发送方和接收方预先约定好的生成多项式g(x)后,将求得的余数p(x)作为CRC校验码附加到原始的报文上,并一起发给接收方。
接收方用同样的g(x)去除收到的报文B(x),如果余数等于p(x),则传输无误(此时A(x)和B(x)相同);否则传输过程中出错,由发送端重发,重新开始CRC校验,直到无误为止。
一、VHDL 代码
library ieee;
use ieee.std_logic_1164.all;
entity crc_4 is
port(clk,din: in std_logic;
Q4:buffer std_logic);
end crc_4;
architecture crc_arch of crc_4 is
signal Q1,Q2,Q3:std_logic;
begin
process(clk)
variable D3,D4:std_logic;
begin
if (clk'event and clk='1') then
Q1<=Q4 xor din;
Q2<=Q1 xor Q4;
D3:=Q2;
D4:=Q3;
Q3<=D3;
Q4<=D4;
end if;
end process;
end crc_arch;
二、Synplify9.6.2综合电路
三、Quartus II 6.0仿真结果
当输入序列din={1 0 1 1 0 0 1 0 0 0 0},输出为“1010”。
基于FPGA实现CRC校验功能的通用异步串口通信同晓荣;盛仲飙【期刊名称】《信息技术》【年(卷),期】2012(000)003【摘要】UART作为RS-232协议的控制接口得到了广泛的应用,为实现准确的数据串口通信,在分析CRC生成算法的基础上,提出了一种简单、实用的UART设计与实现方案.该方案在串口通信中采用CRC-5校验,基于FPGA采用Verilog语言实现CRC-5校验模块,仿真结果与理论分析一致,达到了预期设计的目标.提高了通信的速度、可靠性和效率.%UART is used widely as the interface of RS-232, to obtain accurate serial communication of data, a simple and practical scheme for UART design and realization was put forward. Cyclic redundancy check (CRC) in serial communication greatly improves the reliability of communication system, and realization of CRC-5 check module with Verilog language on the basis of FPGA and the analysis of CRC-5 algorithm generation obtains consistence between the results of simulation and theoretical analysis. Therefore, the expected design target was met, and the communication speed and efficiency were unproved.【总页数】4页(P27-29,32)【作者】同晓荣;盛仲飙【作者单位】渭南师范学院数学与信息科学学院,渭南714000;渭南师范学院数学与信息科学学院,渭南714000【正文语种】中文【中图分类】TP391【相关文献】1.基于LFSR的CRC校验码在FPGA上的实现 [J], 李永基;魏文军2.基于FPGA的CRC校验算法的实现 [J], 张焱;任勇峰;齐蕾;姚宗3.基于FPGA的带CRC校验的异步串口通信 [J], 田佳;王一平4.专川异步串口通信电路的FPGA实现 [J], 苏明;姚冬苹5.基于FPGA的通用异步接收/发送器设计与实现 [J], 叶林朋因版权原因,仅展示原文概要,查看原文内容请购买。
基于FPGA的CRC校验码生成器设计摘要:本设计报告基于FPGA实现了一个CRC校验码生成器。
通过选择合适的生成多项式,设计了按位异或运算的模块、数据输入模块、数据与校验码拼接模块以及输出模块。
经过仿真和验证,该生成器能够正确生成CRC校验码,并将输入的数据和校验码一起输出。
该设计能够提高数据传输的可靠性和完整性,适用于数据通信等领域。
关键词:FPGA;CRC校验码;生成多项式;按位异或运算前言信息在传递过程中,可能因某种原因使传输的数据发生错误。
为减少和避免这类错误的发生,除提高硬件的可靠性外,在数据的编码上也应提供检错和纠错的支持。
常见的校验码有奇偶校验码、海明校验码和循环冗余校验CRC (CyclicRedundancy Check〉码,它们都是将被校验的数据代码按k 位一组分组,每组添加r个校验位,形成n位一组的代码,故又称为(n,k)分组校验码。
其中CRC码既可检错又可纠错(与生成多项式的选取有关),是以数据块为对象进行校验的一种高效、可靠的检错和纠错方法,由于它的编解码简单、纠错能力强且误判概率很低,因而在工业测控及通信系统中得到了广泛的应用。
CAN协议中,为了保证帧传输的可靠性和较高的检错效率,其采用了以下几种检错方式:位错误、填充错误、CRC错误、格式错误及应答错误检测。
如果用m表示报文受损率,那么通过以上检错方式,它对于受损报文检测不到其受损的概率为:m×4.7×10-”,因而CAN总线极高的检错率使得它目前被广泛应用到工业控制、通信、汽车甚至军事等多个领域。
CRC检验作为CAN协议中一种重要的且行之有效的检错方式,它的生成多项式可以检验7级,具有编码简单且误判率低的优点。
1 方案设计CRC(Cyclic Redundancy Check)校验码是一种常用的错误检测码。
其原理是通过对数据进行一系列的位操作,生成一个校验码,然后将数据和校验码一起传输,在接收端进行校验,以确定数据的完整性。
摘要:随着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 作为正确性校验的方法。
fpga crc 校验原理FPGA CRC 校验原理CRC(Cyclic Redundancy Check)是一种常用的数据校验方法,它通过计算数据的循环冗余校验码来检测数据传输过程中的错误。
FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,可以根据需要配置其内部的逻辑电路。
本文将介绍FPGA 中实现CRC 校验的原理和方法。
1. CRC 校验原理CRC 校验是一种循环冗余校验方法,通过对数据进行多项式除法运算得到校验码,并将其附加在数据后面。
接收方收到数据后,再次进行多项式除法运算,如果计算出的校验码与接收到的校验码一致,则说明数据传输过程中没有出现错误。
CRC 校验的计算过程可以简化为以下几个步骤:1) 初始化寄存器,将其值设置为预定义的初始值。
2) 逐位地处理数据,从高位到低位,将每一位与寄存器的最高位进行异或运算。
3) 如果异或结果为1,则将寄存器左移一位,并将多项式的系数与寄存器最低位进行异或运算;如果异或结果为0,则只将寄存器左移一位。
4) 重复上述步骤,直到处理完所有数据位。
5) 最后将寄存器中的值作为校验码附加在数据后面。
2. FPGA 实现 CRC 校验在 FPGA 中实现 CRC 校验,需要先将 CRC 多项式转换为逻辑电路。
一种常见的方法是使用LFSR(Linear Feedback Shift Register)电路来实现。
LFSR 是一种移位寄存器,它可以根据预定义的多项式进行位移和异或运算。
在 CRC 校验中,多项式的系数决定了 LFSR 中的异或运算。
具体实现步骤如下:1) 将 CRC 多项式转换为二进制表示,并确定最高位为1。
2) 根据 CRC 多项式的位数,设计一个相应位数的 LFSR。
3) 将数据输入到 LFSR 的最低位,并将 LFSR 向右移动一位。
4) 如果 LFSR 最高位为1,则将其与 CRC 多项式进行异或运算,并将结果放回 LFSR。
基于FPGA的CRC32校验查找表算法的设计[权威资料] 基于FPGA的CRC32校验查找表算法的设计摘要:循环冗余码校验CRC广泛应用于数字通信和数据存储的数据检错。
CRC 校验分为串行方式校验、并行方式校验。
串行方式校验采用串行移位寄存器,每1个clk计算1bit,处理速度慢。
并行方式采用查找表算法,处理速度快。
本文介绍了CRC32校验算法的FPGA实现方法,并通过Modelsim仿真,验证了算法的可行性和正确性。
关键词:循环冗余校验码;CRC32;FPGADOI:10.16640/ki.37-1222/t.2016.10.1880 引言循环冗余校验码CRC是一种实现简单、校验能力强、在串行通信领域广泛采用的校验编码[1]。
CRC校验的基本思想是利用线性编码理论,在发送端,对要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(即CRC码)r位,附在信息后边,构成了一个新的二进制码序列数共(k+r)位,然后发送出去[2]。
在接收端,则根据信息码和CRC码之间所遵循的规则进行校验,以确定传送中是否出错。
1 CRC32生成查找表和CRC32数据校验CRC32校验查找表算法采用正规查询表查询,该查询表是将“直接查询表”的索引值和表值直接镜像,正规查找表多项式POLY是0x04C11DB7。
生成查找表的流程是首先对索引值0到0xFF数值镜像。
以索引值1为例,镜像值为0x80,已对该8bit镜像值0x80左移24位变成32位CRC32值。
对该值一次左移1位,移出的值若为1,则对移后的CRC32值与POLY进行异或操作得到新的CRC32值,否则不做运算。
进行8次左移运算,最后的CRC32值在做镜像后的值即为索引值1的CRC32查找表值,按照该算法进行256次操作,可得到256个CRC32查找表值。
得到查找表后,则对数据进行CRC校验,其校验步骤是将待校验数据与32位寄存器的低8位做XOR运算得到一个指向查询表的索引值,将所将索引所指的表值与寄存器的高24位做XOR运算,得到的值更新到32位寄存器中,同时该值也为校验过的值,如数据没有全部处理完,则跳到开始进行运算。
《数字电路课程设计》实验报告题目:基于FPGA的CRC校验设计班级:学号:姓名:完成时间:实验地点:摘要在通信的过程中,由于外界干扰或者电路本身不稳定因素的影响,通信系统中不可避免的会产生噪声(如热噪声等),噪声有时候会严重影响信息的发送,造成信息发送失败。
因此在接收方确定自己是否接收到了正确的信息尤为重要。
本文就CRC校验这一校验方法利用FPGA进行模拟仿真,完成整个CRC校验的过程。
目录第一章实验任务与原理1.1实验任务1.2 实验原理第二章设计思路、方法及方案2.1设计思路2.2设计方法及方案第三章FPGA模块设计第四章系统调试及硬件检查第五章结束语附录程序源代码第一章 实验任务与原理1.1、 实验任务本实验设计完成一个完整的CRC 校验过程,其中包括发送端对原始数据生成、编码、按照RS-232的传输协议组帧、接收端对RS-232传输帧格式解析和解码过程。
1.2、 实验原理本次实验要完成整个CRC 校验过程,从产生数据到最后的校验完毕,因此实验原理共分为5个部分:数据源产生、CRC 编码、组帧、帧解析、CRC 校验。
图1 CRC 校验系统结构1、 CRC 校验介绍CRC (循环冗余校验码)是一种非常适于检错的信道编码。
由于其检错能力强,它对随机错误和突发错误都能以较低冗余度进行严格检验,且编码和译码检错电路的实现都相当简单,故在数据通信和移动通信中都得到了广泛的应用。
在数据通信与网络通信中,通常信息码元的数目k 相当大,由一千甚至数千数据位构成一帧,而后采用循环码的生成多项式产生r 位的校验位。
这时,信息码元和校验位构成的码字不一定是严格定义的循环码,而且主要是利用其误码检测特性进行错误检出,因此就可广泛采用CRC 码。
它是从循环码中分出的一类检错码。
循环码的已编码码字可被生成多项式g(x)整除。
收端可以利用这一特点进行检错,若接收码字不能被g(x)整除,则有错。
2、实验原理介绍任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’或‘1’的多项式一一对应,例如‘1010111’对应的多项式为6421x x x x ++++。
CRC 码集选择的原则:若设码字长度为N ,信息字段长度为K ,校验字段长度为R ,则N=K+R ;对于CRC 码集中的任一码字,存在且仅存在一个R 次多项式g(x)使得:()()()()()R V x A x g x x m x r x ==+其中m(x)为K 次信息多项式,r(x)为R-1次校验多项式,g(x)称为生成多项式。
V(x)为发送的信息加码字多项式。
2012()...R R g x g g x g x g x =++++发送方通过指定的g(x)产生CRC 码字,接收方则通过g(x)来验证CRC 码字,若传输码字多项式V(x)能除尽g(x),则传输正确。
第二章 设计思路、方法及方案2.1设计思路本实验采用如错误!未找到引用源。
所示的结构实现CRC 的编解码。
使用CRC-CCITT 标准进行仿真,其生成多项式为:16125()1g x x x x =+++以此多项式为基础,通过MODELSIM 对CRC 校验进行仿真。
2.2、设计方法及方案为了完整仿真整个通信系统,实验将构造6大模块:数据源产生、CRC 编码、组帧、噪声、帧解析、CRC 校验。
1) 数据源的产生本次实验主要目的在于仿真CRC 校验的整体过程,因此在数据源产生处就选择了最为简单的64位全为1的输入方式。
2) CRC 编码本次实验使用CRC-CCITT 标准进行仿真,因此使用的生成多项式为16125()1g x x x x =+++因此在编码过程中计算余数时即用需要发送的信息除以生成多项式。
如图2所示,用16个锁存器与3个异或门即能完成除法操作。
可见,第1位,5位,12位,16位(与第一位重合)上有异或门。
在完成所有输入之后,16位锁存器中锁存的即为余数,在之后将其输出即可。
在编码发送上,可见如图3所示,由使能din_dv 控制64位输入,同时,在此操作的一个时钟之后(由于输入数据赋值于输出数据需要一个时钟),计数器开始计数80位的输出位并以此来控制dout_dv 的使能端,因此可见得到一个由din 与crc 连接在一起的输出dout 。
同时,设置一个清除信号clr,在当80位编码后信号输出的同时,清除信号置‘1’,清除触发器中的值。
图1 CRC 编码实现结构163647879dincrcdinclk din dout_dv cnt_en cnt dout clrdin_dv图3 CRC 编码时序图3) CRC 组帧如图4中frame 模块实现的是组帧功能,根据RS-232的组帧格式,在有效数据前加一比特起始位0,数据结束后加一比特停止位1,时序图如图5所示。
即在接收端需要判断编码后的80比特的输出信号何时到达接收端,因此在组帧的时候将数据前加一比特起始位0,在接收端即可判断此‘0’即可开始接收。
017980dindinclk din cnt_en cnt doutdin_dv 01图4 frame 模块端口时序4) 帧解析帧解析就是在接收端首先完成的操作,它根据发送端发送的数据,检测到有效数据并开始接收。
即在接收端,当检测到组帧时产生的信号‘0’以后,确定之后的信号为有效信号,开始接收,并且在计数器计数至80后,接收完毕。
也就是如图5所示,当检测到‘0’之后,data_dv 使能端有效开始接收信息并开始计数,在之后一个时钟dout_dv 使能端有效并开始向下一级输出接收到的信号,并在80位以后由计数器控制停止。
179dindinclk din data_dv cnt dout1dout_dv图5 receive 时序模块5) 噪声本次实验引入噪声只为验证CRC 校验的检错能力,因此并不需要特定地选取某些很特别的噪声,在此次实验中,加入噪声非常的简单,在接收端帧解析之后,即得到了80位的接收信号,此时对该信号任选几位将其与‘1’异或,其余位与‘0’异或(其原理为dout 与0异或仍为dout ,dout 与1异或为~dout ),因此即成功引入噪声。
dinerrorerror图5 引入噪声仿真模块6) CRC 校验CRC 校验采用多项式除法实现,在1.2节中提到公式:()()()()()R V x A x g x x m x r x ==+了解了前面几节可以了解到,编码阶段就是产生r(x)这个余式,然后将其拼接在64位信源后面,组成一个80位比特流,也就是上式中的V(x)。
因此在最后的CRC 校验部分,只需要检验接收到的信息是否能被g(x)整除也就能验证是否出现传输错误。
在这个基础上,将解帧得到的80位比特流输入如图2的CRC 编码结构,也就相当于完成了一次多项式除法,因此只需要得到的16个D 触发器中的值全为0,即能证明传输中没有出现错误。
第三章 FPGA 模块设计本章将简单介绍部分需要注意的事项。
数据源模块在2.3.1中提到的数据源模块,只需在testbench 中编写生成一个64比特的全1信号及其相应的使能。
使能长度由计数器控制。
编码模块、解码模块 在2.3.2、2.3.6中提到的编码模块,在编写过程中需要注意编码同样需要计数器控制,同时编码模块中在输出处需由使能控制是输出原输入还是输出D 触发器上的输出。
组帧模块、帧解析模块在2.3.3、2.3.4中提到的组帧模块、帧解析模块,在编写过程中同样要注意到计数器控制使能及CRC-CCITT 中的标准。
噪声加入模块、解码模块在2.3.5中提到的噪声模块注意异或门的使用。
主程序主程序用于连接前面所有模块,只需注意各个端口对接正确。
第三章系统调试及硬件检查用MODELSIM软件对CRC校验进行仿真。
仿真结果如图6以及图7。
4.1、输入、编码、组帧及帧解析仿真图如图6所示,din输入全为1,而由使能din_en控制那64位输入有效,之后输入编码模块,在编码模块输出后,可见图中的bianma/dout。
此时已经将余式求出并组合在输入信号之后,得到如图波形。
而图中frame_dout 为组帧输出,可见此时的信号在最前端有一个小凹槽,即为组帧时的信号‘0’,用于最后解帧判断使用。
而图中receive_dout则延时一个时钟输出了帧解析后的信号。
图64.2、解码仿真图图7如图7所示,解码仿真图如图,在解码输入帧解析的信号之后,解码得到了全‘0’的16位比特流,因此在jiema/error输出为0,表示没有错误。
第五章结束语总的来看,本次实验的主要难点在于原理的理解和实现上,在程序编写过程却遇到了很多困难。
同时,由于自己的粗心大意,在编写过程中犯了很多低级错误。
甚至于发生了由于变量名称写错导致整个project无法编译的情况。
不管怎么说,最后完成这一实验,我感到非常的欣慰。
通过这次设计,我更加理解了结构级语言和模块化设计对整个工程带来的便利。
并对FPGA 在工程应用中的作用有了进一步的了解。
特别是利用FPGA进行仿真,还是第一次见到。
最后,感谢在实验过程中给予我许多帮助的老师和同学们。
附录程序源代码------------------------------------------------------------------------------------ Company:-- Engineer:---- Create Date: 15:54:06 06/04/2011-- Design Name:-- Module Name: raycrc - Behavioral-- Project Name:-- Target Devices:-- Tool versions:-- Description:---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:------------------------------------------------------------------------------------library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity raycrc isPort ( clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;din_en : in STD_LOGIC;dout : out STD_LOGIC;dout_en : out STD_LOGIC);end raycrc;architecture Behavioral of raycrc issignal count:STD_LOGIC_VECTOR(6 DOWNTO 0); signal count_en:STD_LOGIC;signal d:STD_LOGIC_VECTOR(15 DOWNTO 0); signal clr:STD_LOGIC;begin-------------计数器 80位计数-------- process(reset,clk)beginif reset = '1' thencount <= (others => '0');elsif (clk'event and clk = '1')thenif count_en = '1' thenif count = "1001111" thencount <= (others => '0');elsecount <= count + '1';end if;end if;end if;end process;------------使能控制------------process(clk,reset)beginif reset = '1' thencount_en <= '0';elsif(clk'event and clk = '1')thenif en = '1' thenif din_en = '1' thencount_en <= '1';elsif count = "1001111" thencount_en <= '0';end if;end if;end if;end process;------------清零操作-----------process(clk,reset)beginif reset = '1' thenclr <='0';elsif clk'event and clk = '1' thenif en = '1' thenif count = "1001110" thenclr <= '1';elsif count = "1001111" thenclr <= '0';end if;end if;end if;end process;------------输出------------process(clk,reset)beginif reset = '1' thendout <= '0';elsif (clk'event and clk = '1') thenif en = '1' thenif din_en = '1' thendout <= din;elsedout <= d(15);end if ;end if;end if;end process;------------使能输出----------process(clk,reset)beginif reset = '1' thendout_en <= '0';elsif (clk'event and clk = '1') then if en = '1' thenif din_en = '1' thendout_en <= '1';elsif count = "1001111" thendout_en <= '0';end if;end if;end if;end process;-------------CRC编码----------process(clk,reset,clr)beginif reset = '1' or clr = '1' thend <= (others => '0');elsif (clk'event and clk = '1') thenif en = '1' thenif din_en = '1' thend(0) <= din xor d(15);d(1) <= d(0);d(2) <= d(1);d(3) <= d(2);d(4) <= d(3);d(5) <= d(4) xor (d(15) xor din);d(6) <= d(5);d(7) <= d(6);d(8) <= d(7);d(9) <= d(8);d(10) <= d(9);d(11) <= d(10);d(12) <= d(11) xor d(15) xor din;d(13) <= d(12);d(14) <= d(13);d(15) <= d(14);elsed(0) <= d(15);d(1) <= d(0);d(2) <= d(1);d(3) <= d(2);d(4) <= d(3);d(5) <= d(4);d(6) <= d(5);d(7) <= d(6);d(8) <= d(7);d(9) <= d(8);d(10) <= d(9);d(11) <= d(10);d(12) <= d(11);d(13) <= d(12);d(14) <= d(13);d(15) <= d(14);end if;end if;end if;end process;end Behavioral;---------------------------------------------------------------------------------- -- Company:-- Engineer:---- Create Date: 20:40:49 06/04/2011-- Design Name:-- Module Name: raycrcjm - Behavioral-- Project Name:-- Target Devices:-- Tool versions:-- Description:---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:------------------------------------------------------------------------------------ library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity raycrcjm isPort ( clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;din_en : in STD_LOGIC;error : out STD_LOGIC);end raycrcjm;architecture Behavioral of raycrcjm issignal count:STD_LOGIC_VECTOR(6 DOWNTO 0);signal count_en:STD_LOGIC;signal clr:STD_LOGIC;signal d:STD_LOGIC_VECTOR(15 DOWNTO 0);begin-----------位数计数-------------process(clk,reset)beginif reset = '1' thencount <= (others => '0');elsif (clk'event and clk = '1') thenif count_en = '1' thenif count = "1010000" thencount <=(others => '0');elsecount <= count + '1';end if;end if;end if;end process;---------使能---------------process(clk,reset)beginif reset = '1' thencount_en <= '0';elsif (clk'event and clk = '1')thenif en = '1' thenif din_en = '1' thencount_en <= '1';elsif count = "1010000" thencount_en <= '0';end if;end if;end if;end process;---------清零-------------process(clk,reset)beginif reset = '1' thenclr <= '0';elsif (clk'event and clk = '1')thenif en = '1' thenif count = "1001111" thenclr <= '1';elsif count = "1010000" thenclr <= '0';end if;end if;end if;end process;---------编码---------process(clk,reset,clr)beginif reset = '1' or clr = '1' thend <= (others => '0');elsif (clk'event and clk = '1') thenif en = '1' thenif din_en = '1' thend(0) <= din xor d(15);d(1) <= d(0);d(2) <= d(1);d(3) <= d(2);d(4) <= d(3);d(5) <= d(4) xor (d(15) xor din);d(6) <= d(5);d(7) <= d(6);d(8) <= d(7);d(9) <= d(8);d(10) <= d(9);d(11) <= d(10);d(12) <= d(11) xor d(15) xor din;d(13) <= d(12);d(14) <= d(13);d(15) <= d(14);elsed(0) <= d(15);d(1) <= d(0);d(2) <= d(1);d(3) <= d(2);d(4) <= d(3);d(5) <= d(4);d(6) <= d(5);d(7) <= d(6);d(8) <= d(7);d(9) <= d(8);d(10) <= d(9);d(11) <= d(10);d(12) <= d(11);d(13) <= d(12);d(14) <= d(13);d(15) <= d(14);end if;end if;end if;end process;----------检验-----------process(clk,reset)beginif reset = '1' thenerror <= '0';elsif (clk'event and clk = '1') thenif en = '1' thenif count = "1001111" thenif d = "0000000000000000" thenerror <= '0';else error <= '1';end if;end if;end if;end if;end process;end Behavioral;---------------------------------------------------------------------------------- -- Company:-- Engineer:---- Create Date: 20:42:27 06/04/2011-- Design Name:-- Module Name: raycrcjx - Behavioral-- Project Name:-- Target Devices:-- Tool versions:-- Description:---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:------------------------------------------------------------------------------------ library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity raycrcjx isPort ( clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;dout_en : out STD_LOGIC;dout : out STD_LOGIC);end raycrcjx;architecture Behavioral of raycrcjx is signal data_en:STD_LOGIC;signal count:STD_LOGIC_VECTOR(6 DOWNTO 0);begin----------使能---------------process(clk,reset)beginif reset = '1' thendata_en <= '0';elsif (clk'event and clk = '1') thenif en = '1' thenif count = "1001111" thendata_en <= '0';elsif din = '0' thendata_en <= '1';end if;end if;end if;end process;-----------计数-----------process(clk,reset)beginif reset = '1' thencount <= (others => '0');elsif (clk'event and clk = '1') thenif en = '1' thenif data_en = '1' thenif count = "1001111" thencount <= (others => '0');elsecount <= count + '1';end if;end if;end if;end if;end process;------------输出-----------process(clk,reset)beginif reset = '1' thendout <= '0';dout_en <= data_en;elsif (clk'event and clk = '1') thendout <= din;dout_en <= data_en;end if;end process;end Behavioral;---------------------------------------------------------------------------------- -- Company:-- Engineer:---- Create Date: 20:28:52 06/04/2011-- Design Name:-- Module Name: raycrczhu - Behavioral-- Project Name:-- Target Devices:-- Tool versions:-- Description:---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:------------------------------------------------------------------------------------ library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity raycrczhu isPort ( clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;din_en : in STD_LOGIC;error : out STD_LOGIC);end raycrczhu;architecture Behavioral of raycrczhu isCOMPONENT raycrcPORT(clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;din_en : in STD_LOGIC;dout : out STD_LOGIC;dout_en : out STD_LOGIC);END COMPONENT;COMPONENT raycrcjxPORT (clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;dout_en : out STD_LOGIC;dout : out STD_LOGIC);END COMPONENT;COMPONENT raycrczzPORT (clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;din_en : in STD_LOGIC;dout : out STD_LOGIC);END COMPONENT;COMPONENT raycrcjmPORT (clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;din_en : in STD_LOGIC;error : out STD_LOGIC);END COMPONENT;signal CRC16_rx_dout:STD_LOGIC;signal CRC16_rx_dout_en:STD_LOGIC; signal frame_dout:STD_LOGIC;signal recieve_dout:STD_LOGIC;signal recieve_dout_en:STD_LOGIC;beginbianma:raycrcPORT MAP(clk => clk,reset => reset,en => en,din => din,din_en => din_en,dout => CRC16_rx_dout,dout_en => CRC16_rx_dout_en);zuzhen:raycrczzPORT MAP(clk => clk,reset => reset,en => en,din => CRC16_rx_dout,din_en => CRC16_rx_dout_en,dout =>frame_dout);zhenjiexi:raycrcjxPORT MAP(clk => clk,reset => reset,en => en,din => frame_dout,dout => recieve_dout,dout_en => recieve_dout_en);jiema:raycrcjmPORT MAP(clk => clk,reset => reset,en => en,din => recieve_dout,din_en => recieve_dout_en,error => error);end Behavioral;---------------------------------------------------------------------------------- -- Company:-- Engineer:---- Create Date: 18:05:46 06/04/2011-- Design Name:-- Module Name: raycrczz - Behavioral-- Project Name:-- Target Devices:-- Tool versions:-- Description:---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:------------------------------------------------------------------------------------ library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity raycrczz isPort ( clk : in STD_LOGIC;reset : in STD_LOGIC;en : in STD_LOGIC;din : in STD_LOGIC;din_en : in STD_LOGIC;dout : out STD_LOGIC);end raycrczz;architecture Behavioral of raycrczz issignal count_en:STD_LOGIC;signal din_in:STD_LOGIC;signal din_en_in:STD_LOGIC;signal count:STD_LOGIC_VECTOR(6 DOWNTO 0);begin-----------输入----------------process(clk,reset)beginif reset = '1' thendin_in <= '0';din_en_in <= '0';elsif (clk'event and clk = '1') thenif en = '1' thendin_in <= din;din_en_in <= din_en;end if;end if;end process;----------使能------------process(clk,reset)beginif reset = '1' thencount_en <= '0';elsif (clk'event and clk = '1') thenif en = '1' thenif din_en = '1' thencount_en <= '1';elsif count = "1010000" thencount_en <= '0';end if;end if;end if;end process;------------位数计数---------process(clk,reset)beginif reset = '1' thencount <= (others => '0');elsif (clk'event and clk = '1') thenif en='1' thenif count_en = '1' thenif count = "1010000" thencount <= (others => '0');elsecount <= count + '1';end if;end if;end if;end if;end process;-------------输出------------process(clk,reset)beginif reset = '1' thendout <= '1';elsif(clk'event and clk = '1') thenif en = '1' thenif din_en_in = '1' thendout <= din_in;elsif din_en = '1' thendout <= '0';else dout <= '1';end if;end if;end if;end process;end Behavioral;-------------------------------------------------------------------------------- -- Company:-- Engineer:---- Create Date: 22:05:28 06/04/2011-- Design Name:-- Module Name: D:/VHDL /tb.vhd-- Project Name: raycrc-- Target Device:-- Tool versions:-- Description:---- VHDL Test Bench Created by ISE for module: raycrczhu---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:---- Notes:-- This testbench has been automatically generated using types std_logic and-- std_logic_vector for the ports of the unit under test. Xilinx recommends-- that these types always be used for the top-level I/O of a design in order-- to guarantee that the testbench will bind correctly to the post-implementation -- simulation model.-------------------------------------------------------------------------------- LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;ENTITY tbcrc1 ISEND tbcrc1;ARCHITECTURE behavior OF tbcrc1 IS-- Component Declaration for the Unit Under Test (UUT)COMPONENT raycrczhuPORT(clk : IN std_logic;reset : IN std_logic;en : IN std_logic;din : IN std_logic;din_en : IN std_logic;error : OUT std_logic);END COMPONENT;--Inputssignal clk : std_logic := '0';signal reset : std_logic := '0';signal en : std_logic := '0';signal din : std_logic := '1';signal din_en : std_logic := '0';--Outputssignal error : std_logic;-- Clock period definitionsconstant clk_period : time := 1us;BEGIN-- Instantiate the Unit Under Test (UUT) uut: raycrczhu PORT MAP (clk => clk,reset => reset,en => en,din => din,din_en => din_en,error => error);-- Clock process definitionsclk_process :processbeginclk <= '0';wait for clk_period/2;clk <= '1';wait for clk_period/2;end process;-- Stimulus processstim_proc: processbegin--rst<='0';--wait for clk_period*5;en<='1';reset<='1';din_en<='0';wait for clk_period*5.5;reset<='0';en<='1';--------------------------------din_en <='1';wait for clk_period*64;din_en <='0';wait;--wait for clk_period*64 ;end process;--din_dv_r<=denin_dv;END;。