循环冗余校验码CRC原理与LFSR循环码编码器原理
文章目录
- 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 接收过程?
接收过程:
- 计算CRC比较。
- 收到的二进制序列(信息码+循环码)除以多项式,如果余数为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 拆分为:
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
这一步比较直观。所以在这我们就知道为什么在线计算器需要设置初始值?嘿嘿
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)省略了,因为加减都是等效于异或,以此实现加上上一步的余数减去因式。
16’b0000_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R2 = 商0…余 R3:0000_1110:
16’b0001_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R3 = 商1…余 R4:0001_1011:
16’b0000_1000_0000_0000 模2除 9’b1_0000_0111 ⊕ R4 = 商1…余 R5:1000_1100:
16’b0000_0000_0000_0000 模2除 9’b1_0000_0111 ⊕ R5 = 商0…余 R6:0110_0010:
16’b0000_0010_0000_0000 模2除 9’b1_0000_0111 ⊕ R6 = 商1…余 R7:1100_0001:
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循环码编码器原理相关推荐
- 循环冗余校验码CRC,求解步骤
循环冗余校验码CRC,是软考-计算机组成原理 中一种重要的编码. 下面只是简要描述求解CRC码的解题步骤,面向有一定理论基础的朋友. 直接看例题. 例.信息位: 10100110 生成多项式: 解 ...
- 第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 [计算机组成原理笔记]
第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 本笔记参考书目: 计算机组成原理(第六版.立体化教材)白中英.戴志涛 2021王道计算机组成原理视频公开课 本节重点: 循环冗余校验码/ ...
- 计算机底层:循环冗余校验码CRC
计算机底层:循环冗余校验码CRC 信息位+校验位组成循环冗余校验码,也称CRC码. 循环冗余校验码的思想: 通过将信息进行除以某个规定的数,这个数是提前约定好的,并且两边都知道的数. ...
- 循环冗余校验码CRC原理和实例
今天同事问了一个CRC(循环冗余校验码)的问题,好奇心之下学习了一下. 首先说它的原理,百度百科上也有,我就简单说一下,它其实就是采用多项式编码的方法,对于要发送的信息码R,发送方和接收方约定好多项式 ...
- 计算机系统基础知识——循环冗余校验码(CRC)
前言:循环冗余校验码(cyclie redundancy check)简称CRC(循环码),是一种能力相当强的检错.纠错码,并且实现编码和检码的电路比较简单,常用于串行传送(二进制位串沿一条信号线逐位 ...
- 计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索
笔者在阅读华中科技大学谭志虎老师主编的<计算机组成原理(微课版)>教材进行复习时,产生了一个疑问,并针对性地进行了一些思考.欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗, ...
- 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 ...
- 【校验码 - 循环冗余校验码CRC】
水善利万物而不争,处众人之所恶,故几于道
- CRC冗余校验码源码代码c语言,循环冗余校验码(CRC)应用总结(包括C++源码)
最近在实习期间需要用到数据的校验,所选为CRC16,那么就在此总结一番吧. 现在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用 ...
- 计算机组成原理学习笔记:循环冗余校验码
循环冗余校验码 CRC 码 循环冗余校验码 (cyclic redundancy Check, CRC) 十进制除法 从熟悉的十进制出发,假设现在你要给另一个人传送882这样的一个10进制数据,为了防 ...
最新文章
- keras.utils.to_categorical用法
- 好系统U盘启动来说一说win10系统有必要更新到最新版本吗?
- python判断能否组成三角形_牛鹭学院:学员笔记|Python: 输入三条边,判断是否可以成为三角形...
- pythondocx文档重叠_使用PYTHON实现docx文档的读写
- 两个时间相差距离多少小时 (精确到秒)
- 安全专家在硬盘固件中发现NSA的网络间谍程序
- navicat for mysql 用户_Navicat for MySQL 怎么/怎么添加管理用户?Navicat for MySQL 添加管理用户教程_37游游网...
- 编码器的一点微小认识
- Android proguard-rules.pro 混淆模板
- Windows核心编程_重绘ListBox样式(仿QQListBox)
- WordPress采集插件-WordPress文章自动采集发布
- 云优CMS批量翻译插件
- [ZZ]美图秀秀怎么加水印
- 分享教程,制作Srt字幕最简单的方法
- kbhit()函数用法
- Java程序员的搞笑段子
- 动态内存分配(详解)
- 拼多多下单助手怎么一键采购、发货的?
- python编译环境 eclipse_Eclipse python 开发环境配置
- python pdf 转换成txt,csv,doc 及doc转换为pdf初级
热门文章
- Angular内置指令
- 设置360极速浏览器的模式默认为极速模式
- VMWARE虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。
- 手把手教你使用R语言做出一篇20分SCI文章的交互效应表(p for Interaction)
- Win10开机后电脑卡顿-F5刷新反应速度慢问题解决。(C盘清理)
- python 登录新浪微博_Python模拟新浪微博登录
- 【STMT】等价类划分法
- mysql stmt num rows_php – MySQLi stmt num_rows返回0
- R笔记3:ggplot绘制商务图表…
- 《2020职场绿茶图鉴》