FPGA verilog设计的MODBUS CRC算法

这篇具有很好参考价值的文章主要介绍了FPGA verilog设计的MODBUS CRC算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

已经测试通过。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 20:14:12 05/18/2023
// Design Name:
// Module Name: Modbus_CRC
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module Modbus_CRC(
input clk,
input rst,
input d_valid,
input [7:0] data_in,
output reg[15:0] crc_out,
output reg crc_vld
);
/*
(1).预置 16 位寄存器为十六进制 FFFF(即全为 1) ,称此寄存器为 CRC 寄存器;
(2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄存器;
(3).检测相异或后的CRC寄存器的最低位,若最低位为1:CRC寄存器先右移1位,再与多项式A001H进行异或;若为0,则CRC寄存器右移1位,无需与多项式进行异或。
(4).重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理;
(5).重复步骤 2 到步骤4,进行下一个 8 位数据的处理;
(6).最后得到的 CRC 寄存器即为 CRC 码

 */

parameter polynomial = 16’hA001;// 8005的二进制反转后结果 X^16 + X^15 + X^2 + 0多项式。2023-5-21 09:23:02
localparam IDLE = 3’b001;
localparam CRC = 3’b010;
localparam DONE = 3’b100;

reg [2:0] state;
reg [3:0] shift_count;

