累加和校验原理与FPGA实现

累加和校验原理与FPGA实现

  • 写在前面
  • 一、基础原理
  • 二、举个例子
    • 2.1 进位累加
    • 2.2 回卷累加
  • 三、FPGA实现
    • 3.1 发送端(产生校验和)
    • 3.2 接收端(累加和校验)
    • 3.3 仿真结果
  • 写在后面

写在前面

  在上文《奇偶校验原理与FPGA实现》中,讲解了奇偶校验的基础原理,奇偶校验仅增加1比特的信息冗余,所增加额外开销小,但不可避免存在检错能力有限的问题。本文将讲解另外一种校验码型——累加和校验。累加和校验的使用场景较为广泛,在网络通信协议(IP/TCP/UDP协议)、高速接口(AXI)、存储器数据保护等很多场景均有使用。

一、基础原理

  累加和校验原理是将要发送或存储的数据分割成固定长度的多个数据段(通常为字节或字),然后将这些数据段累加起来(通常采用二进制加法,忽略进位),得到一个累加和。最后,将累加和取反(或取补码)作为校验值附加到原始数据后面。

  在发送端,累加和的计算可以分为以下几个步骤:

  1. 数据分割:将数据按固定长度(如8位、16位)分割成多个数据块;
  2. 累加求和:将所有数据块进行二进制加法累加。在累加过程中,如果有进位,则回卷(即进位加到最低位上)。但实际实现中,通常采用足够宽的寄存器(如16位累加和用32位寄存器)来避免溢出,最后取低16位;
  3. 取反:将累加和按位取反(即1的补码),得到校验和(Checksum)。取反的目的是为了在接收端验证时,包括校验和在内的所有数据累加的结果应该为全1(即0xFFFF,对于16位校验和),再取反则为0。这样接收端可以通过判断累加结果是否为0来检查数据正确性;
  4. 附加校验和:将计算得到的校验和附加在原始数据的末尾;

  而在接收端,将接收到的所有数据(包括原始数据和附加的校验和)进行同样的累加操作(同样忽略进位或使用足够宽的寄存器),如果传输没有错误,则累加的结果应该为0xFFFF。


  以上描述的校验和传输方式为反码传输,实际上常用的校验和传输方式有原码、反码、补码三种。

  • 方式1:发送方计算数据的累加和,然后将其作为校验和直接发送。接收方将接收到的所有数据(不包括校验和)进行累加,如果没有错误,则累加结果应该与校验和一致。
  • 方式1:发送方计算数据的累加和,然后取反码作为校验和进行发送。接收方将接收到的所有数据(包括校验和)进行累加,如果没有错误,则结果应为全1(即0xFFFF,对于16位校验和)。因为:原码+反码=全1
  • 方式2:发送方计算数据的累加和,然后取补码作为校验和进行发送。接收方将接收到的所有数据(包括校验和)进行累加,如果没有错误,则结果应为全0。因为:原码+补码=全0

二、举个例子

  以反码形式传输校验和为例,假如传输的4个16比特数据分别为0x1234、0x5678、0x9ABC、0xDEF0。

2.1 进位累加

  若是使用进位累加的方式,采用32位累加器(保证累加和不溢出),则在发送端:

0x1234+0x5678=0x68AC
0x9ABC+0xDEF0=0x179AC
0x68AC+0x179AC=0x1E258

  取累加和的低16比特0xE258,取反得到校验和0x1DA7进行发送。在接收端:

0x1234+0x5678=0x68AC
0x9ABC+0xDEF0=0x179AC
0x68AC+0x179AC=0x1E258
0x1E258+0x1DA7=0x1FFFF

  累加结果的低16比特为全1,累加和校验通过。

2.2 回卷累加

  若是使用进位累加的方式,采用17位累加器,则在发送端:

0x1234+0x5678=0x68AC
0x9ABC+0xDEF0=0x179AC
0x68AC+0x179AC=0x1E258
0x1+0xE258=0xE259

  取累加和的低16比特0xE258,取反得到校验和0x1DA6进行发送。在接收端:

0x1234+0x5678=0x68AC
0x9ABC+0xDEF0=0x179AC
0x68AC+0x179AC=0x1E258
0x1+0xE258=0xE259
0xE259+0x1DA6=0xFFFF

  累加结果的低16比特为全1,累加和校验通过。

三、FPGA实现

3.1 发送端(产生校验和)

