目录

一、CRC的基本原理

二、CRC生成步骤

2.1举个栗子

三、Verilog实现

四、参考资料

4.1 CRC在线计算器


一、CRC的基本原理

CRC :Cyclic Redundancy Check循环冗余校验码

将被处理的报文比特序列当做一个二进制多项式A(x)的系数,任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111,该系数乘以2^n(n为生成多项式g(x)中x的最高次幂)以后再除以发送方和接收方事先约定好的生成多项式g(x)后,求得的余数P(x)就是CRC校验码,把它附到原始的报文A(x)后面形成新的报文即为A(x)*x^n+P(x),并且发送到接收端,接收端从整个报文中提取出报文B(x)(即为发送端的A(x),此时不能保证发送正确所以用B(x)表示),然后用与接收端同样的做法将B(x)对应的二进制序列乘以2^n(左移n位)后,除以事先约定好的g(x)得到一个余数p’(x),此时如果接收报文中的CRC校验码与计算得到的校验码相同,即P(x)=p’(x),则传输正确,否则传输有误,重新传输。

上述工作过程中有几点需要注意:

1.在进行CRC计算时,采用二进制(模2)运算法,即加法不进位,减法不借位,其本质就是两个操作数进行逻辑异或运算;

2.在进行CRC计算前先将发送报文所表示的多项式A(x)乘以x^n,其中n为生成多项式g(x)的最高幂值。对二进制乘法来讲,A(x)*x^n就是将A(x)左移n             位,用来存放余数p(x),所以实际发送的报文就变为A(x)*x^n+p(x):

3.生成多项式g(x)的首位和最后一位的系数必须为1,且生成多项式根据不同国家的标准有不同的形式。

CRC校验码检错的原理如下图

二、CRC生成步骤

  1. 代码与多项式对应

如:1011001  ——> A(x) = x^6 + x^4 + x^3 + 1 (系数对应)

  1. 确定生成多项式

生成多项式g(x)由发送方与接收方提前约定好。

常用有: CRC-16 : x^16 + x^15 + x^2 + 1

  1. CRC生成

P(x) = A(x) * x^n / g(x)   n : g(x)中x的最高次幂

  1. 发送:新的报文

A(x) * x^n + P(x)

  1. 接收:生成CRC与发送CRC比对

接收到的报文为B(x),按步骤3生成接收数据的CRC:p’(x),再与发送方的P(x)比较,若相等,则传输正确。

2.1举个栗子

报文 : 1011001 ,则A(x) = x^6 + x^4 + x^3 + 1

约定生成多项式 : g(x) = x^4 + x^3 + 1(系数为:11001)(n = 4,CRC为4位)

——>A(x) * x^n = x^10 + x^8 + x^7 + x^4(系数为:10110010000)

——>多项式除法:(模2除法)除数和被除数做异或运算(最高位对齐)。

——>多项式除法:

1

0

1

1

0

0

1

0

0

0

0

^

1

1

0

0

1

0

1

1

1

1

0

1

0

0

0

0

^

1

1

0

0

1

0

0

1

1

1

1

0

0

0

0

^

1

1

0

0

1

0

0

1

1

1

0

0

0

1

1

0

0

1

0

0

1

0

1

0

求得余数为: 1010 (CRC)

将CRC附到原报文后面即为新发送的报文:1011001_1010

下面我们将通过verilog代码实现,以及CRC计算器来验证。

三、Verilog实现

