循环冗余校验

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表。
CRC为校验和的一种,是两个字节数据流采用二进制除法(没有进位,使用XOR来代替减法)相除所得到的余数。其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为的预定义(短)的二进制数,通常用多项式的系数来表示。在做除法之前,要在信息数据之后先加上个0.
CRC是基于有限域GF(2)(即除以2的同余)的多项式环。简单的来说,就是所有系数都为0或1(又叫做二进制)的多项式系数的集合,并且集合对于所有的代数操作都是封闭的。例如:

2会变成0,因为对系数的加法运算都会再取2的模数。乘法也是类似的:

我们同样可以对多项式作除法并且得到商和余数。例如,如果我们用x+x+x除以x+ 1。我们会得到:

也就是说:

等价于:

这里除法得到了商x^2+ 1和余数-1,因为是奇数所以最后一位是1。
字符串中的每一位其实就对应了这样类型的多项式的系数。为了得到CRC,我们首先将其乘以,这里n是一个固定多项式的阶数,然后再将其除以这个固定的多项式,余数的系数就是CRC。
在上面的等式中,表示了本来的信息位是111, 是所谓的钥匙,而余数1(也就是)就是CRC. key的最高次为1,所以我们将原来的信息乘上来得到,也可视为原来的信息位补1个零成为1110。
一般来说,其形式为:

这里M(x)是原始的信息多项式。K(x)是阶的“钥匙”多项式。表示了将原始信息后面加上个0。R(x)是余数多项式,即是CRC“校验和”。在通信中,发送者在原始的信息数据M后附加上n位的R(替换本来附加的0)再发送。接收者收到M和R后,检查是否能被整除(此处整除计算规则为模二运算)。如果是,那么接收者认为该信息是正确的。值得注意的是就是发送者所想要发送的数据。这个串又叫做codeword.
CRCs经常被叫做“校验和”,但是这样的说法严格来说并不是准确的,因为技术上来说,校验“和”是通过加法来计算的,而不是CRC这里的除法。
“错误纠正编码”(Error–Correcting Codes,简称ECC)常常和CRCs紧密相关,其语序纠正在传输过程中所产生的错误。这些编码方式常常和数学原理紧密相关。例如常见于通信或信息传递上BCH码、前向错误更正、Error detection and correction等。


//  Module Name:    CRC4_D11
//  Author Name:    Yang Cheng Yu 杨成煜
//  Project Name:   DSHOT600
//  University      NanJing University or Information Science & Technology
//                  南京信息工程大学 电子与信息工程学院
//                  Xi An University of Technology
//                  西安理工大学 自动化与信息工程学院
//  DATE:           2021/5/4
//  Describe:
//  用于DSHOT600协议中,11位数据循环冗余码
//  的生成。其中包含3级流水线,数据输入有效
//  位置1后的第2个时钟周期CRC数据建立
//

module CRC4_D11(input                   i_sys_clk,input                 i_sys_rst_n,input       [10:0]      i_data,input        [3:0]       i_crc,output    reg [3:0]       o_crc_new,input                 i_valid,output  reg             o_valid
);// polynomial: x^4 + x^3 + x^2 + x^1 + 1// data width: 11// convention: the first serial bit is D[10]reg[1:0]             cnt_flow;//流水线计数器reg[10:0]              r_data;reg[3:0]             r_crc;reg[1:0]              r_i_valid;wire                  w_i_valid_pedge;assign                  w_i_valid_pedge = r_i_valid[0]&(~r_i_valid[1]);always  @(posedge i_sys_clk or negedge i_sys_rst_n)beginif(~i_sys_rst_n)r_i_valid <= 2'd0;elser_i_valid <= {r_i_valid[0],i_valid};endalways   @(posedge i_sys_clk or negedge i_sys_rst_n)beginif(~i_sys_rst_n)begincnt_flow <= 2'd0;r_crc <= 4'd0;r_data <= 11'd0;o_crc_new <= 4'd0;o_valid <= 1'b0;endelse case(cnt_flow)2'd0:begino_valid <= 1'b0;if(w_i_valid_pedge==1'b1)begin//数据有效位,读取一帧数据cnt_flow <= cnt_flow + 1'b1;r_data <= i_data;r_crc <= i_crc;endend2'd1:begino_crc_new[0] <= r_data[10] ^ r_data[6] ^ r_data[5] ^ r_data[1] ^ r_data[0] ^ r_crc[3];o_crc_new[1] <= r_data[10] ^ r_data[7] ^ r_data[5] ^ r_data[2] ^ r_data[0] ^ r_crc[0] ^ r_crc[3];o_crc_new[2] <= r_data[10] ^ r_data[8] ^ r_data[5] ^ r_data[3] ^ r_data[0] ^ r_crc[1] ^ r_crc[3];o_crc_new[3] <= r_data[10] ^ r_data[9] ^ r_data[5] ^ r_data[4] ^ r_data[0] ^ r_crc[2] ^ r_crc[3];    cnt_flow <= cnt_flow + 1'b1;end2'd2:begino_valid <= 1'b1;cnt_flow <= 2'd0;endendcaseendendmodule

简单测试文件