//assign signal_temp = {data_in,17’b0};
/*
unsigned int CRC16(unsigned char buf,unsigned char length)//CRC16计算
{
unsigned char i;
unsigned int crc=0xFFFF;
while(length–)
for(crc^=
(buf++),i=0;i<8;i++)
crc=(crc&0x0001)?(crc>>1)^0xA001:crc>>1;
return crc;
}

*/
always @ (posedge clk or posedge rst)begin
if(rst == 1’b0)
begin
state <= IDLE;
crc_out <= 16’hFFFF;
crc_vld <= 1’b0;
shift_count <= 4’d0;
end
else case(state)
IDLE:begin

		crc_vld     <=	1'b0;
		shift_count <= 4'd0;			
		if(d_valid == 1'b1)
			begin				 
			 state	   <=	CRC;
		    crc_out	<=	crc_out^{8'b0,data_in};				 
			end
		else
		   begin
		    state	 <=	state; 			    
			 crc_out <=	16'hFFFF;
			end
		end
	CRC:begin
		
		crc_vld	<=	1'b0;
     if(shift_count<4'd8)
		   begin
			      state	<=	CRC;
			      shift_count <= shift_count +1'b1;
              //(3).检测相异或后的CRC寄存器的最低位,若最低位为1:CRC寄存器先右移1位,再与多项式A001H进行异或;
					//若为0,则CRC寄存器右移1位,无需与多项式进行异或。						
					if(crc_out[0] == 1'b1)
						begin                        
                  crc_out <=  {1'b0,crc_out[15:1]}^polynomial;              
						end
					else
						begin
						 crc_out <= {1'b0,crc_out[15:1]}; 
						end	
			end
		else
        begin
            shift_count <= 4'd0;
            crc_out <= crc_out;					 
            state	<=	DONE;
        end				
		
	  
		end
	DONE:begin
		crc_out	<=	crc_out;
		crc_vld	<=	1'b1;
		state	<=	IDLE;
		shift_count <= 4'd0;
		end
	default : begin
		crc_out	<=	16'hFFFF;
		crc_vld	<=	1'b0;
		state	<=	IDLE;
		shift_count <= 4'd0;
		end
	endcase

end

endmodule文章来源地址https://www.toymoban.com/news/detail-461624.html

到了这里,关于FPGA verilog设计的MODBUS CRC算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c# modbus CRC计算器(查表法)

    一、简介: 本案例为crc计算器,通过查表法计算出结果 1.窗体后台源代码 2.crc通用类(封装好的) 3.运行结果  

    2024年02月11日
    浏览(31)
  • 16位CRC校验码计算,485MODBUS计算

    CRC计算方法是: 1、 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。 2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。 3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。

    2024年02月11日
    浏览(39)
  • CRC16/ModBus校验与C语言实现方法

    目录 一、什么是CRC16/Modbus校验 二、CRC16/Modbus校验的计算步骤 三、CRC16/Modbus校验的C语言实现         CRC16/Modbus校验在设备通信时可以验证数据帧的完整性,从而避免错误数据。其应用十分广泛,主要应用于Modbus通信协议等,类似的校验方法还有许多,例如和校验,本文主

    2024年02月07日
    浏览(40)
  • 通过Python连接 modbus tcp 和台达PLC通信测试记录

    安装台达梯形图软件 “WPLSoft” http://downloadcenter.delta-china.com.cn/DownloadCenter?v=1q=WPLsort_expr=cdatesort_dir=DESC 2.硬件连接 2.1 电脑网卡 连接PLC以太网, IP设为192.168.1.x网段,PLC默认IP为192.168.1.5. 2.2 PLC 供电24V, S/S输入公共端接GND,UP0/ZP0输出驱动电源的端口接GND / 24V 2.3 在 PLC X0输入触

    2024年01月23日
    浏览(52)
  • MODBUS模型下CRC-16校验C/C++程序实现

    看了很多相关博客,例如http://t.csdn.cn/Ek3RV 又例如http://t.csdn.cn/HGUmo 这些文章所提供的代码似乎都是没有错误的,但很多文章的文字描述和代码并不对应。因此我也整理了一下,也当做是给自己做个笔记。 CRC校验按位计算的程序很好理解,写起来也比较简单,就是把模二除法

    2024年02月16日
    浏览(48)
  • 【FPGA】Verilog设计入门——时序模块及其Verilog表述

    目录 1.边沿触发型触发器及其Verilog表述 2.电平触发型锁存器及其Verilog表述  3.含异步复位/时钟使能型触发器及其Verilog表述 4.同步复位型触发器及其Verilog表述  5.异步复位型锁存器及其Verilog表述 6.Verilog的时钟过程表述的特点和规律   7.异步时序模块的Verilog表述  8.4位二进制

    2024年02月07日
    浏览(39)
  • FPGA设计Verilog基础之Verilog的运算符

    注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料 ,将在公众号 CTO Plus 发布,请关注公众号: CTO Plus FPGA设计Verilog基础之Verilog的运算符 Verilog是一种硬件描述语言,支持多种运算符,包括算术运算符、比较(关系)运算符、逻辑运算符、条件

    2024年02月03日
    浏览(48)
  • 基于FPGA的16QAM调制器verilog实现,包括testbench,并通过MATLAB显示FPGA输出信号的星座图

    目录 1.算法仿真效果 2.verilog核心程序 3.算法涉及理论知识概要 4.完整verilog matlab2022a/vivado2019.2仿真结果如下:  将FPGA仿真的数据导出,然后在matlab中将数据通过噪声之后,可以得到如下的星座图效果。 fpga工程版本信息:       16QAM全称正交幅度调制是英文Quadrature Amplitude

    2024年02月07日
    浏览(41)
  • CRC校验Verilog代码在线生成

      在FPGA设计的过程中,在有些场景下,我们需要用到CRC(Cyclic Redundancy Check)校验码,比如以太网报文、信道编码等。对应的,我们需要编写相应的Verilog代码用于计算对应的CRC校验码。我们可以根据CRC校验的原理自己编写一个产生CRC校验码的Verilog模块,也可以通过在线网站进

    2024年02月11日
    浏览(42)
  • 【Verilog】CRC校验码生成器原理及verilog实现

    目录 一、CRC的基本原理  二、CRC生成步骤 2.1举个栗子 三、Verilog实现 四、参考资料 4.1 CRC在线计算器 CRC :Cyclic Redundancy Check循环冗余校验码         将被处理的报文比特序列当做一个二进制多项式A(x)的系数,任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包