CRC校验 - 基于FPGA的实现

article/2025/7/9 3:37:01

CRC校验 - 基于FPGA的实现

 

0  背景

       CRC即循环冗余校验:常用于数据通信领域中,通常由发送端添加校验码于单帧数据的尾部,并由接受方进行提取和校验该帧数据传输是否正确。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

1 FPGA硬件实现CRC校验

        CRC计算采用模2除法,本质是对应比特位的异或运算。计算原理我仔细推究,通常硬件实现方式分为2种:

        1- 串行计算,并输出CRC校验码。好处:顺序计算,便于理解和编程实现,且节省资源;  缺点:不如并行计算速率快;

        2- 并行计算,并输出CRC校验码。优缺点与串行计算相反;

2  FPGA实现CRC校验代码生成工具

        开源工具已有基于FPGA的CRC校验代码生成工具(轮子已造好)    链接地址:https://www.easics.com/crctool/

       CRC校验代码在线计算工具。    链接地址:https://www.easics.com/crctool/

3  举例:CRC-8  MAXIM    --- X^8 + X^5 + X^4 + 1

        该校验模型参数配置信息及FPGA代码实现如下:采用并行计算方式

`timescale 1ns/1ps//参数模型:CRC-8 MAXIM    --- X^8 + X^5 + X^4 + 1输入位宽:8bit初始值:0x00结果异或值:0x00CRC在线计算网址:http://www.ip33.com/crc.html***该参数模型:输入数据按高低位反转***该参数模型:输出数据按高低位反转//module crc8_test (input     wire              I_clk                 , //input     wire              I_reset               , //input     wire              i_din_valid           , //输入数据有效input     wire    [7:0]    i_din                 , //输入数据output    wire              o_dout_valid          , //输出CRC值有效output    wire    [7:0]    o_dout                  //输出CRC      );reg [7:0] r_dout;wire [7:0] d;wire [7:0] c;case1 
输入数据按位不反转
// assign d = i_din;default case 
输入数据按位反转 assign d = {i_din[0],i_din[1],i_din[2],i_din[3],i_din[4],i_din[5],i_din[6],i_din[7]}; assign c = r_dout;always @(posedge I_clk) beginif (I_reset) r_dout <= 8'h00; //初始值else if (i_din_valid) begin //计算逻辑r_dout[0] <= d[6] ^ d[4] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[4] ^ c[6];r_dout[1] <= d[7] ^ d[5] ^ d[4] ^ d[1] ^ c[1] ^ c[4] ^ c[5] ^ c[7];r_dout[2] <= d[6] ^ d[5] ^ d[2] ^ c[2] ^ c[5] ^ c[6];r_dout[3] <= d[7] ^ d[6] ^ d[3] ^ c[3] ^ c[6] ^ c[7];r_dout[4] <= d[7] ^ d[6] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[6] ^ c[7];r_dout[5] <= d[7] ^ d[6] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[6] ^ c[7];r_dout[6] <= d[7] ^ d[4] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[4] ^ c[7];r_dout[7] <= d[5] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[5];endend reg r_dout_valid = 0;always @(posedge I_clk) //输入数据在一个时钟内完成CRC计算,下一个时钟输出beginr_dout_valid <= i_din_valid;endassign o_dout_valid = r_dout_valid;default case 输出数据按位反转 assign o_dout = {r_dout[0],r_dout[1],r_dout[2],r_dout[3],r_dout[4],r_dout[5],r_dout[6],r_dout[7]};  // case1 
// 输出数据不按位反转
// assign o_dout = r_dout ;endmodule // end the crc8_test model;

4  仿真测试结果对比:CRC-8  MAXIM   

        输入数据为4字节:0x12  0x34  0x56  0x78

       CRC-8 MAXIM校验结果:0x98

        对比可知,FPGA仿真结果与CRC工具计算结果相等,测试通过。

 

 

 

 

 


http://chatgpt.dhexx.cn/article/3kplAIkl.shtml

相关文章

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;这里我安…

Minecraft神奇玩家不用键盘,行走全部靠骑猪最后通关MC

大家好&#xff0c;在Minecraft中有非常多的玩法&#xff0c;但是您听说过全程游戏不用键盘只用鼠标通关的玩法吗&#xff1f;也就是说在游戏中不能使用WSAD和空格按键通关&#xff01;这听起来简直就是天方夜谈了&#xff01; 在国外有位玩家叫做HeightAdvantage的玩家&#…

2021大树分享收集的网盘搜索站给兄弟们

聚合网盘搜索 https://www.chaonengso.com/ 某柠檬 https://www.moulem.com/ 史莱姆 http://www.slimego.cn/ 蓝菊花-城通网盘 http://www.lanjuhua.com google Drive搜索引擎 https://gezhong.vip/ 陈蛋蛋的宝藏库 http://www.chendandan.ys168.com/ xx资料网 https://www.xxu…

WPF窗体最小化到任务栏

WPF程序也可以很轻松的实现类似QQ那样最小化到任务栏的功能。 WindowState ws;WindowState wsl;NotifyIcon notifyIcon;

android ip格式化输入法,手机键盘还能这样玩?简单几步,让你的输入法萌动可人!...

玩手机&#xff0c;打字忙&#xff0c;输入法你用的是原厂、还是第三方&#xff1f;相信大多数网友跟我一样&#xff0c;换了新手机&#xff0c;会在第一时间安装自己习惯的第三方输入法。 相对而言&#xff0c;我更喜欢百度输入法&#xff0c;它的优势之一便是拥有种类丰富、脑…