首先CRC应用的主要场景:

在数据通信中要求数据的高度可靠性,但实际上由于信道不理想或者噪声干扰都会导致数据的误码率

那么对于信道不理想产生的影响可以用均衡的方法进行改善或者消除,而噪声干扰的数据误码通过差错控制消除,而差错控制的核心是差错编码,其中CRC由于编码和解码简单,检错和纠错能力强得到广泛应用。对随机错误和突发错误都能以较低冗余度进行严格检验

其特征是信息段和校验字段的长度可以任意选定。

在数据存储和数据通信领域,CRC无处不在:著名的通信协议X.25的FCS(帧检错序列)采用的是CRC/CCITT,ARJ/LHA等压缩工具软件采用的是CRC32,磁盘驱动器读写采用的日式CRC16,通常用到的图像存储格式GIF/TIFF等也是采用CRC作为检错手段的

传输差错分为两种:1、比特差错(1可能变成0,0可能变成1);2、收到的帧没有出现差错,但出现了帧丢失、帧重复等。故在数据链路层使用CRC校验,能够实现无比特差错的传输,但这还不是可靠传输。 数据的可靠传输用哪个到了TCP协议,(

可靠数据传输的原理

 

2.CRC校验的基本原理:

  CRC码是由两部分组成的,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码长共n bit,信息码长k bit,就称为(n,k)码,剩余的r bit即为校验位。如:(7,3)码:110 1001,前三位110为信息码,1001为校验码。

3.校验码的生成规则:

  1)将原信息码左移r bit,右侧补零,如 110--> 110 0000;

  2)用110 0000除以g(x)  (注意,使用的是模2除法,见下文),得到的余数即为CRC校验码;

  3)将校验码续接到信息码的尾部,形成CRC码。

4.关于生成多项式g(x)

  在产生CRC校验码时,要用到除法运算,一般来说,这是比较麻烦的,因此,把二进制信息预先转换成一定的格式,这就是CRC的多项式表示。二进制数表示为生成多项式的系数,如下:

  

  所有二进制数均被表示为一个多项式,x仅是码元位置的标记,因此我们并不关心x的取值,称之为码多项式。(我没研究过CRC代数推理过程,没体会到用多项式计算的方便之处,这里要学会的就是给出生成多项式g(x),能写出对应的二进制即可)

  常见的生成多项式如下: CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码用途有限。校验码的位数越多,差错检测能力越高

  

实现的过程已经明确,那么对多项式做模2除法如何实现呢?这里就需要涉及到一种叫LFSR(线性反馈移位寄存器)的使用http://www.cnblogs.com/BitArt/archive/2012/12/22/2827005.html讲的很详细,是一种伪随机数产生的方式,

有所改进的地方就是,可以将伪随机数发生器看作一个Moore型状态机,它的输出只与当前的状态有关;而此时利用LFSR电路,需要引入数据输入端,输出不仅取决于当前的状态,还取决于输入信号,相当于Mealy型状态机,如下图:

  

注意对比与伪随机数产生器中该反馈支路的区别!

  反馈项gr+1gr……g0为生成多项式的系数,依然是1代表存在反馈,0代表不存在反馈;此电路可以完成上述的模2除法操作,若我们要求0xaa的CRC校验码,则从高位到低位顺序输入0xaa共8 bit后,D15……D0中的数据即为所要求的余数,即CRC校验位。

附上代码:实现的是一个有4位信息码,5位校验码的数据编码

module CRC5_GEN(
input rst,
input clk,
input [3:0] data_in,
input d_valid,
output reg[4:0] crc
);

