CRC冗余校验的原理和FPGA实现思路

news2025/7/18 2:22:02

CRC校验码,顾名思义是用于校验的。它可以用于检测数据传输过程中是否出现错误(某些位,或某几位,或者某块区域位错误),反正 可以知道数据出错了,但是不能纠错

CRC校验,本质上是模2除法求余。将发送信息M当做被除数,发送方和接收方共同约定一个除数G

(可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1)

,然后求余R,该余数R即为CRC值。
然而在 verilog实现的时候却并不会通过最原始的模2除法实现,而是用串行CRC电路来实现,这本质上也是一种模2除法。下面我将指出两种方法的一致性以便于记录和理解:

理论思路

        • 模2除法
        • 串行CRC电路
        • 总结

在描述CRC校验的流程之前,需要先描述一下模2除法

模2除法

模2除法可以说和二进制除法没什么关系,千万不要搞混了。它的计算其实也很简单,就是简单的移位和异或处理。

模2除法有三个准则:

  • 被除数的首位为1,则商的该位为1。被除数的首位为0,则商的该位为0。
  • 减法运算时需要模2减,即异或操作。
  • 当被除数的位数小于除数,计算结束。

为便于理解,我们举个例子。
假设原始数据M为 1101011011
多项式为 x 4 + x + 1 x^4 + x + 1 x4+x+1
可以得到除数G为 10011

首先在原始数据后面添加4个0(因为多项式是5位,添加5-1=4位)

在这里插入图片描述
上图为计算流程,图中很多次涉及到被除数的首位为0,则该商的该位为0的计算时,都略过了,只有最后一次没有略过,但是依然是便于理解的。
最终得到商为 1100001010
余数R为 1110
因为多项式是5位的,所以得到的校验位是5-1=4位的。余数R恰好为4位,无需在前面补0。因此哦我们得到校验位就是1110。
CRC模块的输出就是1101011011 1110

串行CRC电路

在FPGA中该如何实现CRC校验的工作呢?仔细观察上面的操作,可以发现,CRC校验码的计算,相当于是把多项式和原始数据左对齐,然后按位进行异或、再把多项式右移到新的1处,如此重复的操作,最终可以得到一个余数。
在电路里,右移和异或都是很基本的操作,只要了解该原理,我们就可以尝试复现该算法。

描述不清,我们直接看刚刚的例子
假设原始数据M为 1101011011
多项式为 x 4 + x + 1 x^4 + x + 1 x4+x+1
可以得到除数G为 10011
老样子,首先在原始数据后面添加4个0(因为多项式是5位,添加5-1=4位)。

  • 第一步
1 1 0 1 0 | 1 1 0 1 1 0 0 0 0   //原始数据串
1 0 0 1 1                       //多项式,左对齐,二者进行按位异或
-------------------------------
0 1 0 0 1                       //第一次异或结果
  • 第二步
0 | 1 0 0 1 1 | 1 0 1 1 0 0 0 0   //第一次异或结果和原始数据串中未操作的数合并得到新的数据串
    1 0 0 1 1 	                  //多项式右移到下一个1处,再次按位异或
-------------------------------
    0 0 0 0 0                     //第二次异或结果
  • 第三步
0 0 0 0 0 0 | 1 0 1 1 0 | 0 0 0   //第二次异或结果和原始数据串中未操作的数合并得到新的数据串
              1 0 0 1 1 	      //多项式右移到下一个1处,再次按位异或
-------------------------------
              0 0 1 0 1           //第三次异或结果
  • 第四步
0 0 0 0 0 0 0 0 | 1 0 1 0 0 | 0   //第三次异或结果和原始数据串中未操作的数合并得到新的数据串
                  1 0 0 1 1 	  //多项式右移到下一个1处,再次按位异或
-------------------------------
                  0 0 1 1 1       //第四次异或结果
  • 第五步
0 0 0 0 0 0 0 0 0 0 1 1 1 0   //第四次异或结果和原始数据串中未操作的数合并得到新的数据串
                  1 0 0 1 1   //多项式右移到到下一个1处,发现移不过去,于是结束
