crc校验原理及Verilog实现

一、CRC 校验基本原理

循环冗余校验CRC,Cyclic Redundancy Check)是一种用于检测数据传输和存储时错误的校验方法,通过多项式除法生成校验码。

值得注意的是,CRC只能用于检测错误,但是不能纠错。同样的还有SHA-256。

如果因为异常工作环境导致单个数据的某些bit出错,可以通过加入纠错码(例如汉明码、BCH、LDPC等)来纠错。

接下来简单说一下CRC校验的基本原理,可以简述为以下步骤:

数据表示与生成多项式:将待校验的数据视为一个二进制多项式(即,数据中的每个比特对应多项式的一个系数)。选取一个预先定义的生成多项式,通常记为G(x),用于进行校验。

附加校验位:在数据的尾部附加若干个零比特(通常附加的零的数量等于生成多项式的阶数),形成待校验的数据帧。

二进制除法:使用生成多项式对数据帧进行二进制除法(模2除法),得到一个余数。这个余数即为CRC校验码。

附加校验码:将计算得到的CRC校验码附加到原始数据后,形成传输的数据帧。

校验过程:在接收端,使用相同的生成多项式对接收到的数据帧(包含CRC校验码)进行二进制除法。如果余数为零,说明数据在传输过程中没有发生错误;如果余数不为零,说明数据存在错误。

二、二进制除法介绍

因为在实际实现的过程中涉及到了二进制除法(模2除法)所以这里再简单介绍一下。

除法的运算规则:在二进制除法中,所有计算均使用模2运算,也就是逐位的“异或”运算。这里就不介绍异或的运算规则了。

二进制除法的基本步骤如下:

  1. 初始化:将被除数(即需要进行CRC校验的数据帧)和除数(即生成多项式)对齐,准备进行运算。通常被除数会在其末尾添加若干个零比特,以便进行完整的校验计算。

  2. 移位比对:从被除数的高位开始,与生成多项式的高位对齐。如果当前被除数的最高位为1,则执行异或操作。

  3. 异或运算:当对齐后,判断当前位:

    如果当前被除数的最高位是1,就对生成多项式和被除数进行异或操作。

    如果当前位是0,则相当于对0进行异或运算,结果保持不变。(不懂的可以自己计算一下和0异或的结果,位数和生成多项式一致)

  4. 移位并继续除法:执行完一次异或运算后,将被除数的剩余部分向左移位,(直到出现1为止,因为如果高位是0的话那就是要和0异或,结果不变)并继续与生成多项式对齐,重复上述步骤直到所有比特位都处理完。

  5. 得到余数:最终剩下的数就是余数,这个余数就是我们要附加到原始数据上的CRC校验码。

具体的例子我们放在CRC实现的时候一起讲吧。

三、CRC校验实现具体例子

  • 假设我们要发送的数据是1101

  • 生成多项式是 x 3 + x + 1 x^3+x+1 x3+x+1,那么与多项式对应的二进制数是1011(因为多项式中的三次方项和一次项和常数项有系数,所以是第0、1、3位为1)

  • 用1101对多项式对应的二进制数1011进行模2除法得到的余数就是CRC校验码(在1101后面补上3个0,因为多项式中最高次项为3次)

CRC校验码的位数和生成多项式中的最高次项对应(这里多项式的最高次项为3,那么CRC校验码就应该是3位)

  • 计算过程如下:

1101000

1011

——————

0110000

01011

——————

0011100

0010110

——————

0001010

0001011

—————

0000001

  • 这里得到的余数是001,那么CRC校验码就是001

  • 将校验码加到要传输的数据后面,得到1101001,这就是传输时发送的数据

  • 接收方对接收的数据再对多项式进行模2除法,如果此时最终得到的余数为0,那么接收的数据就是正确的。反之,就是错误的。计算步骤如下:

1101001

1011

——————

0110001

01011

——————

0011101

001011

——————

0001011

