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

article/2025/7/9 2:38:27

目录

实验任务

CRC 生成 Verilog 实现

电路生成原理

模块设计图

CRC 生成时序图

具体代码实现

上板验证


 

实验任务

在上一篇介绍了 CRC 校验码的原理,如何计算 CRC 校验码,这篇介绍如何利用 Verilog 实现CRC 校验码的生成。

什么是 CRC 校验码?

CRC 生成 Verilog 实现

CRC 校验分为发送方和接收方,根据项目的要求,对串口输入的数据由 UART_RX 模块生成的并行数据,通过以Verilog计算这个并行数据的 CRC 校验码,并以并行的形式输出。由于是 UART 协议的数据,所以数据的位宽为8位,CRC 的位宽也为8位,因此多项式的最高次幂也为8。

电路生成原理

本次使用的多项式为 x^8 + x^2 + x^1 + 1,对应的二进制数为 100000111 根据多项式得到的电路图如下图所示,数据从最右端输入,多项式中的含有幂的项,会经过一个异或运算,其他的项则不用改变。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_17,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

模块设计图

模块的设计示意图如下图所示,对于输入由四路信号组成,分别是时钟信号、复位信号、输入数据信号、输入数据同步的脉冲信号;对于输出由两个信号组成,计算得到的 CRC 校验码以及 CRC校验码同步的脉冲信号。

84c2f2baf8624924949d8705e58893d7.png

CRC 生成时序图

以下是 CRC 生成的时序图,图中每个信号之间的关系都描述的很清楚。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

具体代码实现

以下是 CRC 生成的代码,需要说明的是:其中例化的 UART_RX 模块是自己写的一个 UART 接收模块,它的作用是将串口接收到的串行数据转换成并行数据输出以及输出相应的同步脉冲信号,作为 CRC 生成模块的输入信号。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Linest-5
// Create Date: 2022/04/22
// Design Name: 
// Module Name: CRC_GEN
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 对串口接收到的8位并行数据生成出8位的CRC校验码输出
// Dependencies: 
// Revision:
// Additional Comments:
//                      1 polynomial: x^8 + x^2 + x^1 + 1
//                      2 data width: 8
//                      3 高位在左,低位在右
//                      4 CRC初始值:全1
//                      5 CRC并行输出
//module CRC_GEN #(parameter   BAUD_RATE = 'd9600,                 //波特率parameter   CLK_FREQ  = 'd50000000,             //时钟周期parameter   BAUD_CNT_MAX = CLK_FREQ/BAUD_RATE)(input            clk, input            rst_n,       input            rx,                            //输入的串行数据       output wire      dir                            //输出控制RS485的方向
);              wire    [7:0]    po_data;                       //UART_RX模块输出的并行数据wire             po_flag;                       //UART_RX模块输出的并行数据同步信号reg              feedback;                      //通过判定输入数据的值给后面的位以反馈reg              crc_flag;                      //crc开始计算标志信号reg     [7:0]    crc_reg;                       //CRC计算过程寄存reg     [7:0]    crc_tran;                      //输出计算得到的crcreg              crc_sync;                      //过渡crc数据的同步信号reg     [7:0]    crc_out;                       //实际输出的crcreg              crc_valid;                     //crc输出有效标志信号,和输出的并行crc数据同步assign dir = 0;                                 //使能max3485输入//对po_flag打一拍生成crc_flagalways @(posedge clk or negedge rst_n) beginif (rst_n == 'd0) begincrc_flag <= 'd0;endelse begincrc_flag <= po_flag;endend//对crc_flag打一拍生成crc_syncalways @(posedge clk or negedge rst_n) beginif (rst_n == 'd0) begincrc_sync <= 'd0;endelse begincrc_sync <= crc_flag;endend//输出CRCalways @(posedge clk or negedge rst_n) beginif(rst_n == 'd0) crc_tran <= 'd0;                        //crc寄存器初始值else if(crc_flag == 'd0)                    //crc输出延时一个周期让crc恢复到初始值crc_tran <= 'd0;                        else if(crc_flag == 'd1) begin      crc_tran <= crc_reg;                    //在crc_flag为高的时候将计算得到的crc输出endend//计算CRC过程integer i;always @( po_data or crc_tran) begincrc_reg = crc_tran;for(i=7; i>=0; i=i-1)beginfeedback     =   crc_reg[7] ^ po_data[i];crc_reg[7]   =   crc_reg[6];crc_reg[6]   =   crc_reg[5];crc_reg[5]   =   crc_reg[4];crc_reg[4]   =   crc_reg[3];crc_reg[3]   =   crc_reg[2];crc_reg[2]   =   crc_reg[1] ^ feedback;crc_reg[1]   =   crc_reg[0] ^ feedback;crc_reg[0]   =   feedback;endend//寄存crc值输出always @(posedge clk or negedge rst_n) beginif (rst_n == 'd0) begincrc_out <= 'd0;endelse if (crc_sync == 'd1) begincrc_out <= crc_tran;endelse begincrc_out <= crc_out;endend//对crc_sync打一拍得到crc数据有效信号always @(posedge clk or negedge rst_n) beginif (rst_n == 'd0) begincrc_valid <= 'd0;endelse begincrc_valid <= crc_sync;endendUART_RX #(.BAUD_RATE(BAUD_RATE),.CLK_FREQ(CLK_FREQ),.BAUD_CNT_MAX(BAUD_CNT_MAX)) inst_UART_RX (.clk     (clk),.rst_n   (rst_n),.rx      (rx),.po_data (po_data),.po_flag (po_flag));ila_0 CRC_GEN (.clk(clk),          // input wire clk.probe0(po_data),   // input wire [7:0]  probe0  .probe1(po_flag),   // input wire [0:0]  probe1 .probe2(crc_flag),  // input wire [0:0]  probe2 .probe3(crc_reg),   // input wire [7:0]  probe3 .probe4(crc_tran),  // input wire [7:0]  probe4 .probe5(crc_sync),  // input wire [0:0]  probe5 .probe6(crc_out),   // input wire [7:0]  probe6 .probe7(crc_valid)  // input wire [0:0]  probe7);endmodule

上板验证

将相应的模块添加到文件中,板子上电即可验证。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_14,color_FFFFFF,t_70,g_se,x_16

将除法信号设置为 crc_valid,即输出 CRC 数据的同步信号,触发类型设置为下降沿,在串口中输入 66(16进制),就可以看到输出的 CRC 校验码为 00110101。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

利用 CRC(循环冗余校验)在线计算验证是否结果正确。

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

验证结果正确!

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 


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

相关文章

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的玩家&#…

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;