累加和校驗原理與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
英文地址,請注明出處:http://en.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 中繼器是把一根線纜中的電或者光信號傳遞給另一…