integer i;
reg feedback;
reg [4:0] crc_tmp;
always @(posedge clk or negedge rst)
begin
if(!rst)
crc <= 5'b0;
else if(d_valid==1'b0)
crc <= 5'b0;
else
crc <= crc_tmp;
end

always@( data_in or crc)
begin
crc_tmp = crc;
for(i=3; i>=0; i=i-1)
begin
feedback = crc_tmp[4] ^ data_in[i];
crc_tmp[4] = crc_tmp[3];
crc_tmp[3] = crc_tmp[2];
crc_tmp[2] = crc_tmp[1] ^ feedback;
crc_tmp[1] = crc_tmp[0];
crc_tmp[0] = feedback;
end

end

endmodule

Verilog 实现http://www.cnblogs.com/BitArt/archive/2012/12/26/2833100.html

​      由上面的分析大家应该可以写出串行的code。但是并行的怎么写,以及具体的原理可以参考

写过之后的验证可以使用参考这个网址。​好了,就写这些了。

FPGA实现CRC编码的更多相关文章

  1. CRC编码

    一.循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC. 它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC ...

  2. 循环冗余码crc

    待编码的有效信息组多项式:M(x) 生成多项式(产生校验码的多项式):G(x) 余数多项式:R(x) 商:Q(x) 生成多项式是四次的,所以某个多项式除以生成多项式的余式肯定是三次的,所以要加四位00 ...

  3. CRC校验码原理、实例、手动计算

    目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...

  4. CRC(Cyclic Redundancy Check)循环冗余校验码与海明码的计算题

    (17)采用CRC进行差错校验,生成多项式为G(X)=X4+X+1,信息码字为10111,则计算出的CRC校验码是  (17)  .A.0000  B.0100   C.0010   D.1100试题 ...

  5. CRC算法及C实现

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

  6. Modbus库开发笔记之八:CRC循环冗余校验的研究与实现

    谈到Modbus通讯自然免不了循环冗余校验(CRC),特别是在标准的串行RTU链路上是必不可少的.不仅如此在其他开发中,也经常要用到CRC 算法对各种数据进行校验.这样一来,我们就需要研究一下这个循环 ...

  7. ResDepot CRC码

    参考: 百度百科 crc校验 百度百科 crc编码 生日悖论 CRC32能不能用于检验文件的相同性 Egret RES版本控制 一.Egret的ResDepot在发布时,可以添加crc码. 发布前 发 ...

  8. 循环冗余检验 (CRC) 算法原理

    Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误. 算法原理 假设数据传输过程中需要发送15位的二进制信息g=10100 ...

  9. CRC(循环冗余校验)

    关于CRC(循环冗余校验),我在网上看了许多的文章,感觉看的很懵逼,废话一堆(可能是我理解不上去0.0),下面是我的一些理解(如果有误谢谢指出): 关于crc,它主要分为两个部分,一个是发送端通过cr ...

随机推荐

  1. POJ 1789:Truck History

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21376   Accepted: 8311 De ...

  2. [Java-基础] 注解

    引言 在进行Spring Boot 入门的时候,主程序需要@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用.这个的作用是什么?去掉的话会报错.如 ...

  3. 微信官方小程序示例demo 微信开发者工具打开不显示云开发按钮

    如果直接打开官方的demo,微信开发者工具上是不显示云开发按钮的. 是因为默认appid是测试号.要换成一个正式appid就会显示云开发按钮了. 分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默 ...

  4. ubuntu搭建web服务器

    https://www.linuxidc.com/Linux/2015-11/125477.htm 到“sudo apt-get install libapache2-mod-php5”出现1错误.

  5. Pyspider的简单介绍和初使用

    Pyspider   Pyspider是由国人(binux)编写的强大的网络爬虫系统 Ptspider带有强大的WebUi / 脚本编辑器 / 任务监控器 / 项目管理器以及结果处理器.他支持多种数据 ...

  6. 吴裕雄--天生自然 JAVA开发学习:正则表达式

    import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String conten ...

  7. mongodb的常见使用命令行

    由于cms工程要连接mongodb所以需要在在cms服务端工程添加如下依赖:项目使用spring data mongodb操作mongodb数据库 <dependency> <gro ...

  8. PAT Advanced 1024 Palindromic Number (25) [数学问题-⼤整数相加]

    题目 A number that will be the same when it is written forwards or backwards is known as a Palindromic ...

  9. UML-领域模型-属性

    1.属性预览 2.导出属性是什么? 3.属性使用什么样的数据类型? 常见的数据类型:boolean.Date.String(Text).Integer 其他常见的:SKU.枚举类型等 而在java类中 ...

  10. LGOJ4172 WC2006水管局长

    首先声明,这份代码空间复杂度 \(O(n^2)\),瓶颈在给边打标记 由于博主太菜,懒得再改成低复杂度的打标记了,所以\(BZOJ\)的数据过不去 Description link 给一张图,会有删边 ...