module tx_checksum 
(input 					clk				,input 					rst_n			,input 		[15	:0] 	data_in			, // 输入数据input 					data_valid		, // 数据有效信号input					start			, // 数据起始标志input					finish			, // 数据结束标志output 	    [15	:0] 	checksum		, // 生成的校验和output 	    			checksum_valid    // 校验和有效信号
);//----------------------------------------------------------------// REG//----------------------------------------------------------------reg    [31  :0]   accumulator	;  // 32位累加器(防溢出)reg    			  finish_d		;//----------------------------------------------------------------// LOGIC//----------------------------------------------------------------always @(posedge clk or negedge rst_n) beginif(!rst_n)accumulator <= 32'd0;else if(start && data_valid)accumulator <= {16'd0,data_in};else if(data_valid)accumulator <= accumulator[31:16] + accumulator[15:0] + data_in; // 回卷+累加elseaccumulator <= accumulator;endalways @(posedge clk or negedge rst_n) beginif(!rst_n)finish_d <= 1'b0;elsefinish_d <= finish;endassign checksum       = ~accumulator[15:0];assign checksum_valid = finish_d		 ;endmodule

3.2 接收端(累加和校验)

module rx_checksum 
(input 					clk				,input 					rst_n			,input 		[15	:0] 	data_in			, // 输入数据input 					data_valid		, // 数据有效信号input					start			, // 数据起始标志input					finish			, // 数据结束标志output 	            	check_pass		  // 数据校验通过
);//----------------------------------------------------------------// REG//----------------------------------------------------------------reg    [31  :0]   accumulator	;  // 32位累加器(防溢出)reg    			  finish_d		;//----------------------------------------------------------------// LOGIC//----------------------------------------------------------------always @(posedge clk or negedge rst_n) beginif(!rst_n)accumulator <= 32'd0;else if(start && data_valid)accumulator <= {16'd0,data_in};else if(data_valid)accumulator <= accumulator[31:16] + accumulator[15:0] + data_in; // 回卷+累加elseaccumulator <= accumulator;endalways @(posedge clk or negedge rst_n) beginif(!rst_n)finish_d <= 1'b0;elsefinish_d <= finish;endassign check_pass = (finish_d && (accumulator == 32'h0000FFFF)) ? 1'b1 : 1'b0;endmodule

3.3 仿真结果

  在发送端,依次发送0x1234、0x5678、0x9ABC、0xDEF0,得到的校验和为0x1DA6,与前面所举例子理论值一致。
在这里插入图片描述
  在发送端,对序列0x1234、0x5678、0x9ABC、0xDEF0、0x1DA6进行累加,得到的累加和为0xFFFF,校验通过。
在这里插入图片描述

写在后面

  在本文中,讲解了累加和校验的基本原理,包括:

  • 累加和的三种传输方式以及在接收端相应的校验方法(原码、反码、补码)
  • 累加的两种方式(进位累加、回卷累加)

  同时,举例计算进位累加与回卷累加的累加过程与校验过程,并给出了回卷累加的发送端、接收端代码与仿真结果。


🧐:以上为个人学习笔记,如有疑问,欢迎评论区交流探讨 !!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918570.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析Go设计模式:命令模式实战

什么是命令模式? 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为独立对象,从而允许客户端通过不同的请求对象进行参数化配置。该模式支持请求的排队执行、操作记录以及撤销等功能。 命令模式UML类图如下所示: 命令模式包含五个核心角色,具体说明如下: …

Pytest项目_day11(fixture、conftest)

Fixture fixture是一种类似于setup、teardown&#xff0c;用于测试前后进行预备、清理工作的代码处理机制 相比于setup、teardown来说&#xff0c;fixture命名更灵活&#xff0c;局限性更少使用conftest.py配置里面可以实现数据共享&#xff0c;不需要import就能自动找到一些配…

DAY 43 复习日

作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 划分数据集 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader impo…

Flink运行时的实现细节

一、Flink集群中各角色运行架构先说Flink集群中的角色吧&#xff0c;有三个分别是客户端(Client)、JobManager、TaskManager。客户端负责接收作业任务并进行解析&#xff0c;将解析后的二进制数据发送给JobManager&#xff1b;JobManager是作业调度中心&#xff0c;负责对所有作…

思科、华为、华三如何切换三层端口?

三层交换机融合了二层交换技术与三层转发技术&#xff0c;具备强大的网络功能。主流厂商&#xff08;思科、H3C、华为&#xff09;的三层交换机均支持二层端口与三层端口的相互切换&#xff0c;但具体命令存在差异。本文将详细介绍三大厂商设备的端口切换方法及相关知识。一、各…

springboot的基础要点

Spring Boot 的核心设计理念是 ​​"约定优于配置"​​&#xff08;Convention Over Configuration&#xff09;&#xff0c;旨在简化 Spring 应用的初始搭建和开发过程。以下是需要掌握的核心基础要点&#xff1a;​一、核心机制​​自动配置 (Auto-Configuration)​…

lesson36:MySQL从入门到精通:全面掌握数据库操作与核心原理

目录 一、引言&#xff1a;为什么选择MySQL&#xff1f; 二、MySQL安装与登录配置 2.1 环境准备 2.2 登录指令详解 三、数据库核心操作 3.1 数据库生命周期管理 3.2 数据库存储引擎选择 四、数据表设计与操作 4.1 表结构创建&#xff08;含数据类型详解&#xff09; …

