CRC校验实验报告
- 格式:doc
- 大小:148.50 KB
- 文档页数:8
CRC 检验码实验报告一 实验题目(1) 实现CRC 的校验过程,生成多项式为CRC12,要求设计简单的图形界面。
(2) 完成内容包括:输入发送数据序列,根据生成多项式完成余数计算,输出带有校验码的发送数据序列。
模拟正确发送、出现离散的一位错、离散的两位错以及长度小于12的突发错,给出相应的输出。
二 实验工具及环境实验语言:JAVA 实验工具:eclipese 三 实验思路 (1) 实验原理CRC 校验码的编码方法是用待发送的二进制数据t(x)移位生成多项式位数,其结果r(x)除以生成 多项式g(x),将最后的余数与上r(x)作为CRC 校验码。
(2) 实验思路 1.实现过程分实验类图2.计算CRC 检验码:1)用户输入发送数据比特序列A;2)默认为12位CRC 生成多项式,用户可根据需要自行修改CRC 生成多项式B; 3)根据B 的位数,对A 进行左移位相应的位数(相当于做2^n 的乘积运算),形成C;实现计算CRC 校验码与实现模拟出错的算法类选择应用主界面类,包括模拟CRC 出错与计算CRC 校验计算CRC 校验码界面模拟CRC 出错4)对生成多项式和发送数据流进行异或运算,计算余数D;5)余数D+C就形成了带有CRC检验码的数据比特序列。
3. CRC检验码出错模拟:用户输入原CRC检验码的数据比特序列A,选择待模拟的错误类型;程序给出相应模拟出错结果。
四实验结论1.优点1)实现了多种生成多项式CRC检验码的生成与检验2)检验与计算分开,功能明确3)可对用户输入数据进行检查,动态交互2.缺点1)在检验CRC校验码时,只能有用户手动输入数据,不能粘贴复制,比较麻烦2)页面布局与外观有待提高。
CRC校验引言:随着技术的不断进步,各种数据通信的应用越来越广泛。
由于传输距离、现场状况、干扰等诸多因素的影响,设备之间的通信数据常会发生一些无法预测的错误。
为了降低错误所带来的影响,一般在通信时采用数据校验的办法,而循环冗余码校验是常用的重要校验方法之一。
AVR高速嵌入式单片机是8位RISC MCU,执行大多数指令只需一个时钟周期,速度快(8MHz AVR的运行速度约等于200MHz 80C51的运行速度),32个通用寄存器直接与ALU相连,消除了运算瓶颈;内嵌可串行下载或自我编程的Flash和EPPROM,功能繁多,具有多种运行模式。
本文采用Atmel公司的Atmega128高速嵌入式单片机,依照IEEE 1999年公布的802.11无线局域网协议标准,采用32位循环冗余校验码(Cyclic Redundancy Check)实现无线传输数据时的差错校验。
1 CRC循环冗余校验码原理1.1 数据传输的帧格式根据IEEE制定的802.11无线局域网络协议,在数据传输时都应按照帧传输。
这里,我们采用了信息处理系统-数据通信-高级数据链路控制规程-帧结构,它的每个帧由下列字段组成(传输顺序自左至右):地址——数据站地址字段;控制——控制字段。
信息——信息字段;CRC校验位——根据前面三个字段生成的CRC校验位。
由地址、控制、信息三个字段组成的总的字段统称为数据段。
1.2 CRC校验码的理论生成方法CRC校验采用多项式编码方法,被处理的数据块可以看作是一个n阶的二进制多项式。
这里,假定待发送的二进制数据段为g(x),生成多项式为 m(x),得到的CRC校验码为c(x)。
CRC校验码的编码方法是用待发送的二进制数据g(x)除以生成多项式m(x),将最后的余数作为CRC校验码,实现步骤如下。
① 设待发送的数据块是m位的二进制多项式 g(x),生成多项式为r阶的m(x)。
在数据块的末尾添加r个0,数据块的长度增加到m+r 位,对应的二进制多项式为G(x) 。
沈阳工程学院学生实验报告实验室名称:信息工程系软件实验室实验课程名称:计算机网络实验项目名称:CRC校验编程实现班级:软本094姓名:王诗娟陈志银刘云峰学号:02、10、14实验日期:2012年03月26日实验台编号:15 指导教师:郑秀颖批阅教师(签字):成绩:一.实验目的掌握并理解CRC校验算法,编程实现CRC。
二.实验内容1.设计CRC校验算法。
.2.编程实现CRC校验。
三.实验前的准备1.复习、熟悉CRC校验算法。
2.编写好程序,上机调试。
四.实验要求及实验软硬件环境【基本要求】1.掌握并理解CRC校验算法。
2.编程实现CRC。
3.完成实验报告。
【实验组织方式】小组实验。
【实验条件】配置有java运行环境的微机一台,MyEclipse。
五.实验步骤1.掌握并理解CRC校验算法。
2.设计发送界面。
3.编程实现CRC校验。
4.设计接收界面。
5.调试并实现程序。
6.参加答辩,并撰写实验报告。
六.主要程序部分(Java语言实现)1.发送端主界面MainFrame.java 的主要代码如下所示。
jb.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {String input1 = new String(jtf1.getText());String input2 = new String(jtf2.getText());if("".equals(input1) || "".equals(input2) || input1 == null || input2 == null){JOptionPane.showMessageDialog(jf, "请输入。
", "错误", JOptionPane.ERROR_MESSAGE);}else{ if(dealer.legal_binary(input1)){if(dealer.legal_g_p(input2)){String checkSum = dealer.get_cheksum(input1, input2);String endResult = new String(input1+checkSum);jtf3.setText(checkSum);jtf4.setText(endResult);try {String tem =endResult + "." +input2;fo.inputFile(tem);} catch (Exception e1) {e1.printStackTrace();}}else{JOptionPane.showMessageDialog(jf, "输入的生成多项式不正确", "错误", JOptionPane.ERROR_MESSAGE);}}else{JOptionPane.showMessageDialog(jf, "输入不正确", "错误", JOptionPane.ERROR_MESSAGE);} }}});jb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0) {jp1.setVisible(false);GetMessage gm = new GetMessage();String str="";try {str = fo.outputFile();} catch (Exception e) {e.printStackTrace();}String L="";String R="";int k= str.length();for (int i = 0; i < str.length(); i++){if (str.substring(i, i + 1).equals(".")){L=str.substring(0,i).trim();R=str.substring(i+1,k).trim();}}gm.jtf1.setText(L);gm.jtf2.setText(R);String res = dealer. get_cheksum (str, R);gm.jtf3.setText(res);gm.setVisible(true);jf.add(gm);}});2.对发送和接收的处理类Dealer.java的主要代码如下所示。
循环冗余校验编解码电路设计实验报告一、引言循环冗余校验(CRC)是一种常用于检测和校正数据传输错误的技术。
在通信领域,CRC编解码电路是一种重要的硬件设计,用于验证数据传输的准确性。
本实验旨在通过设计循环冗余校验编解码电路,探索其工作原理和实际应用。
二、背景知识1.循环冗余校验原理循环冗余校验利用多项式除法的性质来实现数据校验。
发送端将数据和校验值进行运算得到余数,并将余数附加到数据后一起发送。
接收端通过对接收到的数据进行除法运算,得到的余数判断数据是否正确。
2.CRC编码过程–发送端:将数据进行扩展,加上用于校验的位数,并使用预定的生成多项式进行除法运算得到余数,将余数附加在数据后面发送出去。
–接收端:接收到数据后,再次进行除法运算,得到的余数为0则说明数据传输正确,否则说明存在错误。
3.CRC解码过程–发送端:发送数据和余数。
–接收端:接收数据和余数,使用与发送端一样的生成多项式进行除法运算,得到的余数判断数据是否正确。
三、实验设计与实现1. 实验目的了解循环冗余校验的原理,并通过设计和实现循环冗余校验编解码电路加深对其理解。
2. 实验器材与材料•FPGA开发板:用于搭建实验电路•Vivado软件:用于设计和验证电路•扁平电缆:用于连接FPGA开发板和外部设备3. 实验步骤1.了解所用的生成多项式,确定校验位数和除法运算方式。
2.使用Vivado软件创建工程,选择适合的FPGA开发板型号。
3.设计循环冗余校验编码模块,并使用Verilog语言进行描述。
4.设计循环冗余校验解码模块,并使用Verilog语言进行描述。
5.设计测试模块,用于生成测试数据和验证结果。
6.进行RTL级仿真,验证电路设计的正确性。
7.将设计文件综合、实现和下载到FPGA开发板。
8.在FPGA开发板上测试编解码电路的功能和性能。
9.分析实验结果,总结经验和教训。
四、实验结果与分析1. RTL级仿真结果在RTL级仿真中,我们生成了不同的输入数据,并通过编解码电路计算得到校验值和余数。
实验三
1、实验题目:CRC校验
PPP协议受到数据帧后要对数据部分连同FCS字段做CRC校验,结果若不为“0”,则可以肯定数据在传输过程中出错;结果若为“0”,则只能说明很大概率上数据在传输的过程中没有出错,而不是百分之百不出错。
这个概率与CRC校验时采用的除数有关,我们把使用某个除数做CRC校验,结果为“0”且数据实际不出错的概率称为该除数的有效性。
本次试验要求同学们以实验的方法验证CRC-16的有效性。
2、实验内容:
(1)随机取1个128位数A。
(2)将A与CRC-16做除法得余数B,A*216+B保存在C中。
(3)随机修改C中的1个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。
(4)随机修改C中的2个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。
(5)随机修改C中的3个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。
3、实验报告内容:
(1)CRC校验原理。
(2)实验记录
(3)随机产生的128位数(以16进制表示)。
(4)除法运算的算法描述。
(5)随机修改C中的1个比特,重新与CRC-16做除法运算,余数为0的二进制组合。
(6)随机修改C中的2个比特,重新与CRC-16做除法运算,余数为0的二进制组合。
(7)随机修改C中的3个比特,重新与CRC-16做除法运算,余数为0的二进制组合。
4、实验结果分析:
理论上CRC-16的有效性(不一定100%有效)。
数电实验报告题目 CRC校验原理仿真实验班级 29001040班姓名刘奎学号 2903003015 时间 2011年5月25日地点英才实验学院创新实验室指导教师李尚泽摘要本实验利用循环校验码(CRC)校验原理通过对通信系统发射端的原始数据生成CRC校验位,并按照RS-232的传输协议组帧,在传输过程中加入随机的噪声,在接收端对RS-232传输帧格式进行解析,并完成CRC校验。
整个过程在Modelsim上仿真实现。
关键词CRC校验仿真目录第一章实验原理与任务 (2)第二章设计思路、方法及方案 (3)第三章 FPGA模块程序设计与仿真 (3)第四章结束语 (4)附录 (4)第一章 实验任务与原理1、任务指标利用VHDL 完成16比特CRC 校验程序的设计,并能利用modelsim 仿真得到电路的时序波形。
2、实验要求在了解CRC 校验原理的前提下,在发送端对原始数据生成CRC 校验位,并按照RS-232的传输协议组帧,在接收端对RS-232传输帧格式进行解析,并完成CRC 校验。
整个过程在Modelsim 上仿真实现。
3、原理阐述循环校验码(CRC )是数据通信领域中常用的一种差错校验码,其特点是信息字段和校验字段的长度可以任意选定。
生成CRC 校验码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’或‘1’的多项式一一对应,例如‘1010111’对应的多项式为6421x x x x ++++。
CRC 码集选择的原则:若设码字长度为N ,信息字段长度为K ,校验字段长度为R ,则N=K+R ;对于CRC 码集中的任一码字,存在且仅存在一个R 次多项式g(x)使得:()()()()()RV x A x g x x m x r x ==+其中m(x)为K 次信息多项式,r(x)为R-1次校验多项式,g(x)称为生成多项式。
V(x)为发送的信息加码字多项式。
2012()...RR g x g g x g x g x=++++发送方通过指定的g(x)产生CRC 码字,接收方则通过g(x)来验证CRC 码字,若传输码字多项式V(x)能除尽g(x),则传输正确。
XXXXXXXX大学(计算机网络)实验报告实验名称 CRC校验实验时间年月日专业姓名学号预习操作座位号教师签名总评一、实验目的:掌握CRC冗余码校验的基本原理,编程实现CRC冗余码校验。
二、实验原理:1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中:m(x)为K次信息多项式,r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+g R x R发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。
4、CRC校验码软件生成方法:借助于多项式除法,其余数为校验字段。
发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10信息字段校验字段接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,三、实验内容:1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB(最高位)补零,移出并检查LSB(最低位)。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。
此时一个8-bit数据处理完毕。
实验三循环冗余码效验(CRC)
一、实验目的
熟悉和学习ISO/IEC18000-3,ISO15693标准规范第三部分协议,其中贯串所有指令部分CRC的内容,特别是AnnexD的内容。
理解它的原理、流程和软件实验办法。
二、实验内容
通过使用带CRC处理过程的指令和不带CRC过程的指令读取单个标签,比较其指令的读取结果。
分析实验数据,了解CRC的作用,掌握指令的应该取得的结果。
三、实验原理
ISO15693标准规范第三部分下的AnnexD部分。
四、所需仪器
供电电源、单张电子标签。
五、实验步骤
1、设置
加电运行系统,在系统的天线内放置多个标签,打开软件Tag-reader.exe.正确设置串门、操作如图
2、操作
2.1 带CRC命令操作
在系统软件下,“寻卡”处,选择“单卡识别”,确定“寻卡”动作。
操作如图所示:
清空数据,在系统软件下,“测试命令”处,选择运行“测试循环冗余校验码”,选择“发送带循环冗余校验的寻卡命令”,操作如图:
2.2不带CRC命令操作
清空数据,选择“发送不带循环冗余校验的寻卡命令”,操作如图:。
循环冗余校验编解码电路设计实验报告在数字通信中,循环冗余校验(CRC)是一种常用的错误检测和纠正技术,它通过在数据包中添加校验位来检测数据传输过程中的错误。
为了更好地理解和应用CRC技术,我们进行了循环冗余校验编解码电路设计的实验。
我们需要了解CRC的基本原理。
CRC是通过对数据进行除法运算,得到余数然后将余数添加到数据包中作为校验位。
接收端在接收到数据包后,再次进行除法运算,如果余数为0,则说明数据传输正确,否则说明数据传输过程中出现了错误。
在实验中,我们首先设计了CRC编码电路。
编码电路的主要功能是对输入的数据进行除法运算,然后将余数作为校验位添加到数据包中。
我们使用了Verilog HDL语言来实现CRC编码电路,在编码过程中需要考虑多项式的选取、除法运算的实现等问题。
接下来,我们设计了CRC解码电路。
解码电路的主要功能是对接收到的数据包进行除法运算,然后判断余数是否为0,从而确定数据传输是否正确。
同样,我们使用Verilog HDL语言来实现CRC解码电路,需要考虑多项式的选取、除法运算的实现等方面。
在实验中,我们还需要对设计的CRC编解码电路进行仿真和验证。
通过仿真可以检查电路的功能是否符合设计要求,验证其在不同情况下的正确性和稳定性。
我们可以使用仿真工具如ModelSim等来进行仿真,观察电路的输入输出情况,验证其正确性。
我们需要在实际硬件平台上实现设计的CRC编解码电路,并进行性能测试。
通过性能测试可以评估电路在实际应用中的性能表现,包括速度、准确性等方面。
我们可以使用FPGA等硬件平台来实现CRC编解码电路,并进行性能测试,验证其在实际应用中的可靠性。
总的来说,通过本次实验,我们深入了解了循环冗余校验的原理和实现方法,掌握了CRC编解码电路的设计与实现技术。
这将有助于我们在数字通信领域中更好地应用CRC技术,提高数据传输的可靠性和安全性。
希望通过不懈的努力和实践,我们能够进一步完善和优化CRC编解码电路,为数字通信技术的发展做出贡献。
实验三CRC校验一、CRC校验码的基本原理编码过程:CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。
其实现步骤如下:1 设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。
在数据块的末尾添加r个0,数据块的长度增加到m+r位。
2 用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。
此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。
3 将y(x)的尾部加上校验码,得到二进制多项式。
就是包含了CRC校验码的待发送字符串。
解码过程:从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式所以解码时可以用接收到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。
许多CRC的硬件解码电路就是按这种方式进行检错的。
同时,可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。
解码过程示例:运行结果:附录(实现代码):using System;using System.Collections.Generic;using System.Text;namespace CRC{public abstract class Change{/// <summary>/// 字节数组转进制/// </summary>/// <param name="bytes">字节数组</param>/// <param name="b1">字节数组长度</param>public static string ByteToHex(byte[] bytes, int b1){string returnStr = "";if (bytes != null){for (int i = 0; i < b1; i++){returnStr += bytes[i].ToString("x2").ToUpper();} }return returnStr;}/// <summary>/// 16进制转字节数组/// </summary>/// <param name="hexStr">16进制数</param>public static byte[] HexToByte(string hexStr){hexStr = hexStr.Replace(" ", "");if ((hexStr.Length % 2) != 0)hexStr += " ";//空格byte[] bytes = new byte[hexStr.Length / 2];for (int i = 0; i < bytes.Length; i++){bytes[i] = Convert.ToByte(hexStr.Substring(i * 2, 2), 16);} return bytes;}/// <summary>/// 字符串转进制/// </summary>/// <param name="str">字符串</param>/// <returns></returns>public static string StrToHex(string str){if (str == "") return "";byte[] bTemp = System.Text.Encoding.Default.GetBytes(str);return ByteToHex(bTemp, bTemp.Length);}/// <summary>/// 16进制转字符串/// </summary>/// <param name="str">16进制</param>/// <returns></returns>public static string HexToStr(string str){byte[] bytes = new byte[str.Length];bytes = HexToByte(str);return Encoding.Default.GetString(bytes);}}}namespace CRC{//哈夫曼树150// 结点类Node的定义如下:public class Node{private int weight; //结点权值private int lChild; //左孩子结点private int rChild; //右孩子结点private int parent; //父结点//结点权值属性public int Weight{get{return weight;}set{weight = value;}}//左孩子结点属性public int LChild{get{return lChild;}set{lChild = value;}}//右孩子结点属性public int RChild{get{ return rChild;}set { rChild = value; } } //父结点属性public int Parent{ get{ return parent; }set {parent = value; } } //构造器public Node(){weight = 0;lChild = -1;rChild = -1; parent = -1; }//构造器public Node(int w, int lc, int rc, int p){weight = w;lChild = lc;rChild = rc;parent = p;}}public class HuffmanTree{private List<Node> data = new List<Node>(); //结点数组private int leafNum; //叶子结点数目//索引器public Node this[int index]{get{return data[index];}set{data[index] = value;}}//叶子结点数目属性public int LeafNumpublic int LeafNum{get{ return leafNum;set{ leafNum = value; } }//构造器public HuffmanTree(){ }public HuffmanTree(List<NumKindchar> m_NumKind){leafNum = m_NumKind.Count;for (int j = 0; j < 2 * m_NumKind.Count - 1; j++)//n中字符共需要2n-1个节点{Node databuff = new Node();if (j < this.leafNum){databuff.Weight = m_NumKind[j].num; }data.Add(databuff);//每创建一个节点将节点加入节点数组data当中} }public List<Node> Create(){int max1, max2, tmp1, tmp2;//处理n个叶子结点,建立哈夫曼树for (int i = 0; i < this.leafNum - 1; ++i){ max1 = max2 = Int32.MaxValue;tmp1 = tmp2 = 0;//在全部结点中找权值最小的两个结点for (int j = 0; j < this.leafNum + i; ++j){ if ((data[j].Weight < max1) && (data[j].Parent == -1)){ max2 = max1;tmp2 = tmp1;tmp1 = j;max1 = data[j].Weight; }else if ((data[j].Weight < max2) && (data[j].Parent == -1)){ max2 = data[j].Weight;tmp2 = j;} }data[tmp1].Parent = this.leafNum + i;data[tmp2].Parent = this.leafNum + i;data[this.leafNum + i].Weight = data[tmp1].Weight + data[tmp2].Weight;data[this.leafNum + i].LChild = tmp1;data[this.leafNum + i].RChild = tmp2;}return data; }}public class NumKindchar{ public char letter { get; set; }//字符public int num { get; set; }//字符出现的次数public List<bool> huffmancode { get; set; }//字符对应的huffman编码}public class codeChar{public char numChar { get; set; }public string codeCharater { get; set; }}}。