基于FPGA的CRC校验设计

合集下载

基于FPGA的CRC校验设计

基于FPGA的CRC校验设计

基于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冗余校验编码与解码的FPGA实现

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实现可以提供高效的数据传输和错误检测功能,适用于各种应用场景。

基于FPGA实现CRC校验功能的通用异步串口通信

基于FPGA实现CRC校验功能的通用异步串口通信
b sd o a e n FPGA
T ONG a .o g.S Xio r n HENG h n . io Z o g ba ( o eeo te t sa dIfr t nS i c ,We a ec es iesy We a 10 0 hn ) C l g f l Mahma c n nomai ce e i o n i nT ah r vri , i n74 0 ,C ia n Un t n
Ab t a t U T i u e d l st e i tr c fRS 2 2,t ba n a c r t e a o sr c : AR s s d wie y a h e a e o - 3 n f o o ti c u ae s r lc mmu i ain o i nc t f o dt aa,asmp e a d p a t a c e o i l n r ci l h me frUAR e in a d x aia in w sp t o w r .C ci e u d n y c s T d s n e l t a u r a d y l r d n a c g ; z o f c
Tas t r 一种应 用 广 泛 的于 短距 离 串行 传 输 rnmie)是 t 接 口, 常用 于 短 距 离 、 速 、 成 本 通 信 中 , 于 常 低 低 基
FG P A实现起来简单, 方便_ 。为保证传输 的可靠 1 ] 性, 就需要对通信过程进行差错控制 , R C C循环冗 余校验模块是一种查错能力强 , 高效, 可靠的方法 , 在
论分析一致 ,达到 了 预期设计的 目 标。提高了通信的速度 、可靠性和效率。 关键 词 :F G C C检验 ; 用异 步收 发器 ; 靠性 P A; R 通 可

FPGA实现CRC校验电路(内附代码)

FPGA实现CRC校验电路(内附代码)

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校验功能的通用异步串口通信

基于FPGA实现CRC校验功能的通用异步串口通信

基于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校验码生成器设计

基于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)校验码是一种常用的错误检测码。

其原理是通过对数据进行一系列的位操作,生成一个校验码,然后将数据和校验码一起传输,在接收端进行校验,以确定数据的完整性。

基于fpga的循环冗余校验码的实现

基于fpga的循环冗余校验码的实现

摘要:随着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校验算法的实现

Ab s t r a c t : As F PG A i s h i g h s p e e d, h i g h e f f i c i e n c y, l f e x i b l e a n d s t a b l e , h i g h i n t e g r a t i o n, e t c . , S O t h e u s e o f F P GA i n
E E A CC: 6 2 1 0
d o i : 1 0 . 3 9 6 9 / j . i s s n . 1 0 0 5 - 9 4 9 0 . 2 0 1 5 . 0 1 . 0 4 7
基于 F P GA 的 C R C校 验 算 法 的实 现
张 焱 , 任勇峰 , 齐 蕾 , 姚 宗
g u a g e t o a c h i e v e CRC c h e c k, t o v e if r y t h e f e a s i b i l i t y o f t h e p r o g r a m. Ke y wo r d s: e l e c t r o n; F PGA ; CRC c h e c k; s e r i a 1 c o mmu n i c a t i o n; VHDL
( 中北大学仪器科学与动态测试教育部重点实验室 , 太原 0 3 0 0 5 1 )
摘 要 : 由于 F P G A具有速度快、 效率高、 灵活稳定、 集成度高等优点, 所以在串行通信中采用 F P G A来实现串口通信是十分
必要的。由于通信传输 的不确定性 以及干扰等原因 , 串行通 信经常会 出现异常情况 J 。因此 , 在 串行 通信 中添 加 C R C校 验 ,
Z H A NG Y a h, R E N Y o n g f e n g , Q I L e i , Y A O z o n g

fpga crc 校验原理

fpga 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校验查找表算法的设计[权威资料]

基于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校验设计

基于FPGA的CRC校验设计

《数字电路课程设计》实验报告题目:基于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校验码性能分析与基于FPGA的实现

CRC校验码性能分析与基于FPGA的实现