Spring源码解析 - SpringApplication run流程-prepareContext源码分析

prepareContext源码分析 private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments, Bann…

HIS系统:医院信息化建设的核心,采用Angular+Java技术栈,集成MySQL、Redis等技术,实现医院全业务流程管理。

HIS系统在医院信息化建设中扮演着核心的角色。它是一个综合性的信息系统&#xff0c;旨在管理和运营医院的各种业务&#xff0c;包括门诊、住院、财务、物资、科研等。技术细节&#xff1a;前端&#xff1a;AngularNginx后台&#xff1a;JavaSpring&#xff0c;SpringBoot&…

深度学习-卷积神经网络-LeNet

卷积神经网络是一种专门用于处理具有网格结构数据&#xff08;如图像、音频等&#xff09;的深度学习模型。它通过卷积层自动提取数据中的特征&#xff0c;利用局部连接和参数共享的特性减少了模型的参数数量&#xff0c;降低了过拟合的风险&#xff0c;同时能够有效地捕捉数据…

【Java项目与数据库、Maven的关系详解】

Java项目与数据库、Maven的关系详解 一、Java项目是否都需要连接本地数据库&#xff1f; 不一定&#xff0c;这取决于项目类型和需求&#xff1a; 1. 需要数据库的项目类型项目类型数据库作用典型场景Web应用存储用户数据/业务数据电商系统、CMS服务端程序持久化数据金融交易系…

两个Maven工程,使用idea开发,工程A中依赖了工程B,改了工程B,工程A如何获取最新代码

两个Maven工程&#xff0c;使用idea开发&#xff0c;工程A中依赖了工程B&#xff0c;改了工程B&#xff0c;工程A如何获取最新代码 如果工程B的版本是快照&#xff0c;那么如下。 步骤一 工程B 执行 clean package install deploy 步骤二 工程A 刷新Maven

奥比中光与地平线、地瓜机器人达成战略合作,携手推动机器人智能化

摘要&#xff1a;机器人“慧眼”与“智脑”强强联合&#xff01;8月11日&#xff0c;奥比中光与地平线及其控股子公司地瓜机器人在北京签订合作协议&#xff0c;双方将在机器人智能化领域展开深度合作&#xff0c;充分发挥各自的技术与产品优势&#xff0c;携手推动机器人产业的…

【Linux】Tomcat

Tomcat简介Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和 并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat 具有处理HTML页面的功能&#xff0c;它还是一个Servlet和 JSP容器Tomcat的使用安装ja…

Putting it all together 将所有内容整合在一起

官方链接 https://www.youtube.com/watch?vAa_FAA3v22g&t1s Task1 Putting It All Together 将所有内容整合在一起 图片版 文字版 Putting It All Together 将所有内容整合在一起 From the previous modules, youll have learned that quite a lot of things go on b…

Python 闭包详解:从变量作用域到实战案例

一、变量作用域基础在 Python 中&#xff0c;变量根据作用范围可分为三类&#xff1a;全局变量&#xff1a;定义在函数外部的变量&#xff0c;作用范围是整个程序。如果在函数内部需要修改全局变量&#xff0c;必须使用global关键字声明。局部变量&#xff1a;定义在函数内部的…

Docker 跨主机容器之间的通信macvlan

默认一个物理网卡&#xff0c;只有一个物理mac地址&#xff0c;虚拟多个mac地址 缺点&#xff1a;每次需要手动配置ip地址&#xff0c;容易ip地址冲突。类似于保存到execl表格里面。 两台物理机&#xff1a; docker-01和docker-02 创建macvlan网络 [rootdocker-01 ~]# docker n…

android 换肤框架详解1-换肤逻辑基本

android 换肤框架详解1-换肤逻辑基本-CSDN博客 android 换肤框架详解2-LayoutInflater源码解析-CSDN博客 android 换肤框架详解3-自动换肤原理梳理-CSDN博客 换肤框架流程 1&#xff0c;通过AssetManager获取换肤的资源文件 2&#xff0c;通过原文件中的resId获取到res名称…

NEON性能优化总结

转自 NEON优化&#xff1a;性能优化经验总结-CSDN博客 NEON优化&#xff1a;性能优化经验总结 1. 什么是 NEON Arm Adv SIMD 历史 2. 寄存器 3. NEON 命名方式 4. 优化技巧 5. 优化 NEON 代码(Armv7-A内容&#xff0c;但区别不大) 5.1 优化 NEON 汇编代码 …

计算机网络摘星题库800题笔记 第2章 物理层

第2章 物理层2.1 物理层概述题组闯关1.采用以下哪种设备&#xff0c;可以使数字信号传输得更远 ( )。 A. 放大器 B. 中继器 C. 网桥 D. 路由器1.【参考答案】B 【解析】选项 A 放大器只是单纯地放大信号、抑制噪音和干扰。选项 B 中继器是把一根线缆中的电或者光信号传递给另一…