module   crc_test(input              clk,input               rst,input       [7:0]   data_in,output  reg[3:0]    crc_out,output  reg         crc_vld
);parameter             polynomial  =  5'b11001;
localparam              IDLE    =  3'b001,CRC     =  3'b010,DONE    =  3'b100;reg     [11:0]          temp = 0;
reg     [2:0]           state;
wire    [11:0]          signal_temp;assign  signal_temp =  {data_in,4'b0};always @ (posedge  clk or  posedge rst)beginif(rst)beginstate      <=  IDLE;crc_out        <=  4'b0;crc_vld       <=  1'b0;endelse case(state)IDLE:begincrc_out<=    4'b0;crc_vld<= 1'b0;temp  <=  signal_temp;state   <=  CRC;endCRC:beginstate   <=  CRC;crc_vld <=  1'b0;if(temp[11])  temp[11:7]  <=  temp[11:7]  ^ polynomial;else if(temp[10])temp[10:6]    <=  temp[10:6]  ^ polynomial; else if(temp[9])temp[9:5] <=  temp[9:5]   ^ polynomial; else if(temp[8])temp[8:4] <=  temp[8:4]   ^ polynomial;else if(temp[7])temp[7:3]  <=  temp[7:3]   ^ polynomial; else if(temp[6])temp[6:2] <=  temp[6:2]   ^ polynomial;else if(temp[5])temp[5:1]  <=  temp[5:1]   ^ polynomial; else if(temp[4])temp[4:0] <=  temp[4:0]   ^ polynomial;else state<=DONE;endDONE:begincrc_out  <=  temp[3:0];crc_vld   <=  1'b1;state <=  IDLE;enddefault : begincrc_out  <=  4'b0;crc_vld   <=  1'b1;state <=  IDLE;endendcase
end
endmodule

运行结果: 4’ha --->-4’b1010

四、参考资料

CRC校验码的verilog实现与仿真结果_stubben_bear的专栏-CSDN博客_crc16 verilog

4.1 CRC在线计算器

CRC(循环冗余校验)在线计算_ip33.com

报文 :  1011001  (0x59)

生成多项式 : g(x) = x^4 + x^3 + 1

CRC :  1010     ( 0xa)

CRC计算结果截图:

【Verilog】CRC校验码生成器原理及verilog实现相关推荐

  1. 来搞清楚CRC校验的原理和实现

    在MIPI_CSI-2协议里payload数据的校验使用了CRC校验,但是关于CRC校验只知其一,或者说只知的还不到其一,因此非常有必要搞清楚它,自然的我搜查了一些博主的文章尝试得到答案,最终在知乎前 ...

  2. CRC校验实现原理以及程序实现研究

    在学习mdobus过程中,曾遇到过CRC校验,之前一直不是很明白其原理,现在利用一点闲暇时间学习下. 不同别的校验方式,想弄明白CRC校验的原理以及程序实现过程还真得有点耐心,琢磨一下数学公式. 1. ...

  3. CRC校验码详解+Verilog实现(含代码)

    目录 CRC码简介 CRC校验码生成步骤 CRC码生成多项式 CRC校验码Verilog实现 CRC即循环冗余校验,是一种数字通信中的常用信道编码技术.其特征是信息段和校验字段的长度可以任意选定 CR ...

  4. CRC校验的原理及实现方法

    一.CRC校验介绍 循环冗余校验码(CRC),是一种常用的.具有检错.纠错能力的校验码,在早期的通信中运用广泛.循环冗余校验码常用于外存储器和计算机同步通信的数据校验.循环冗余校验是通过某种数学运算来 ...

  5. CRC校验码原理及自动生成源码

    CRC原理简介:https://mp.weixin.qq.com/s/RNHLZGPD9Ysbxb1FNDn6EA 自动生成源代码网址:https://www.easics.com/webtools/ ...

  6. 基于verilog的CRC校验(汇总)

    目录 原理 计算 检错与纠错 纠错实现 Verilog实现 本来想整理一下关于CRC校验的内容,但是发现前辈们写的都很好,本文对内容进行整理汇总. 原理 crc为什么能够检错和纠错,这背后有着深刻的数 ...

  7. CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析

    文章目录 前言 一.CRC校验码的计算 1.CRC模型 2.CRC计算 步骤1:输入数据与初始值模2加并左移 步骤2:被除数与多项式模2除 二.CRC校验码生成逻辑的C语言实现 1.实现代码 2.代码 ...

  8. CRC校验原理和推导过程及Verilog实现(一文讲透)

    目录 一.CRC简介 1.1 CRC可检测的错误 1.2 CRC需要知道的基本名称 1.2.1 多项式公式 1.2.2 多项式简记式 1.2.3 数据宽度 1.2.4 初始值与结果异或值 1.2.5 ...

  9. tcp中的crc检验算法原理_CRC校验原理及其实现

    原文作者:王超的独立博客 出处:http://www.wangchaochao.top/2020/09/20/Principle-and-implementation-of-CRC/ 前言 最近的工作 ...

最新文章

  1. 谷歌AI一次注释了10%的已知蛋白质序列,超过人类十年研究成果
  2. [转]MySQL实现分页查询
  3. 【NLP】一行Python代码中自动化文本处理
  4. centos 删除crontab_CentOS安装crontab及使用方法
  5. 蓝牙耳机测试软件apk_黑鲨蓝牙游戏耳机2解决延迟问题:比AirPods Pro更强
  6. JS图片放大查看效果!
  7. AI算法连载13:统计之数据预处理特征工程
  8. 干货!一文看Doris在作业帮实时数仓中的应用实践
  9. php上传下载excel,PHPExcel 上传下载的示例代码
  10. 解决Eclipse中文乱码的问题
  11. 阿里云-个人建网站从0到精通(三)-部署开发环境
  12. 波形发生器电路的设计(实现正弦波、方波和三角波的输出)
  13. 北理计算机专业如何,2019北理计算机学硕经验分享
  14. python画地图柱状图_Python 如何画出漂亮的地图?
  15. CMMI2.0是什么?
  16. 2022,itbird的年终总结报告
  17. 分布式存储技术及应用
  18. 解决ESP32 驱动 28BYJ-48 步进电机反向不转之震动的问题
  19. 【Shader】拷贝ShaderToy系列——蝴蝶
  20. 企业级Memcached服务应用实践

热门文章

  1. (74)Verilog实现CRC【MIPI】
  2. 使用summernote
  3. Linux磁盘分区命名方式及常用磁盘管理命令
  4. FPGA内部如果有无符号数转换
  5. 啊哈哈哈哈 C#按日期生成文件夹,并在文件夹中写入文件
  6. mysql优化手段——潭州学院
  7. [生存志] 第84节 列子淡泊号冲虚
  8. mysql查询日期:本周、上周、本月、上月
  9. BI和大数据的区别在哪里?
  10. [好久没有看到这么真切的文章了]在怀疑的时代依然需要信仰