考 虑一个 k 的突发性错误 。 ≤r 假设 c ( 的中间 比特位被随意破 坏 , 则 Ef表示为 : x 1 Ex=【 …+ i ik+ ・ 1 ()】 I + x xx ・‘ ) m (- + () 2 只要使 x 不是 Cx的—个因子 , Gx x无关。而 k , k 1 , g) 则 (与 i ) ≤r则 - ≤r Gx ( 不可 能是一 个更低次方多项式的因子 。因此 , ) 只要使 x 不是 Gx ( 的 ) 个 因子, 长度小 于等于 r 的突发性错误均可被检测出来。 考虑一个 k r > 的突发性错误。 如前 所述 , r k l , ( 有可能 k , — ≥rGx > 则 ) 是 E x )x ¨ + ) 【= lk ・1 )【 - ( 十 的一个因子 , 错误不能被检 出。假设 k l r被破 坏 - =, 比 位的可能组合有 2 特 种 , 如果 所有组合 以相 同概率出现 , 则错误漏 检率 位 I 2 - 。 因此 , R C C的可靠性很 高 , 的 C C生成多项 式( 常用 R 使用 1 位 、 3 l 7 位 、3 ) 3 位 可使漏检率下降到接近于 0 。 4 CR 码 的 F GA实 现IS 、 C P 4D I] 41 .编码实现与仿真 C C码编码系统底部模块设计如图 l R 所示 。 图 l ,r o e 中 C c d 模块 中进行 C C编码运算的操作 , C R 然后把结果送 到 C Cd0 t m oe u 模块 中输出结果 , 从而来 完成编码输 出。 C C码编码波形仿真图为图 2 R 所示 。 4 译码实现与敝验码性链分析与基 于 F GA硇实项 R P
陕西工 业职 业技 术学 院电 气_ 程 学院 田永 毅 7 -
[ 摘 要] 针对在 通信 系统 中, 可靠性 与有效性的矛盾 , 本文介绍 了 C RC校 验的原理 , 重点分析 了 C RC的错误 漏栓 率 , 出了一种 提 FG PA C C R 校验码 的系统底部模块设计 如图 3 所示 。

基于FPGA技术的多通道CRC校验系统

基于FPGA技术的多通道CRC校验系统

a e q i et o hh s e ti g t cs rt Se urm n f g - ed a erycek. ’r e s i p d an i h t
Co p r to ’ r o a nSEP2 i C20 8 C6 c psa o l a a g tf rv rf a o Th e ut h w h tt e d sg a e e F4 4 h d wn o d t r e e i t n. e r s l s o t a e i C me tt i s o i ci s h n n h
c a n lc mpa be wi 2 bt Ete t sa d d h n e o i t l t 3 一 i h me t n a .Th s d sg s s Ve io h r i e i u e rlgHDL o rd r e d s rp i n l g a e n f rha wa e c ito a u g . n
d f c l t e e n e s o i h l v lt n m s in o i ls p p r h s b e c i v d h g l a al lc ci i u t o me tt e d fh g e e r s s fGb t l a e a e n a he e h y p r l y l i h a i o .T i i e c
rd n ac hc C C ss m hc ae nF G c oo yt eina l-h ne hg - edtc o g. e u dn yc ek( R ) yt w ihb sdo P A t h l d s tcan l ihs e h ly e en g o g mui p en o
关键 词:循环冗余校验 ;F G P A:1G p 0 b s以太网;伽罗瓦域

基于FPGA的带CRC校验的异步串口通信

基于FPGA的带CRC校验的异步串口通信

基于FPGA的带CRC校验的异步串口通信摘要:由于FPGA具有速度快,效率高,灵活稳定,集成度高等优点,所以为了提高串口通信的速度和效率,在串行通信中采用FPGA来实现串口通信是十分必要的。

由于通信传输的不确定性以及干扰等原因,串行通信经常会出现异常情况。

然而,在串行通信中添加CRC校验,可以提高通信的可靠性。

采用Verilog HDL设计的一个带CRC校验的串口通信程序,对其下栽到FPGA芯片中进行实验验证,得到的结论是用FPGA 进行串口通信,可大大提高通信的速度和效率,且CRC校验确保了通信的准确性及卡可靠性。

O 引言现场可编程门阵列(field programmable gate array,FPGA)在数字电路设计中已经被广泛使用。

这种设计方式可以将以前需要多块集成芯片的电路设计到一块大模块可编程逻辑器件中,大大减少了电路板的尺寸,增强了系统的可靠性和设计的灵活性。

本文详细介绍了已在实际项目中应用的基于FPGA的串口通信设计。

硬件描述语言(hardware description language,HDL)是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言。

数字逻辑电路设计者可以利用这种语言来描述自己的设计思想,然后利用电子设计自化(EDA)工具进行仿真,再自动综合到门级电路,然后用ASIC或Soft-Core实现其功能。

Verilog HDL是硬件描述语言的一种,用于数字电子系统设计。

串口通信是指在一个时间内传输1位数字数据。

从19世纪的二进位电报编码,发展到现在的RS 232(EIA 232),主要用于连接终端和大型主机。

串口通信在过去的40年里,大大推动了通信技术的发展。

通信协议是指通信双方的一种约定。

约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。

因此,也叫通信控制规程,或称传输控制规程,它属于ISO’sOSI七层参考模型中的数据链路层,其主要完成的作用如下:(1)实现数据格式化;(2)进行串/并转换;(3)控制数据传输速率;(4)进行错误检测;(5)进行TTL与EIA电平转换;(6)提供EIA-RS 232C接口标准所要求的信号线;(7)为了完成上述串行接口的任务,串行通信接口电路一般由可编程的串行接口芯片、波特率发生器、EIA与TTL电平转换器以及地址译码电路组成。

