目录

一、CRC原理。

二、CRC算法。

1、比特型算法。

2、字节型算法。(好理解也好用,实际中采用这种)

三、CRC参数模型

四、常用工具(重点来了)

1、CRC calculation  非常棒的在线CRC计算网站,可以设定初始值,可以配置位正反;(CRC calculation)

2、CRC Generator   非常不错的CRC FPGA代码生成网站 OutputLogic.com » CRC Generator


一、CRC原理。

 CRC校验的原理非常简单,如下图所示,通过下图大家可以通过手算即可求解出CRC校验结果。
其中,生成多项式是利用抽象代数的一些规则推导出来的,而模2加(也就是异或),是对应于有限域的除法。

二、CRC算法。

    通用的算法有比特型算法和字节型算法,我见到的FPGA实现方法多为后者字节型算法。

1、比特型算法。

这种算法,跟手算的差不多,一个时钟周期处理一个bit,速度慢,但消耗的面积小。

可能你会有疑问,本来是第15位(对应于x^15),再移位就是第16位,怎样把第16位转化成低于16位的数?

利用生成多项式就可以了,crc16 : 1+x^2+x^15+x^16,类似于小学数学的约分。
下图为关键的代码。

2、字节型算法。(好理解也好用,实际中采用这种)

  原理是把上面比特型的算法展开,一次性把8个bit的情况都列出来,化简,如下图所示,下图为关键的代码。
  字节型算法的使用方法跟比特型类似,只是一次处理8个bit,算出来的crc,也要留在寄存器里面(LSFR)。

三、CRC参数模型

网上可以下载到多种CRC计算器,右侧有详细的CRC参数模型标识,在使用时,不仅要选择对多项式的类型,也要关注右侧模型信息。
       Name:CRC名称。
       Width:CRC寄存器的位宽。
       Poly:生成多项式(这里用8进制表示)。
       Init:CRC寄存器初始值(图中为全0)。
       RefIn:True代表每个输入的字节都倒置(原本是bit0的,换成bit7;原本是bit1的,换成bit6)。False代表不倒置。
       RefOut:True代表在输出CRC结果之前,把CRC寄存器倒置。False代表不倒置。(注意是最后一次,before Final XOR,中间的还需要再反回去)
      下图为网站: CRC calculation)的举例说明
       XorOut:执行完RefOut之后,异或全0或者全1,(图中为异或全0)。
       搞懂CRC参数模型,才算是真正搞懂CRC,而不像书本上说的那么肤浅。
       其中有的CRC寄存器初始值设置为全1,如以太网的CRC32,目的就是为了能检测出数据前面的0的个数。1234算出来的CRC,跟01234算出来的,不一样,这就能应对前面带0的数据了。
       此外,CRC的生成多项式,也有可能倒置,所以必须以参数模型中Poly的值为准。

四、常用工具(重点来了)

以下是可以让大家事半功倍的好工具:主要有2个 CRC calculation  和 CRC Generator, 除了可以计算crc以外,有的还 可以自动生成c、verilog、vhdl代码

1、CRC calculation  非常棒的在线CRC计算网站,可以设定初始值,可以配置位正反;(CRC calculation

优点:可以利用这个在线工具计算任何形式的CRC,不像其他的crc计算器,只能计算特殊的集中。
详细介绍:
CRC oder:多项式阶数(支持1-64),图中选为8阶;
CRC polynom:CRC校验多项式,07代表x^8+x^2+x+1;
initial value: CRC寄存器初始值(图中为全FF);更有意思的计算方法:单步计算法,首先选中direct,然后初始值可以为上次计算的结果,用于单步调试非常棒;
Final XOR value: 执行完RefOut之后,异或全0或者全1,(图中为异或全0);
勾选reverse data bytes,代表 输出CRC结果之前,把CRC寄存器倒置;
勾选reverse crc result before fianal xor 注意是最后一次,before Final XOR,中间的还需要再反回去。
下图为配置完的截图,01 41 71 中间要用%隔开,计算完的结果为F8。
利用CRC计算器计算出的结果为:同样为F8。

2、CRC Generator   非常不错的CRC FPGA代码生成网站 OutputLogic.com » CRC Generator

下图为非常使用的FPGA代码生成工具,可以生成Verilog,也可以生成VHDL。
第一步:选择数据和多项式位数:
第二步:以X^8+X^5+X^4+1多项式为例:下图画圈的地方为关键代码。
首先,下图生成的CRC代码仅为固定CRC参数模型下的,我们需要根据自己的需求做修改,如何正常的改成自己想要的,非常关键。
通过分析,下图的模型参数具体如下:
CRC oder:多项式阶数为8阶;
CRC polynom:CRC校验多项式x^8+x^5+x^4+1;
initial value:CRC寄存器初始值为全FF;
Final XOR value:执行完RefOut之后,异或全0;
没有勾选reverse data bytes,代表CRC寄存器不倒置;
没有勾选reverse crc result before fianal xor;
第三步:实际中我需要下图的CRC参数模型:
1)输入数据取反:
d:=data_in(0)&data_in(1)&data_in(2)&data_in(3)&data_in(4)&data_in(5)&data_in(6)&data_in(7);  
2)输出数据取反:
r:= crc_out(0)&crc_out(1)&crc_out(2)&crc_out(3)&crc_out(4)&crc_out(5)&crc_out(6)&crc_out(7);
3)修改后的样式
        --x8+x5+x4+1
        crcout(0) :=  r(0) xor r(3) xor r(4) xor r(6) xor d(0) xor d(3) xor d(4) xor d(6);
        crcout(1) :=  r(1) xor r(4) xor r(5) xor r(7) xor d(1) xor d(4) xor d(5) xor d(7);
        crcout(2) :=  r(2) xor r(5) xor r(6) xor d(2) xor d(5) xor d(6);
        crcout(3) :=  r(3) xor r(6) xor r(7) xor d(3) xor d(6) xor d(7);
        crcout(4) :=  r(0) xor r(3) xor r(6) xor r(7) xor d(0) xor d(3) xor d(6) xor d(7);
        crcout(5) :=  r(0) xor r(1) xor r(3) xor r(6) xor r(7) xor d(0) xor d(1) xor d(3) xor d(6) xor d(7);
        crcout(6) :=  r(1) xor r(2) xor r(4) xor r(7) xor d(1) xor d(2) xor d(4) xor d(7);
        crcout(7) :=  r(2) xor r(3) xor r(5) xor d(2) xor d(3) xor d(5);