0001011

——————

0000000

所以得到最终的余数为0,说明接收的数据是正确的


四、Verilog 代码示例

方法一:

module crc_calculator(input clk,input rst,input [7:0] data_in,output reg [3:0] crc_out,output reg crc_valid
);parameter POLYNOMIAL = 5'b11001; // 生成多项式 x^4 + x + 1
reg [11:0] temp_data;
reg [2:0] state;always @(posedge clk or posedge rst) beginif (rst) begincrc_out <= 4'b0;crc_valid <= 0;state <= 0;end else begincase (state)3'b000: begintemp_data <= {data_in, 4'b0}; // 数据扩展state <= 3'b001;end3'b001: beginif (temp_data[11]) temp_data[11:7] <= temp_data[11:7] ^ POLYNOMIAL; // 高位为1,进行异或temp_data <= temp_data << 1; // 左移if (temp_data[7:4] == 4'b0) state <= 3'b010; // 完成CRC计算end3'b010: begincrc_out <= temp_data[3:0]; // 输出CRC校验码crc_valid <= 1;state <= 3'b000; // 重新开始endendcaseend
endendmodule

方法二:

module	crc_test(input				clk,input				rst,input		[7:0]	data_in,output	reg[3:0]	crc_out,output	reg			crc_vld
);parameter				polynomial	=	5'b11001;
localparam				IDLE	=	3'b001,CRC		=	3'b010,DONE	=	3'b100;reg		[11:0]			temp = 0;
reg		[2:0]			state;
wire	[11:0]			signal_temp;assign	signal_temp	=	{data_in,4'b0};always @ (posedge	clk	or	posedge	rst)beginif(rst)beginstate		<=	IDLE;crc_out		<=	4'b0;crc_vld		<=	1'b0;endelse case(state)IDLE:begincrc_out<=	4'b0;crc_vld<=	1'b0;temp	<=	signal_temp;state	<=	CRC;endCRC:beginstate	<=	CRC;crc_vld	<=	1'b0;if(temp[11])	temp[11:7]	<=	temp[11:7]	^ polynomial;else if(temp[10])temp[10:6]	<=	temp[10:6]	^ polynomial; else if(temp[9])temp[9:5]	<=	temp[9:5] 	^ polynomial; else if(temp[8])temp[8:4]	<=	temp[8:4]	^ polynomial;else if(temp[7])temp[7:3]	<=	temp[7:3]   ^ polynomial; else if(temp[6])temp[6:2]	<=	temp[6:2]   ^ polynomial;else if(temp[5])temp[5:1]	<=	temp[5:1]   ^ polynomial; else if(temp[4])temp[4:0]	<=	temp[4:0]   ^ polynomial;else state<=DONE;endDONE:begincrc_out	<=	temp[3:0];crc_vld	<=	1'b1;state	<=	IDLE;enddefault : begincrc_out	<=	4'b0;crc_vld	<=	1'b1;state	<=	IDLE;endendcase
end 
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

丹摩 | 利用 CogVideoX 生成视频

声明&#xff1a;非广告&#xff0c;纯用户体验 1. CogVideoX CogVideoX 是智谱 AI 推出的一款极具创新性与突破性的视频生成产品。它在技术层面展现出诸多卓越特性&#xff0c;例如其采用的 Diffusion Transformer&#xff08;DiT&#xff09;架构奠定了强大的生成能力基础…

SAP开发语言ABAP常见面试问题及答案

一、基础概念问题 什么是SAP ABAP&#xff1f; SAP ABAP&#xff08;Advanced Business Application Programming&#xff09;是一种高级企业应用编程语言&#xff0c;用于开发SAP系统中的应用程序。它主要用于定制和扩展SAP的标准功能&#xff0c;以满足企业特定的业务需求。例…

C# 读取多条数据记录导出到 Word标签模板之图片输出改造

目录 应用需求 设计 范例运行环境 配置Office DCOM 实现代码 组件库引入 ​核心代码 调用示例 小结 应用需求 在我的文章《C# 读取多条数据记录导出到 Word 标签模板》里&#xff0c;讲述读取多条数据记录结合 WORD 标签模板输出文件的功能&#xff0c;原有输出图片的…

『 Linux 』网络层 - IP协议 (二)

文章目录 路由NAT技术分片与组装分片的组装IP协议分片的短板 路由 通常情况路由器具备了一个非常重要的功能,即构建子网; 同时路由器需要实现跨网络通信,说明路由器必须存在两个或以上的IP地址,通常在路由器中可以看到几个接口,分别是一个WAN口和几个LAN口; WAN口IP被称为公网I…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

javaEE初阶——多线程(1)

文章目录 一些背景知识操作系统&#xff08;OS&#xff09;&#xff08;计算机的大管家&#xff09;操作系统的基本概念&#xff1a;市面上常见的操作操作系统&#xff1a; 关于前端与后端的介绍&#xff1a;&#xff08;针对服务的体系架构&#xff09;计算机是如何工作的&…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial&#xff08;单独导入&#xff09;&#xff0c;或者直接安装 三、对应设置 其他的操作与之前的版本相同…

学习threejs,使用设置normalMap法向量贴图创建更加细致的凹凸和褶皱

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…

Python办公自动化案例:将演示文稿批量导出为图片和PDF文件

案例:将演示文稿批量导出为图片和PDF文件 准备资料:准备好PPT,并起好名称,放在同一目录下。 批量的将ppt,pptx转换为pdf和图片,代码如下: import comtypes.client import osdef init_powerpoint():powerp

数据结构 ——— 直接选择排序算法的实现

目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现&#xff08;默认升序&#xff09; 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…

linux从0到1——shell编程9

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…

前端:JavaScript (学习笔记)【2】

目录 一&#xff0c;数组的使用 1&#xff0c;数组的创建 [ ] 2&#xff0c;数组的元素和长度 3&#xff0c;数组的遍历方式 4&#xff0c;数组的常用方法 二&#xff0c;JavaScript中的对象 1&#xff0c;常用对象 &#xff08;1&#xff09;String和java中的Stri…

QML学习 —— 28、3种等待指示控件(附源码)

效果如下 说明 BusyIndicator应用于指示在加载内容或UI被阻止等待资源可用时的活动。BusyIndicator类似于一个不确定的ProgressBar。两者都可以用来指示背景活动。主要区别在于视觉效果,ProgressBar还可以显示具体的进度(当可以确定时)。由于视觉差异,繁忙指示器和不确定的…

Java 基于SpringBoot+Vue的家政服务管理平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

DataGear 5.2.0 发布,数据可视化分析平台

DataGear 企业版 1.3.0 已发布&#xff0c;欢迎体验&#xff01; http://datagear.tech/pro/ DataGear 5.2.0 发布&#xff0c;图表插件支持定义依赖库、严重 BUG 修复、功能改进、安全增强&#xff0c;具体更新内容如下&#xff1a; 重构&#xff1a;各模块管理功能访问路径…

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境&#xff08;multi-fidelity setting&#xff09;下&#xff0c;利用图神经网络&#xff08;GNNs&…

Flutter:SlideTransition位移动画,Interval动画延迟

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…

svn 崩溃、 cleanup失败 怎么办

在使用svn的过程中&#xff0c;可能出现整个svn崩溃&#xff0c; 例如cleanup 失败的情况&#xff0c;类似于 这时可以下载本贴资源文件并解压。 或者直接访问网站 SQLite Download Page 进行下载 解压后得到 sqlite3.exe 放到发生问题的svn根目录的.svn路径下 右键呼出pow…

GPT系列文章

GPT系列文章 GPT1 GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结&#xff1a;GPT 是一种半监督学习&#xff0c;采用两阶段任务模型&#xff0c;通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-t…