基于FPGA的CRC校验 西邮精版

基于FPGA的CRC校验 西邮精版

西安邮电学院FPGA课程设计报告题目:基于FPGA的CRC校验院系:通信与信息工程学院专业班级:电科0903学生姓名:于宝军导师姓名:山蕊起止时间:2012-9-10至 2012-9-21年月日FPGA课程设计报告提纲1.任务本实验主要完成一个完整的CRC校验过程,其中包括数据源发送,CRC编码、CRC校验。

2. 目的本实验主要以多项式16125=+++为基础,完成CRC校验。

()1g x x x x3.使用环境(软件/硬件环境,设备等)a)windows环境下使用ModelSim仿真工具。

b)windows环境下使用QuartusII综合工具。

4. FPGA课程设计详细内容4.1 技术规范⑴完成功能:以多项式16125=+++为基础完成CRC校验。

g x x x x()1⑵实验原理:循环冗余校验CRC是由分组线性码的分支而来,其主要应用是二元码组。

CRC的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(即CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。

在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

任何一个由二进制位串组成的代码可以和一个多项式相对应。

例如k为要发送的信息位位数,可对应一个(k-1)次多项式,r位冗余位可对应于一个(r-1)次多项式r(x),在CRC 校验编码时,由信息位产生冗余码的编码过程就是求余数r(x)的过程。

3.引脚定义4.2 设计方案1.总体设计方案本实验主要完成CRC编码、CRC校验。

2.详细设计方案1)CRC编码①输入 32位任意报文信息,已知17位生成多项式对应的CRC码,则在报文信息后拼接16位0组成新的报文,将新组成的报文与已知多项式对应的二进制数据流进行异或运算。

②判断报文信息首位是否为0,若为0,则将报文信息左移一位进行计数;若为1,则将报文信息与多项式生成的数据流进行逐位异或运算,将运算得到的结果保存在寄存器中,并且开始计数,再将报文信息左移一位,将得到的结果替换报文信息高17位,继续与已知多项式进行异或运算。

基于FPGA技术的多通道CRC校验系统

基于FPGA技术的多通道CRC校验系统

基于FPGA技术的多通道CRC校验系统李洪进;邓世昆【期刊名称】《计算机系统应用》【年(卷),期】2012(021)001【摘要】CRC codes are widely used in networking and storage, and many other occasions due to its simple encoding rules. With the development of modern storage and transmission technologies, the check of software code has been difficult to meet the needs of high level transmission of Gbit. This paper has been achieved highly parallel cyclic redundancy check (CRC) system which based on FPGA technology to design a multi-channel high-speed technology. The design uses five parallel channels of 2Gbps check in order to achieve data throughput rate of 10Gbps. Each CRC channel compatible with 32-bit Ethernet standard. This design uses VerilogHDL for hardware description language, QuartusII8.0 for Integrated wiring, and packaging the processing unit into an independent IP core, then uses the Altera Corporation's EP2C20F484C6 chips as download target for verification. The results show that the design can meet the rate's requirements of high-speed data integrity checks.%CRC编码由于其简单的编码规则的在网络及存储等诸多场合得到广泛应用,随着现代存储和传输技术的发展,软件编码校验已难以满足Gbit级高速传输的需要.基于FPGA技术设计了一个采用多通道高度并行技术实现的高速循环冗余校验(CRC)系统.系统采用五个2Gbps校验通道并行工作的方式来达到10Gbps的数据吞吐率,系统实现采用VerilogHDL硬件描述语言设计,在QuartusII8.0平台上进行综合与布线,并将该处理单元封装为独立的IP核,并以Altera公司的EP2C20F484C6芯片为下载目标进行实现验证.综合结果表明,本设计可满足高速数据完整性检查的速率要求.【总页数】4页(P144-147)【作者】李洪进;邓世昆【作者单位】云南大学信息学院,昆明650091;遵义医学院医学信息工程系,遵义563000;云南大学信息学院,昆明650091【正文语种】中文【相关文献】1.一种通用多通道并行CRC计算及其实现 [J], 徐展琦;裴昌幸;董淮南2.一种基于FPGA技术的多通道信号跟踪系统 [J], 刘汉霞3.基于FPGA技术的多通道符合计数器研制 [J], 叶惠;张安宁;王亿芳;刘延4.基于FPGA技术的高压断路器机械参数测试仪校验系统 [J], 晏锋; 周菊根; 龚伟; 沈湘于; 柴仁勇5.基于电子病历的病案首页审核校验系统的设计与实现 [J], 顾学赛;何伟因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数字电路课程设计》实验报告题目:基于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;。

相关文档
最新文档