4)最后输出格式reverse crc result before fianal xor;
        crcout_invert :=crcout(0)&crcout(1)&crcout(2)&crcout(3)&crcout(4)&crcout(5)&crcout(6)&crcout(7);
        return crcout_invert;
以下为完整代码:

五、感谢

 内容参考:队长-Leader关于FPGA实现CRC校验的帖子,网址是:CRC校验_队长-Leader的博客-CSDN博客_crc校验一、CRC原理。       CRC校验的原理非常简单,如下图所示。其中,生成多项式是利用抽象代数的一些规则推导出来的,而模2加(也就是异或),是对应于有限域的除法。二、CRC算法。       那么在FPGA当中,也有好几种算法。1、比特型算法。       这种算法,跟手算的差不多,一个时钟周期处理一个bit,速度慢,但消耗的面积小。https://blog.csdn.net/k331922164/article/details/51648707

非常实用FPGA实现CRC校验介绍和代码生成工具相关推荐

  1. 【FPGA】CRC校验算法从数学原理到代码实现

    老规矩,转b站 [[FPGA]CRC校验算法从数学原理到代码实现-哔哩哔哩]

  2. 十六、基于FPGA的CRC校验设计实现

    1,CRC校验 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保 ...

  3. FPGA之CRC校验

    CRC校验原理 求解CRC-8的编码电路和CRC校验的原理 G(X) = X8+H7*X7+H6*X6+H5*X5+H4*X4+H3*X3+H2*X2+H1*X1+X0 生成多项式 G(X)=9'b1 ...

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

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

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

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

  6. 对于 CRC 校验的 学习笔记

    参考资料 CRC校验原理及实现 - 知乎 (zhihu.com) <-- 这个讲的特别好,我的博客主要是抄他的,最后加了一点代码库的分析. [CRC校验]手算与直观演示_哔哩哔哩_bilibil ...

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

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

  8. FPGA实现串口收发的八字节数据报文Modbus Crc校验

    一.项目工程背景 串口之间的数据交互,是一个在实际工作当中应用非常广泛的场景,所以笔者在这篇博客里为大家详细介绍"串口八字节报文modbus crc收发校验"的工程案例,相信耐心地 ...

  9. FPGA实现CAN通信CRC校验

    FPGA实现CAN通信CRC校验 检验本质上是CRC检验生成多项式 理解CRC校验,首先需要了解生成多项式的概念,生成多项式也就是发送方和接受方约定的一个除数而已,发送方和接收方都使用这一个相同的除数 ...

最新文章

  1. FastDFS扩展开发说明
  2. 网管日志-06.09.08
  3. 给定地址段为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为____到____
  4. php生成高清缩略图,PHP生成缩略图函数
  5. 经营升级渐成影院运营主课题,怎样才能交出技术改造好答卷?
  6. 一个非常适合IT团队的在线API文档、技术文档工具 (ShowDoc)
  7. [Avalon]如何实现自定义MarkupExtension.
  8. iMazing六大主要功能介绍
  9. Sql Server 导出数据库表结构的SQL查询语句
  10. 45:十进制到八进制
  11. 在eclipse中安装WindowsBuilder插件
  12. CH341ser(usb转串口)驱动
  13. USB Repair(usb设备修复工具)官方正式版V8.0.3.1069 | u盘修复软件下载 | u盘修复软件哪个最好?
  14. python实现语法分析器_Python源码分析5 – 语法分析器PyParser | 学步园
  15. 图形学基础|环境光遮蔽(Ambient Occlusion)
  16. matlab 曲线收敛,BP神经网络学习曲线收敛问题
  17. 怎样用c语言编程解多元方程组,求用C#编程实现:求一个多元一次方程组解
  18. 教你如何在家中自建服务器
  19. UNIPRO NL协议详解
  20. 对TS流的一些理解TS流的结构

热门文章

  1. S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
  2. 《电机学》第三篇 第10、11、12章 交流旋转电机的共同问题
  3. CF869C:C. The Intriguing Obsession(组合数)
  4. Linux 命令积累(当作笔记)
  5. CPU使用率的计算方法
  6. 2021年氧化工艺新版试题及氧化工艺复审考试
  7. 用python从gbff文件中提取cds序列
  8. jffs2的目录项查找过程
  9. HTML5新特性浅谈
  10. Ultraiso制作Centos7 优盘Udisk 启动镜像