FPGA校验(2):CRC校验

article/2025/7/9 4:22:03

CRC:输入序列对某个表达式求余数,或者认为一系列数据求异或的过程。

CRC校验

CRC原理

在这里插入图片描述
CRC实现非常简单,但想要真正掌握CRC算法原理,就必须清楚地了解有限域的运算规则,知道CRC就是有限域中的除法余数,并且清楚如何将串行CRC转换为并行CRC,此时才能设计出使用的CRC电路。

如果不想深究理论,可以简单掌握CRC的Verilog/VHDL在线生成工具的使用即可。
网址:

  1. CRC代码生成工具:https://www.easics.com/webtools/crctool
  2. CRC(循环冗余校验)在线计算:http://www.ip33.com/crc.html

实现

由上述CRC代码生成工具可以得到一份关于CRC的Verilog或者VHDL源码。
源码如下:

 module CRC16_D8;// polynomial: x^16 + x^12 + x^5 + 1// data width: 8// convention: the first serial bit is D[7]function [15:0] nextCRC16_D8;input [7:0] Data;input [15:0] crc;reg [7:0] d;reg [15:0] c;reg [15:0] newcrc;begind = Data;c = crc;newcrc[0]  = d[4] ^ d[0] ^ c[8] ^ c[12];newcrc[1]  = d[5] ^ d[1] ^ c[9] ^ c[13];newcrc[2]  = d[6] ^ d[2] ^ c[10] ^ c[14];newcrc[3]  = d[7] ^ d[3] ^ c[11] ^ c[15];newcrc[4]  = d[4] ^ c[12];newcrc[5]  = d[5] ^ d[4] ^ d[0] ^ c[8] ^ c[12] ^ c[13];newcrc[6]  = d[6] ^ d[5] ^ d[1] ^ c[9] ^ c[13] ^ c[14];newcrc[7]  = d[7] ^ d[6] ^ d[2] ^ c[10] ^ c[14] ^ c[15];newcrc[8]  = d[7] ^ d[3] ^ c[0] ^ c[11] ^ c[15];newcrc[9]  = d[4] ^ c[1] ^ c[12];newcrc[10] = d[5] ^ c[2] ^ c[13];newcrc[11] = d[6] ^ c[3] ^ c[14];newcrc[12] = d[7] ^ d[4] ^ d[0] ^ c[4] ^ c[8] ^ c[12] ^ c[15];newcrc[13] = d[5] ^ d[1] ^ c[5] ^ c[9] ^ c[13];newcrc[14] = d[6] ^ d[2] ^ c[6] ^ c[10] ^ c[14];newcrc[15] = d[7] ^ d[3] ^ c[7] ^ c[11] ^ c[15];nextCRC16_D8 = newcrc;endendfunction
endmodule

将上述代码重新封装如下,即可实现CRC校验功能。
RTL:

module CRC16D8(input           i_clk,input           i_rst_n,input [7:0]     i_handle_data,input           i_crc_init,input           i_crc_en,output [15:0]   o_crc_result
);reg [15:0] r_crc_result;always @(posedge i_clk or negedge i_rst_n)beginif(!i_rst_n)r_crc_result <= 16'hffff;else if(i_crc_init)r_crc_result <= 16'hffff;else if(i_crc_en)r_crc_result <= nextCRC16D8(i_handle_data,r_crc_result);elser_crc_result <= r_crc_result;endassign o_crc_result = r_crc_result ^ 16'hffff;function [15:0] nextCRC16D8;input [7:0] i_handle_data;input [15:0] i_crc_result;reg [7:0] d;reg [15:0] c;reg [15:0] r_new_crc;begind = i_handle_data;c = i_crc_result;r_new_crc[0]  = d[4] ^ d[0] ^ c[8] ^ c[12];r_new_crc[1]  = d[5] ^ d[1] ^ c[9] ^ c[13];r_new_crc[2]  = d[6] ^ d[2] ^ c[10] ^ c[14];r_new_crc[3]  = d[7] ^ d[3] ^ c[11] ^ c[15];r_new_crc[4]  = d[4] ^ c[12];r_new_crc[5]  = d[5] ^ d[4] ^ d[0] ^ c[8] ^ c[12] ^ c[13];r_new_crc[6]  = d[6] ^ d[5] ^ d[1] ^ c[9] ^ c[13] ^ c[14];r_new_crc[7]  = d[7] ^ d[6] ^ d[2] ^ c[10] ^ c[14] ^ c[15];r_new_crc[8]  = d[7] ^ d[3] ^ c[0] ^ c[11] ^ c[15];r_new_crc[9]  = d[4] ^ c[1] ^ c[12];r_new_crc[10] = d[5] ^ c[2] ^ c[13];r_new_crc[11] = d[6] ^ c[3] ^ c[14];r_new_crc[12] = d[7] ^ d[4] ^ d[0] ^ c[4] ^ c[8] ^ c[12] ^ c[15];r_new_crc[13] = d[5] ^ d[1] ^ c[5] ^ c[9] ^ c[13];r_new_crc[14] = d[6] ^ d[2] ^ c[6] ^ c[10] ^ c[14];r_new_crc[15] = d[7] ^ d[3] ^ c[7] ^ c[11] ^ c[15];nextCRC16D8 = r_new_crc;end
endfunction

TestBench:

`timescale 1ns / 1ps
`define clk_period 40// polynomial: x^16 + x^12 + x^5 + 1
module CRC16D8TB;reg i_clk;reg i_rst_n;reg [7:0] i_handle_data;reg i_crc_init;reg i_crc_en;wire [15:0] o_crc_result;CRC16D8 u_CRC16D8(.i_clk         ( i_clk         ),.i_rst_n       ( i_rst_n       ),.i_handle_data ( i_handle_data ),.i_crc_init    ( i_crc_init    ),.i_crc_en      ( i_crc_en      ),.o_crc_result  ( o_crc_result  )
);initial i_clk  = 1;always#(`clk_period / 2) i_clk = ~i_clk                        ;initial begini_rst_n = 1'b0;i_handle_data = 8'd0;i_crc_en = 1'b0;i_crc_init = 1'b0;#(`clk_period *5 + 1);i_rst_n = 1'b1;i_crc_init = 1'b1;#(`clk_period * 10);i_crc_init = 1'b0;#(`clk_period);CRCFrame;#(`clk_period *10);$stop;endtask CRCFrame;beginCRCByte(8'h7e);CRCByte(8'h19);CRCByte(8'h00);CRCByte(8'he3);CRCByte(8'hb3);CRCByte(8'h9e);CRCByte(8'h28);CRCByte(8'hd3);CRCByte(8'h07);CRCByte(8'h3e);CRCByte(8'hf0);end    endtasktask CRCByte;input [7:0] i_tx_data;begini_handle_data = i_tx_data;        i_crc_en = 1'b1;#(`clk_period );i_crc_en = 1'b0;# 500;endendtask

总结

上文,CRC校验模块,在实际的工程中,使用的很多。本文中参考CRC校验原理,注重版权,侵删。
本文长期更新,如果你有好的想法和建议,欢迎在本文底部留言。另外也欢迎其他Verilog语言学习者与我共同交流,有任何疑问可以到本博客“评论专区”提出,我必知无不言,言无不尽。
日期:2021-9-3;
网址:https://blog.csdn.net/ZipingPan/article/details/120081322.


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

相关文章

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

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

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