文章目录

  • 1 产生原理
    • 1.1 CRC可检测的错误?
    • 1.2 CRC生成过程?
    • 1.3 接收过程?
  • 2 CRC 的计算
    • 2.1 手算
    • 2.1 在线计算器
  • 3 Verilog 实现
    • 3.1 线性反馈移位寄存器(LFSR)循环码编码
    • 3.2 Verilog代码

1 产生原理

循环冗余校验码Cyclic Redundancy Check(CRC)

简介:在发送端根据要传送的K位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在信息后面组成n=k+r位的码发出去。这种编码也叫(n,k)码。对于一个给定的(n,k)码,存在一个高次幂为r的多项式G(x),根据多项式G(x)可以生成k位信息的校验码,G(x)叫做这个CRC码的生成多项式, 生成多项式的最高位和最低位必是1。

1.1 CRC可检测的错误?

  • 突发长度小于n-k+1的突发错误;
  • 大部分突发长度等于n-k+1的突发错误,其中不可检出的占2-(n-k-1);
  • 大部分突发长度大于n-k+1的突发错误,其中不可检出的占2-(n-k);
  • 所有与许用码组 码距 小于dmin-1的错误及所有奇数个错误。

1.2 CRC生成过程?

生成过程:发送信息C(x)左移r位,表示为C(x)×2r,C(x)右边空出的r位就是校验码的位置。通过C(x)×2r模2除以生成多项式G(x)得到的余数就是校验码。

1.3 接收过程?

接收过程

  1. 计算CRC比较。
  2. 收到的二进制序列(信息码+循环码)除以多项式,如果余数为0,则说明传输过程无错误发生。

2 CRC 的计算

以输入数据0x5a,G(x)=x^8+x^2+x+1计算为例。

2.1 手算

首先了解模2运算:
模2加:0+0=0,0+1=1,1+1=0 -> a(模2加)b = a⊕b
模2减:0-0=0,0-1=1,1-0=1,1-1=0 -> a(模2减)b = a⊕b
模2乘:0×0=0,0×1=0,1×1=1
模2除:0/1=0,1/1=1

根据生成过程:C(x)×2^r模2除以生成多项式G(x)得到的余数就是校验码。
G(x)对应:0x107

运算过程减法为模2减,即异或运算。
设余数为R[8:0],注意的是,当 R[7] 为1,下一商位为1,当 R[7] 为0,下一商位为0。
其他规则与正常二进制除法一致。

可以看到每次运算的结果:

输入位 余数
0 0 0_0000_0000
1 1 0_0110_1111
0 0 0_0110_1111
1 1 0_1011_1011
1 1 0_0111_0001
0 0 0_0111_0001
1 1 0_1100_0011
0 1 0_1000_0001

最终的到的余数为:0x81,即我们需要的CRC码,0x5a编码之后为 0x5a|0x81。

2.1 在线计算器

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

网页就有各参数的介绍。
需要注意的是

  • POLY:生成项的简写,以16进制表示。忽略了最高位的"1"。
  • INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。手动计算过程初始值是0x00。

3 Verilog 实现

3.1 线性反馈移位寄存器(LFSR)循环码编码

以上的计算过程很多文章都有介绍,但是都没有介绍为什么是题目中的结构?
比如为什么 Verilog实现串行CRC-8,G(D)=D8+D2+D+1,电路结构如下?

其实这是线性反馈移位寄存器(LFSR)循环码编码。

引用《数字通信(第四版)John G.Proakis著.张力军译》8.1.3 循环码的内容:

对于CRC-8进行信源0x5a的校验,移位运算过程为:
信源数据的逐个输入等效于把0x5a(8’b01011010)移位后的 16’b0101_1010_0000_0000 拆分为:

  1. 16’b0000_0000_0000_0000 模2除 9’b1_0000_0111 = 商0…余 R1:0000_0000

                                 0________________________
    8’b1_0000_0111|16'b0000_0000_0000_0000/-   0000_0000_0 ____________=R1: 0000_0000_0
    

    这一步比较直观。所以在这我们就知道为什么在线计算器需要设置初始值?嘿嘿

  2. 16’b0100_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R1 = 商1…余 R2: 0000_0111

                                 01________________________
    8’b1_0000_0111|16'b0100_0000_0000_0000/-    100_0001_11   +R1: 0000_0000_0____________ =R2: 0000_0011_1

    这一步值得注意的是生成多项式为0的位可以想象有一个C_(i-1) ⊕ 0,只不过与结果为C_(i-1)省略了,因为加减都是等效于异或,以此实现加上上一步的余数减去因式。

  3. 16’b0000_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R2 = 商0…余 R3:0000_1110:

  4. 16’b0001_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R3 = 商1…余 R4:0001_1011:

  5. 16’b0000_1000_0000_0000 模2除 9’b1_0000_0111 ⊕ R4 = 商1…余 R5:1000_1100:

  6. 16’b0000_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R5 = 商0…余 R6:0110_0010:

  7. 16’b0000_0010_0000_0000 模2除 9’b1_0000_0111 ⊕ R6 = 商1…余 R7:1100_0001:

  8. 16’b0000_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R7 = 商1…余 R8:1000_0001:

