基于FPGA 的CRC校验码生成器

今天给大侠带来基于FPGA的CRC校验码生成器,话不多说,上货。

1、概述

CRC即Cyclic Redundancy Check,循环冗余校验,是一种数字通信中的常用信道编码技术。其特征是信息段和校验字段的长度可以任意选定。

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),能写出对应的二进制即可) 常见的生成多项式如下:

5、关于模2除法

模2运算就是加法不考虑进位,减法不考虑借位。

1)加法运算:

0+0=0 0+1=1 1+0=1 1+1=0

例如0101+0011=0110,列竖式计算:

2)减法运算:

0-0=0 0-1=1 1-0=1 1-1=0

例如0110-0011=0101,列竖式计算:

3)乘法运算

0×0=0 0×1=0 1×0=0 1×1=1

多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。例如1011×101=100111,列竖式计算:

4)除法运算:

0÷1=0 1÷1=1

多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根 据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义的。

实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷1011=1110……110,列竖式计算:

掌握了上面的运算规则,你可以尝试计算一个复杂一点的,如下:

如果得到的余数结果正确,你掌握的东西就够用了。

6.CRC-CCITT的硬件实现

CRC-CCITT的生成多项式为:

对应的二进制数就是上面复杂运算中那个除数。由刚才的计算可知,对于8 bit的数据 0xaa,它的CRC校验码为0001 0100 1010 0000,下面用verilog来实现,看能否得到这个结果。

要实现这一过程,仍然需要LFSR电路,参看《FPGA产生基于LFSR的伪随机数》中关于该电路特性的介绍,如果您不需要了解原理,直接略过即可;有所改进的地方就是,可以将伪随机数发生器看作一个Moore型状态机,它的输出只与当前的状态有关;而此时利用LFSR电路,需要引入数据输入端,输出不仅取决于当前的状态,还取决于输入信号,相当于Mealy型状态机,如下图:

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

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

7.verilog描述

如果用时序电路串行实现,则8 bit数据要移位8次,就需要8个clk,效率低下,为了能在一个时钟周期输出结果,必须采用组合电路,当然,这是以空间换时间的方法,由于使用了for循环8次,直观的讲电路规模将扩大8倍。

仿真结果如下:得到的是数据0xaa和0xf0的CRC校验码,为验证结果的正确性,您可以按照模2法则手工计算一下^.^

8.4 bit信息位,5 bitCRC码的(9,4)码的程序和仿真结果

同样给出一个4 bit信息位,5 bitCRC码的(9,4)码的程序和仿真结果,程序的流程与上述流程完全一样:

后记:细心的读者可能发现,本文对LFSR电路能完成模2求余操作的原因避而不谈,不是因为不告诉你,是因为我也不是很清楚,工科背景对数学推理实在是有点不知所云,尤其是看到国内教材那好几页的公式的时候,如果您有深入浅出的讲解LFSR电路由来与应用的文章,注意是深入浅出的,请您大力推荐,在此感谢!

【QQ交流群】

群号:173560979,进群暗语:FPGA技术江湖粉丝。

多年的FPGA企业开发经验,各种通俗易懂的学习资料以及学习方法,浓厚的交流学习氛围,QQ群目前已有1000多名志同道合的小伙伴,无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有。

【微信交流群】

现微信交流群已建立08群,人数已达数千人,欢迎关注“FPGA技术江湖”微信公众号,可获取进群方式。

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

江湖偌大,继续闯荡,愿大侠一切安好,有缘再见!

基于FPGA 的CRC校验码生成器相关推荐

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

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

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

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

  3. 非常实用FPGA实现CRC校验介绍和代码生成工具

    目录 一.CRC原理. 二.CRC算法. 1.比特型算法. 2.字节型算法.(好理解也好用,实际中采用这种) 三.CRC参数模型 四.常用工具(重点来了) 1.CRC calculation  非常棒 ...

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

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

  5. 基于表格的CRC校验码实现

    关于CRC的理论计算方法不做赘述,本文介绍基于查表的CRC优化算法的实现. 常规计算方法是如何实现的? 理论方法不赘述,这里简单说明程序实现.因为要处理的信息可能非常长,所以直接使用除法指令是不可行的 ...

  6. 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 ...

  7. 【Verilog】CRC校验码生成器原理及verilog实现

    目录 一.CRC的基本原理 二.CRC生成步骤 2.1举个栗子 三.Verilog实现 四.参考资料 4.1 CRC在线计算器 一.CRC的基本原理 CRC :Cyclic Redundancy Ch ...

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

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

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

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

  10. CRC校验算法的数学原理(上)

    介绍   CRC是Cyclic Redundancy Check的缩写,用中文来讲,就是 循环冗余校验.是一种通过对数据产生固定位数校验码以备侦测数据错误的数据校验技术,主要用来侦测数据传输错误,也可 ...

最新文章

  1. 从另一个分支在Git中创建一个分支
  2. [No0000D2]ClearCSharp编程清理脚本批处理bat
  3. Cause: org.postgresql.util.PSQLException: ERROR: column province_id does not exist
  4. Java GUI 开发专题
  5. Java,AXIS,webService 调用 完整实例 xml 入参出参
  6. js中apply使用方法小议(转载)
  7. php访问mysql 封装
  8. 按周显示的日历和按月显示的日历,你需要吗
  9. love2d环境搭配
  10. 该来的没来,不该走的走了?
  11. 软件工程保研浙江大学、南京大学、同济大学、中山大学经验分享
  12. IC设计中时钟偏斜对延时的影响
  13. 震撼!世界从10亿光年到0.1飞米(ZT)
  14. 腾讯在线教育互动课堂——Demo调试过程记录
  15. 市场分析-全球与中国纳米复合太阳能电池市场现状及未来发展趋势
  16. 2018年北京中考试卷答案
  17. 微信小程序调用科大讯飞 在线合成语音接口(文字转语音)
  18. STL模型转点云数据
  19. 基于STM32F407的超声波定位装置(利用超声波测距原理)
  20. 为什么世上没有免费午餐

热门文章

  1. 使用Python写一个定时锁屏软件
  2. 智能手机或许非诺基亚最佳战场,功能手机才是出路?
  3. 计算机二级excel试题练习网盘,计算机二级练习试题excel
  4. 模拟电子技术的一点心得(转)
  5. dbc数据库 与 mysql_【图片】DBC2000安装及数据库详细解析(不断更行中......)【dbc2000吧】_百度贴吧...
  6. android 高音质 播放器,安卓音质最强音乐播放器—Rockbox
  7. SQL2008如何建立数据库
  8. 软件工程知识点总结(含各类软件工程各类图的画法)
  9. 猿创征文|程序猿乘风破浪 Python Pygame 原创小游戏【源码+解析】
  10. vue数据未加载完成前显示loading遮罩