【Verilog】CRC校验码生成器原理及verilog实现

article/2025/7/9 4:31:55

目录

一、CRC的基本原理

 二、CRC生成步骤

2.1举个栗子

三、Verilog实现

四、参考资料

4.1 CRC在线计算器


一、CRC的基本原理

CRC :Cyclic Redundancy Check循环冗余校验码

        将被处理的报文比特序列当做一个二进制多项式A(x)的系数,任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111,该系数乘以2^n(n为生成多项式g(x)中x的最高次幂)以后再除以发送方和接收方事先约定好的生成多项式g(x)后,求得的余数P(x)就是CRC校验码,把它附到原始的报文A(x)后面形成新的报文即为A(x)*x^n+P(x),并且发送到接收端,接收端从整个报文中提取出报文B(x)(即为发送端的A(x),此时不能保证发送正确所以用B(x)表示),然后用与接收端同样的做法将B(x)对应的二进制序列乘以2^n(左移n位)后,除以事先约定好的g(x)得到一个余数p’(x),此时如果接收报文中的CRC校验码与计算得到的校验码相同,即P(x)=p’(x),则传输正确,否则传输有误,重新传输。

上述工作过程中有几点需要注意:

       1.在进行CRC计算时,采用二进制(模2)运算法,即加法不进位,减法不借位,其本质就是两个操作数进行逻辑异或运算;

       2.在进行CRC计算前先将发送报文所表示的多项式A(x)乘以x^n,其中n为生成多项式g(x)的最高幂值。对二进制乘法来讲,A(x)*x^n就是将A(x)左移n             位,用来存放余数p(x),所以实际发送的报文就变为A(x)*x^n+p(x):

       3.生成多项式g(x)的首位和最后一位的系数必须为1,且生成多项式根据不同国家的标准有不同的形式。

CRC校验码检错的原理如下图

 二、CRC生成步骤

  1. 代码与多项式对应

如:1011001  ——> A(x) = x^6 + x^4 + x^3 + 1 (系数对应)

  1. 确定生成多项式

生成多项式g(x)由发送方与接收方提前约定好。

常用有: CRC-16 : x^16 + x^15 + x^2 + 1

  1. CRC生成

P(x) = A(x) * x^n / g(x)   n : g(x)中x的最高次幂

  1. 发送:新的报文

A(x) * x^n + P(x)

  1. 接收:生成CRC与发送CRC比对

接收到的报文为B(x),按步骤3生成接收数据的CRC:p’(x),再与发送方的P(x)比较,若相等,则传输正确。

2.1举个栗子

报文 : 1011001 ,则A(x) = x^6 + x^4 + x^3 + 1

约定生成多项式 : g(x) = x^4 + x^3 + 1(系数为:11001)(n = 4,CRC为4位)

——>A(x) * x^n = x^10 + x^8 + x^7 + x^4(系数为:10110010000)

——>多项式除法:(模2除法)除数和被除数做异或运算(最高位对齐)。

——>多项式除法:

1

0

1

1

0

0

1

0

0

0

0

^

1

1

0

0

1

0

1

1

1

1

0

1

0

0

0

0

^

1

1

0

0

1

0

0

1

1

1

1

0

0

0

0

^

1

1

0

0

1

0

0

1

1

1

0

0

0

1

1

0

0

1

0

0

1

0

1

0

求得余数为: 1010 (CRC)

将CRC附到原报文后面即为新发送的报文:1011001_1010

下面我们将通过verilog代码实现,以及CRC计算器来验证。

三、Verilog实现

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

运行结果: 4’ha --->-4’b1010

 

四、参考资料

CRC校验码的verilog实现与仿真结果_stubben_bear的专栏-CSDN博客_crc16 verilog

4.1 CRC在线计算器

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

报文 :  1011001  (0x59)

生成多项式 : g(x) = x^4 + x^3 + 1

CRC :  1010     ( 0xa)

CRC计算结果截图:

 


http://chatgpt.dhexx.cn/article/Df0lLBay.shtml

相关文章

CRC校验原理及其使用

目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 如何进行CRC校验 校验标准式是什么玩意&#xff1f; 常见的CRC校验 CRC校验计算过程 CRC校验代码参考 代码解读 生成CRC8校验表的代码 CRC检验网站 如何…

FPGA校验(2):CRC校验

CRC:输入序列对某个表达式求余数&#xff0c;或者认为一系列数据求异或的过程。 CRC校验 CRC原理 CRC实现非常简单&#xff0c;但想要真正掌握CRC算法原理&#xff0c;就必须清楚地了解有限域的运算规则&#xff0c;知道CRC就是有限域中的除法余数&#xff0c;并且清楚如何将串…

crc校验c语言程序,C语言:CRC校验

一、CRC码 CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。 二、XOR XOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。 三、用XOR代替算术运算上除法的两个例子。 1、10110010000/11001 第一次异或(相除),得到商为1,余数为1111,加入…

【Verilog】CRC 校验(二)用 Verilog 实现生成 CRC 校验码

目录 实验任务 CRC 生成 Verilog 实现 电路生成原理 模块设计图 CRC 生成时序图 具体代码实现 上板验证 实验任务 在上一篇介绍了 CRC 校验码的原理&#xff0c;如何计算 CRC 校验码&#xff0c;这篇介绍如何利用 Verilog 实现CRC 校验码的生成。 什么是 CRC 校验码&a…