输入 移位 移位寄存器值C7~C0
0 0000_0000
0 0 0000_0000
1 1 0000_0111
0 0 0000_1110
1 1 0001_1011
1 1 1000_1100
0 0 0110_0010
1 1 1100_0001
0 1 1000_0001

可以看到,这其实就是对应我们模2除运算的过程。

3.2 Verilog代码

OutputLogic可以在线生成CRC代码,我们在生成的基础上改就好了。

循环冗余校验码CRC原理与LFSR循环码编码器原理相关推荐

  1. 循环冗余校验码CRC,求解步骤

    循环冗余校验码CRC,是软考-计算机组成原理 中一种重要的编码. 下面只是简要描述求解CRC码的解题步骤,面向有一定理论基础的朋友. 直接看例题. 例.信息位: 10100110   生成多项式: 解 ...

  2. 第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 [计算机组成原理笔记]

    第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 本笔记参考书目: 计算机组成原理(第六版.立体化教材)白中英.戴志涛 2021王道计算机组成原理视频公开课 本节重点: 循环冗余校验码/ ...

  3. 计算机底层:循环冗余校验码CRC

    计算机底层:循环冗余校验码CRC 信息位+校验位组成循环冗余校验码,也称CRC码. 循环冗余校验码的思想:         通过将信息进行除以某个规定的数,这个数是提前约定好的,并且两边都知道的数. ...

  4. 循环冗余校验码CRC原理和实例

    今天同事问了一个CRC(循环冗余校验码)的问题,好奇心之下学习了一下. 首先说它的原理,百度百科上也有,我就简单说一下,它其实就是采用多项式编码的方法,对于要发送的信息码R,发送方和接收方约定好多项式 ...

  5. 计算机系统基础知识——循环冗余校验码(CRC)

    前言:循环冗余校验码(cyclie redundancy check)简称CRC(循环码),是一种能力相当强的检错.纠错码,并且实现编码和检码的电路比较简单,常用于串行传送(二进制位串沿一条信号线逐位 ...

  6. 计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索

    笔者在阅读华中科技大学谭志虎老师主编的<计算机组成原理(微课版)>教材进行复习时,产生了一个疑问,并针对性地进行了一些思考.欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗, ...

  7. java生成冗余校验码_对循环冗余校验码CRC的理解

    模2加法 1+1=0, 0+1=1, 1+0=1, 0+0=0 模2减法 1-1=0, 0-1=1, 1-0=1, 0-0=0 相当于二进制中的逻辑异或运算.也就是比较后两者对应位相同则结果为&quo ...

  8. 【校验码 - 循环冗余校验码CRC】

    水善利万物而不争,处众人之所恶,故几于道

  9. CRC冗余校验码源码代码c语言,循环冗余校验码(CRC)应用总结(包括C++源码)

    最近在实习期间需要用到数据的校验,所选为CRC16,那么就在此总结一番吧. 现在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用 ...

  10. 计算机组成原理学习笔记:循环冗余校验码

    循环冗余校验码 CRC 码 循环冗余校验码 (cyclic redundancy Check, CRC) 十进制除法 从熟悉的十进制出发,假设现在你要给另一个人传送882这样的一个10进制数据,为了防 ...

最新文章

  1. keras.utils.to_categorical用法
  2. 好系统U盘启动来说一说win10系统有必要更新到最新版本吗?
  3. python判断能否组成三角形_牛鹭学院:学员笔记|Python: 输入三条边,判断是否可以成为三角形...
  4. pythondocx文档重叠_使用PYTHON实现docx文档的读写
  5. 两个时间相差距离多少小时 (精确到秒)
  6. 安全专家在硬盘固件中发现NSA的网络间谍程序
  7. navicat for mysql 用户_Navicat for MySQL 怎么/怎么添加管理用户?Navicat for MySQL 添加管理用户教程_37游游网...
  8. 编码器的一点微小认识
  9. Android proguard-rules.pro 混淆模板
  10. Windows核心编程_重绘ListBox样式(仿QQListBox)
  11. WordPress采集插件-WordPress文章自动采集发布
  12. 云优CMS批量翻译插件
  13. [ZZ]美图秀秀怎么加水印
  14. 分享教程,制作Srt字幕最简单的方法
  15. kbhit()函数用法
  16. Java程序员的搞笑段子
  17. 动态内存分配(详解)
  18. 拼多多下单助手怎么一键采购、发货的?
  19. python编译环境 eclipse_Eclipse python 开发环境配置
  20. python pdf 转换成txt,csv,doc 及doc转换为pdf初级

热门文章

  1. Angular内置指令
  2. 设置360极速浏览器的模式默认为极速模式
  3. VMWARE虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。
  4. 手把手教你使用R语言做出一篇20分SCI文章的交互效应表(p for Interaction)
  5. Win10开机后电脑卡顿-F5刷新反应速度慢问题解决。(C盘清理)
  6. python 登录新浪微博_Python模拟新浪微博登录
  7. 【STMT】等价类划分法
  8. mysql stmt num rows_php – MySQLi stmt num_rows返回0
  9. R笔记3:ggplot绘制商务图表…
  10. 《2020职场绿茶图鉴》