CRC校验原理和verilog实现方法(二)
1 前言
在 前面的博客 CRC校验原理和verilog实现方法(一) 中,介绍了CRC校验的原理和手动计算过程。本文说一下我在学习CRC校验FPGA实现的一点心得体会。
2 线性反馈移位寄存器
线性反馈移位寄存器简称LFSR,用于产生可重复的伪随机序列,也可用来实现CRC校验。LFSR主要由触发器(寄存器)、异或门以及反馈线路组成。
已知多项式
,其中gn~g0 是系数,g0取值为1,其他系数可以是0或1。该多项式用二进制表示为
,用LFSR表示为:

或者表示为:

第一种表示法为伽罗瓦LFSR,第二种表示法叫斐波那契LFSR。
可以看出,对于一个n次多项式,可以使用n-1个移位寄存器和最多n-2个异或门实现。LFSR可以实现模二除法。
3 模2除法与LFSR
把被除数的数据,从第一个寄存器的输入端接入,就可以实现模二运算。
对于一个n次多项式,可以使用n-1个移位寄存器,和最多n-1个异或门,实现模二运算。
假如被除数是2位的数据S[1:0]=01b,多项式是10011b。在CRC校验里面,习惯省略最高位的1,多项式用0011b表示。那么S除以0011b的模二运算数字电路结构为:

其中d1~d4是寄存器输入;q1~q4是寄存器输出。寄存器需要赋初值,一般赋全1或全0。
下面对模二运算的逻辑表达式进行推导。
首先MSB参与计算,此时:
d1=S[1]^q4;
d2= S[1]^q1^q4;
d3=q2;
d4=q3。
经过一次移位后:
q1=d1= S[1]^q4;
q2= d2= S[1]^q1^q4;
q3= d3=q2;
q4= d4=q3。
此时有:
d1=S[0]^q3;
d2= S[0]^ S[1]^q4^q3;
d3= S[1]^q1^q4;
d4= q2。
令c[3:0]={q4,q3,q2,q1},d[3:0]={d4,d3,d2,d1},那么d就是最终的运算结果表达式,如下
d[3]=c[1];
d[2]= S[1]^c[0]^c[3];
d[1]= S[0]^ S[1]^ c[3]^ c[2];
d[0]= S[0]^ c[2]。
令c的初值为0,则01b对0011b的模二除法的余数为0011。
与手动计算进行对比,结果一致。
上述的被除数S可以换成任意位宽,推导过程一样,当然S位宽越大,推导越复杂,最终的逻辑表达式也越复杂。
上面的逻辑表达式,用verilog异或逻辑门很容易实现。
4 CRC校验的verilog实现
知道如何用verilog实现模二除法,CRC校验的实现就很容易了。但是CRC校验模型一般会有一些特定要求,如输入输出翻转、CRC寄存器初始值等。下一篇博客继续分享。
参考链接:
1、 https://blog.csdn.net/qq_44113393/article/details/89852994
2、 https://www.cnblogs.com/weijianlong/p/11947741.html
CRC校验原理和verilog实现方法(二)的更多相关文章
- CRC校验原理和verilog实现方法(一)
1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性.网上有关这方面的博客和资料很多,本 ...
- CRC校验原理和verilog实现方法(三)
1 代码生成 verilog实现CRC校验,可以充分发挥FPGA的硬件特性,即并行运算的能力. 具体实现方式,可以参考我上一篇博客,关键是用线性反馈移位寄存器表示出多项式,另外注意校验数据高位在先.然 ...
- 流水线技术原理和Verilog HDL实现(转)
源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...
- 流水线技术原理和Verilog HDL实现
所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时 ...
- golang中浮点型底层存储原理和decimal使用方法
var price float32 = 39.29 float64和float32类似,只是用于表示各部分的位数不同而已,其中:sign=1位,exponent=11位,fraction=52位,也就 ...
- Verilog语言实现并行(循环冗余码)CRC校验
1 前言 (1) 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能, ...
- 用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错 ...
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
一.奇偶校验码 二.海明校验码 三.CRC校验码 计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...
- CRC校验的C语言实现
文章转自 循环冗余校验(CRC)算法入门引导 - Ivan 的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liyuanbhu/article/details/7 ...
随机推荐
- 音视频点播服务基础系列(Fmpeg常用命令)
前言 公司业务中有一些场景需要用到服务端音视频剪辑技术,最开始为了快速上线使用的是某公有云的商用解决方案,但由于费用太高所以我们团队经过一个星期的冲刺,给出了一个FFmpeg+Serverless的解 ...
- Golang修改操作系统时间
Golang修改操作系统时间 需求 程序有时需要和服务器对时,发现延迟过高修改本地时间,这段代码网上抄的,实测可用,windows环境需要以管理员身份启动命令提示符调试 实现Demo package ...
- 温故知新,使用ASP.NET Core创建Web API,永远第一次
ASP.NET Core简介 ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用. 使用ASP.NET Core,您可以: 生成Web应用和服务.物联 ...
- vue3,后台管理列表页面各组件之间的状态关系
技术栈 vite2 vue 3.0.5 vue-router 4.0.6 vue-data-state 0.1.1 element-plus 1.0.2-beta.39 前情回顾 表单控件 查询控件 ...
- intelliJ idea 自动修复eslint语法问题
在要修复代码的文件上或全选需要修复的代码,快捷键:ctrl+shift+a,调出Find Action面板.搜索fix eslint problems,点击此操作,自动修复完成.
- CRM系统什么时候需要使用
CRM客户关系管理系统,相信每个人都会有所了解.现如今随着企业的发展需求,CRM软件已经成为了企业管理的刚需.无论是何种行业和规模的企业,客户都是最重要的资源,提高客户满意度也是企业的首要任务.如果您 ...
- AcWing 105. 七夕祭
七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11 ...
- Jsp自定义标签,配置tld文件
Program:Jsp自定义标签,.tld文件的配置 1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 & ...
- 文末送书四本 | 这篇Java反射机制太经典!不看后悔!
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...
- 利用PE破解系统密码
1.利用pe制作工具制作pe启动盘或者ios镜像 2.制作好后,在虚拟机设置里面加载镜像 3. 3.开启时选择打开电源进入固件 4.开启后依次选择:Boot--->CD-ROM Drive并按F ...