-------------------------------                           

得到最终结果之后,因为一开始在数据串后面添加了4个0,所以这里保留低4位,得到校验码1110,加在数据串后面得到1101011011 1110。

仔细看完这一步操作,细细思索就会发出疑问:多项式右移到下一个1处 这一关键的步骤是怎么实现的呢?

其实很简单,我们只需要记住:对于10011这个多项式来说,和数据做异或就是把数据的最高位(即第五位)和低两位(即第一第二位)做翻转。

当数据为0开头的时候,我们不想翻转。当数据为1的时候我们想要翻转。那我们就把输入数据的最高位也加入运算当中去即可(众所周知,在异或操作中,1代表翻转,0代表不翻转)

譬如当多项式右移到0开头的位置的时候

0 1 1 1 0   //某数据串
1 0 0 1 1   //多项式
-------------------------------
1 1 1 0 1                           

这个时候应该是跳过的,为了让数据恢复原样,我们就把结果的最高位和低两位与原始数据的最高位取反后的结果进行异或即可

1 1 1 0 1   //某数据串
1     1 1   //多项式
-------------------------------
0 1 1 1 0                          

而当多项式右移到1开头的位置的时候

1 1 1 1 0   //某数据串
1 0 0 1 1   //多项式
-------------------------------
0 1 1 0 1                           

这个时候应该是正确的,但是我们也同样可以把结果的最高位和低两位与数据的最高位进行异或

0 1 1 0 1   //某数据串
0     0 0   //多项式
-------------------------------
0 1 1 0 1                          

总结

比较模2除法和CRC串行电路两种方法,其实大同小异。但是如果不从电路的视角来理解,会觉得二者差异很大。个人比较偏向于CRC串行电路的理解方法,直观且便于实现。
解CRC就重复加CRC的步骤即可。

本文参考:

  1. B站视频
  2. 其他人的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VIIRS-NPP夜间灯光遥感数据下载和预处理

VIIRS-NPP夜间灯光遥感数据下载和预处理 月和年合成产品下载网站 日数据下载网站 一、下载shp掩膜文件 下载好月合成产品后,在这个网站上下载矢量地图, 点击复制按钮,来到这个网站,ctrl v粘贴 点击右上角Export,…

【阿旭机器学习实战】【31】股票价格预测案例--线性回归

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。 注:本文模型结果不好,仅做学习参考使用,提供思路。了解数据处理思路,训练模型和预测数值的过程。 目录1. 读取数据K线图绘…

解决一打开IE浏览器就自动跳转到Edge浏览器的问题

问题说明: 打开Internet Explorer浏览器后会自动跳转到Microsoft Edge浏览器。 解决方法: 打开控制面板,选择“Internet选项”,选择【高级】选项卡,取消勾选“启用第三方浏览器扩展*”即可。

Java之前缀和算法