`timescale  1ns/1ns     //时间精度
`define clock_period 20    //时钟周期
module tb_crc4_11;  //实体名称//=====================<系统端口>=============================reg                 i_sys_clk       ;reg                    i_sys_rst_n     ;reg        [10:0]      i_data          ;reg        [3:0]       i_crc           ;wire   [3:0]       o_crc_new       ;reg                    i_valid         ;wire               o_valid         ;integer                i               ;
CRC4_D11 CRC4_D11_inst(.i_sys_clk           (i_sys_clk),.i_sys_rst_n        (i_sys_rst_n),.i_data               (i_data),.i_crc             (i_crc),.o_crc_new          (o_crc_new),.i_valid            (i_valid),.o_valid          (o_valid)
);task crc_gen;input[10:0]      data;begin#(`clock_period);i_data = data;i_crc = o_crc_new;#(`clock_period);i_valid = 1'b1;#(`clock_period);i_valid = 1'b0;#(`clock_period*10);end
endtask//=====================<时钟信号>=============================
initial begini_sys_clk = 1;forever#(`clock_period/2)  i_sys_clk = ~i_sys_clk;
end//=====================<复位信号>=============================
initial begini_sys_rst_n = 0;#(`clock_period*20+1);i_sys_rst_n = 1;
end//=====================<激励信号>=============================
initial begini_data = 11'd0;i_crc = 4'd0;i_valid = 1'b0;i = 0;#(`clock_period*20+1);//初始化i_data = 11'd1456;for(i=0;i<10;i=i+1)begincrc_gen(i_data);#(`clock_period*2);end
end endmodule

Wave

3级流水线11位-4位CRC循环冗余校验码生成器Verilog相关推荐

  1. CRC循环冗余校验引起的二进制除法如何计算风暴

    文章目录 知道两个概念 模2和 模2减 两种不同的二进制除法 除法 模2除法 CRC 循环冗余校验 编码过程 差错检测能力 谈CRC循环冗余校验的之前,先把二进制除法说一下,先回忆一下十进制之间的除法 ...

  2. crc循环冗余校验 php,crc 循环冗余校验

    --- title: crc 循环冗余校验 date: 2018-09-26 updated: 2018-10-06 --- # crc 循环冗余校验 CRC(Cyclic Redundancy Ch ...

  3. CRC循环冗余校验(计算机网络)

    CRC循环冗余校验 CRC差错检验的过程 提要 CRC的具体过程 例题详解 CRC差错检验的过程 提要  数据在链路层进行传输时,为了保证接收到的数据比特流是准确无误的,会采用CRC循环冗余校验的方式 ...

  4. CRC循环冗余校验是如何纠错的

    引言 昨天同学突然问我CRC循环冗余校验是如何纠错的?我突然大脑一片空白,学过校验码自然知道CRC循环冗余校验码是可以检错和纠错,但是仿佛只知道求出检验码和检错的过程,但是不知道如何纠错的过程,查询书 ...

  5. 终于弄懂 CRC 循环冗余校验 辽

    概述 CRC 即 Cyclic Redundancy Check 的缩写 CRC 循环冗余校验属于检错码,只能检测出现了错误,但无法纠正错误. 与CRC循环冗余校验类似的,还有奇/偶校验,但是 CRC ...

  6. CRC(循环冗余校验) BCC校验(异或校验) 温度换算 在线计算

    1,CRC(循环冗余校验)在线计算 2,BCC校验(异或校验)在线计算 3,温度换算 4,在线换算器

  7. CRC循环冗余校验码总结

    一.CRC简介 先在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用除法及余数的原理来作错误侦测(Error Detecting ...

  8. CRC循环冗余校验检错的原理

    比起奇偶校验码(PCC)只能校验一位错误,循环冗余校验码(CRC)的检错能力更强,可以检出多位错误. 1.CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形 ...

  9. CRC 循环冗余校验码 的计算方法

    循环冗余校验CRC(Cyclical Redundancy Check)字段位于尾部,有32位,有时称为IEEE/ANSI标准的CRC32.要使用一个n位CRC监测 数据传输错误,被检查的消息首先要追 ...

最新文章

  1. Flash XSS 漏洞详解 根治的好办法
  2. Linux / sudo、su、sudo su、sudo -i 使用和区别
  3. git配置中文乱码_解决git中文乱码问题
  4. [转]java String的经典问题(new String(), String)
  5. 网络信息安全基本属性
  6. linux 抓包教程
  7. 聊聊mq中消息消费的几种方式
  8. 2022管理类联考真题不含答案-文都管联院
  9. ROS机器人建模与仿真(一)--URDF机器人建模
  10. java乘方运算符号_Java 4. 运算符号
  11. 攻防世界(解密篇Crypto)---混合编码
  12. 让图片和文字在一行中垂直居中对齐的方法
  13. 客观分析电子合同是如何提升效率的?
  14. MATLAB矩阵变换
  15. 实现linux多台服务器间目录文件同步
  16. Android数据库操作
  17. linux u盘图标变了,linux启动u盘制作工具u盘图标ico制作
  18. Numbers Mac表格的功能与介绍
  19. 汉字八大基本笔画-东方星书法艺术
  20. 统计拼音字母使用频率 python

热门文章

  1. 基于Mapbox实现地图的样式配置
  2. c语言程序设计 doc,C语言程序设计61844.doc
  3. 关于Eureka注册中心启动报错的原因
  4. discuz插件开发及页面跳转教程
  5. 如何在Linux上部署web程序
  6. 从 Linus Torvalds 的成功中,我发现了这五个“残酷”真相
  7. va_start用法
  8. 模拟角频率和数字角频率
  9. 微软在华十年:向中国倾斜
  10. 五种知名的分布式数据库大PK