CRC校验 - 基于FPGA的实现

CRC校验 - 基于FPGA的实现 0 背景 CRC即循环冗余校验&#xff1a;常用于数据通信领域中&#xff0c;通常由发送端添加校验码于单帧数据的尾部&#xff0c;并由接受方进行提取和校验该帧数据传输是否正确。 循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&am…

CRC校验的原理及实现方法

一、CRC校验介绍 循环冗余校验码&#xff08;CRC&#xff09;&#xff0c;是一种常用的、具有检错、纠错能力的校验码&#xff0c;在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。循环冗余校验是通过某种数学运算来建立数据位和校验位的约定…

C#编程,CRC校验原理

1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check&#xff0c; CRC)&#xff0c;是通信领域数据传输技术中常用的检错方法&#xff0c;用于保证数据传输的可靠性。网上有关这方面的博客和资料很多&#xff0c;本文尽量简洁的梳理一下它的原理。后面还会结合自己的实践经…

LabVIEW实现CRC校验

目录 1、内部控件计算CRC校验 2、公式节点计算CRC校验 CRC&#xff08;循环冗余校验&#xff09;&#xff0c;是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术&#xff0c;主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除…

CRC校验及C语言实现

摘自&#xff1a;CRC校验原理及其C语言实现 地址&#xff1a;https://blog.csdn.net/whik1194/article/details/108837493?spm1001.2014.3001.5502 目录 什么是校验算法CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结 什么是校验算法 最近的工作中&…

SwitchHosts

SwitchHosts 官网&#xff1a;https://oldj.github.io/SwitchHosts/ 客户端支持 WindowsLinuxMac 功能支持 快速切换Hosts在线 hosts 方案Chrome浏览器Hosts实时生效 v3.3.12后将被支持&#xff0c;可暂时下载 https://github.com/CloverNet/SwitchHosts

Host服务

这也是看网上的例子自己跟着配置做的一个小demo&#xff0c;这里记录一下。 一、创建一个空的控制台应用程序 二、安装所需dll  1.Quartz     Install-Package Quartz -Version 2.3.3  2.Owin    Install-Package Owin -Version 1.0.0&#xff08;这个暂时装上&…

Go get http 服务

阅读目录 package mainimport ("encoding/json""fmt""net/http" )type MirageIPResponse struct {Code string json:"code"MirageIP string json:"MirageIp" }func main() {// 定义处理函数handler : func(w http.Respo…

google host地址

2019独角兽企业重金招聘Python工程师标准>>> http://git.oschina.net/AlexKing/host 保持更新中。。。 亲测通过&#xff0c;如果无法使用可以联系我&#xff0c;再做更新调整。 转载于:https://my.oschina.net/u/260921/blog/506286

virtio,vhost 和vhost-user

virtio 在虚拟机中&#xff0c;可以通过qemu模拟e1000网卡&#xff0c;这样的经典网卡一般各种客户操作系统都会提供inbox驱动&#xff0c;所以从兼容性上来看&#xff0c;使用类似e1000的模拟网卡是非常一个不错的选择。 但是&#xff0c;e1000网卡上也包含了复杂的io端口&a…

GO的服务

1.go的安装 1.1 确认版本go version go version go1.20.4 darwin/amd64 可以看到是macos10.14版本。如果是m1 需要安装对应的版本 1.2 用vscode 进行编写go的简单例子 先进入vscode的界面&#xff0c;新建一个目录为godemo&#xff0c;里面就是go的例子的工作目录&#xff0…

Go Registry

实现微服务的服务注册中心&#xff0c;支持服务服务注册、接收心跳等。客户端实现基于注册中心的服务发现机制 微服务 微服务是一些协同工作的小而自治的服务 微服务主要分为六个部分组成 服务描述&#xff1a;类似服务的文档说明&#xff0c;简单但不可或缺。 比如&#xff1a…

Gogs私服搭建

1. Gogs介绍 官网地址&#xff1a;https://gogs.io 文档地址&#xff1a;https://gogs.io/docs Gogs&#xff0c;全称为Go Git Service&#xff0c;是一个基于 Go 语言开发的Git服务。它提供了一个类似于GitHub的界面和功能&#xff0c;允许您在自己的服务器上搭建私有的Git仓库…

vhost-user

1&#xff0c;virtqueue 图一 每个queue实际上是由tx/rx两个virtqueue组成的也就是说tx和rx的virtqueue是分开的&#xff0c;并没有共享。一个virtio net设备最多有多少个queue由后端vhost决定&#xff0c;但前端可以通过ethtool –L eth0 combined 16命令动态修改当前队列数&…

gohost -- go 开发的命令行hosts配置管理工具

前几天在微博上看到有人推荐了lazygit这个工具&#xff0c;让人眼前一亮&#xff0c;什么时候命令行也可以这么抢到了&#xff0c;?&#xff0c;调研了下&#xff0c;发现它使用了gocui&#xff0c;使用它可以做出来很多很炫的命令行工具。 现有的hosts工具里面也有switchosts…

Android studio占用C盘资源的解决方法

Android studio占用C盘资源的解决方法 Android Studio安装成功后会在系统盘用户目录下产生这几个文件夹 一、目录介绍 1、.android 是Android SDK生成的AVD&#xff08;Android Virtual Device Manager&#xff09;即模拟器存放路径 2、.AndroidStudio4.0&#xff08;这里我安…