一.前缀和 1.前缀和介绍 前缀和,顾名思义,就是前n项相加之和,和我们高中时候学习的数列中的一个含义 例如一个等差数组n,那他的前n项和 也可知道- 2.编程中的前缀和 对于一个数组nums,也可以很容易求出它的前缀和数组 public int[] prefix(int[] nums) {int[] prefix …

01 | TDengine3.0部署

1 TDengine简介 TDengine 是一款开源、高性能、云原生的时序数据库,且针对物联网、车联网、工业互联网、金融、IT 运维等场景进行了优化。TDengine 的代码,包括集群功能,都在 GNU AGPL v3.0 下开源。除核心的时序数据库功能外,TD…

因子的有效性检验(IC)

使用神经网络的预测值作为因子载荷(因子暴露,因子值 factor)时, 我们需要知道这个因子是否是有效的,所以要做因子的有效性检验。 当前的学术论文给出的IC, rankIC 这些都是属于判断因子是否有效的metric 因…

Linux系统安装Nginx常见报错问题

安装Nginx从nginx官网下载所需版本的nginx,http://nginx.org/下载之后,将安装包上传到linux系统指定路径解压文件,tar -zxvf nginx-1.22.1.tar.gz (此处用1.22.1版本为例)进入安装包目录,cd nginx-1.22.1执…

面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......

一、Linux系统应用和环境配置: 1、Linux系统的操作命令给我说10个,一般用什么工具远程连接Linux服务器? 2、Linux中的日志存储在哪里?怎么查看日志内容? 3、Linux中top和ps命令的区别? 4、Linux命令运行…

【极海APM32替代笔记】HAL库Flash读写操作及配置

【极海APM32替代笔记】HAL库Flash读写操作及配置 在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB 而实际上程序部分大小应该要看硬件手册来确定 可以通过配置keil工程中size的大小 来确…

改进YOLO系列 | YOLOv5/v7 更换骨干网络之 MobileNeXt

重新思考瓶颈结构以实现高效移动网络设计 倒置残差块成为了移动网络架构设计的主流。它通过引入学习倒置残差和使用线性瓶颈的两个设计规则,改变了经典的残差瓶颈。在本文中,我们重新思考了这种设计改变的必要性,并发现它可能会带来信息丢失和梯度混淆的风险。因此,我们提出…

kettle导入树形结构数据

kettle导入树形结构数据应用场景工作原理工作流程应用场景 获取数据的接口传入父节点的id,返回直属的子节点列表,通过广度优先遍历一棵树。 工作原理 使用数据库存放数据,利用作业进行循环遍历数据。 数据库存放节点数据,节点数…

运维工程师必知的十项Linux常识

1、GNU和GPL GNU计划(又称革奴计划),是由Richard Stallman(理查德斯托曼)在1983年9月27日公开发起的软件集体协作计划。它的目标是创建一套完全的操作系统。GNU也称为软件工程项目。GPL是GNU的通用公共许可证&#xf…

数据在内存中的存储【下篇】

文章目录⚙️3.浮点型在内存中的存储🔩3.1.一个例子🔩3.2.浮点数的存储规则🔩3.3.例题解析⚙️3.浮点型在内存中的存储 🔩3.1.一个例子 🔴浮点数存储的例子:👇 int main() {int n 9;float* …

用Python unittest搭建自动化测试框架

unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那你用unittest来应该是很轻松的,它们的工作方式都差不多。 unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixtu…

华为OD机试 - 人数最多的站点(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

【mybatis】

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文…

【Yolov5】深度模型进行训练-CPU版

yolo5模型训练1.yolov5自己的模型训练1.1 git下载对应的源码到服务器1.2 从最新的 YOLOv5版本自动下载模型。1.3 detect.py 推断1.4 train.py进行训练1.5 yolo的原理2.训练自己的模型2.1 Data下面新建如图目录Mydata2.1 lableimg进行数据标注的图形2.2 数据集2.3 train.py调整d…

IP 协议

1.IP协议报头如下图:版本号 代表的是当前的IP协议的版本,此处的版本一共有两个取值:v4和v6.本文着重针对v4版本进行解析.首部长度 代表的是整个IP报头的长度,这个报头长度是可变长的,可变长的原因在于报头中的选项,这个属性是一个可有可无的属性,会改变报头长度,它的单位是32bi…

5个原因告诉您为什么要拥有个人IP

在数字时代中,信息每分每秒都在飞速地增长,对于企业和个人来说,获得关注变得越来越具有挑战性。如果您希望在网上创造某种形式的存在感,保持内容的原创性和新鲜度是您通往成功的路上不可避免的挑战。尽管如此,从竞争对…

电商项目之Feign与Dubbo技术选型

文章目录1 问题背景2 前言3 思路4 Feign与Dubbo的区别5 总结6 真实案例1 问题背景 电商项目,B端以consul作为注册中心。重构了一个营销服务,以Nacos作为注册中心。B端需要调用营销服务。关于远程调用框架,营销服务用了Dubbo,而B端…