日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

来搞清楚CRC校验的原理和实现

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 来搞清楚CRC校验的原理和实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在MIPI_CSI-2協(xié)議里payload數(shù)據(jù)的校驗(yàn)使用了CRC校驗(yàn),但是關(guān)于CRC校驗(yàn)只知其一,或者說(shuō)只知的還不到其一,因此非常有必要搞清楚它,自然的我搜查了一些博主的文章嘗試得到答案,最終在知乎前輩的一篇文章中找到了比較容易理解的內(nèi)容。

參考:CRC校驗(yàn)原理及實(shí)現(xiàn) - 知乎 (zhihu.com)

? ? ? ? ? ?CRC校驗(yàn)(一)——原理 - 菜鳥學(xué)院 (noobyard.com)

? ? ? ? ? ??CRC碼計(jì)算及校驗(yàn)原理的最通俗詮釋 - 苦澀的茶 - 博客園 (cnblogs.com)

目錄

  • 前言
  • CRC算法簡(jiǎn)介
  • CRC計(jì)算
  • CRC校驗(yàn)
  • CRC計(jì)算的verilog語(yǔ)言實(shí)現(xiàn)
  • CRC計(jì)算工具
  • 總結(jié)

前言

最近的工作中要實(shí)現(xiàn)對(duì)通信數(shù)據(jù)的CRC計(jì)算。因此花時(shí)間好好研究了一下周末有時(shí)間整理筆記。

一個(gè)完整的數(shù)據(jù)幀通常由一下部分構(gòu)成:

校驗(yàn)位是為了保證數(shù)據(jù)在傳輸?shù)倪^(guò)程中的完整性,采用一種指定的算法對(duì)原始的數(shù)據(jù)進(jìn)行計(jì)算,得出的一個(gè)校驗(yàn)值,在接收方接收到數(shù)據(jù)時(shí),采用同樣的校驗(yàn)算法對(duì)原始的數(shù)據(jù)進(jìn)行計(jì)算,如果計(jì)算結(jié)果和接收到的校驗(yàn)值一致,說(shuō)明數(shù)據(jù)校驗(yàn)正確,這一幀數(shù)據(jù)可以使用。如果不一致,說(shuō)明傳輸過(guò)程中出現(xiàn)了差錯(cuò),這一陣數(shù)據(jù)丟棄,請(qǐng)求重新發(fā)送。

常用的校驗(yàn)算法有奇偶校驗(yàn),校驗(yàn)和,CRC,還有LRC,BBC等不常用的校驗(yàn)算法。

以串口通信中的奇校驗(yàn)為例,如果數(shù)據(jù)中1的個(gè)數(shù)位奇數(shù),則奇校驗(yàn)位為0,否則為1。

例如原始數(shù)據(jù)為:0001 0011,數(shù)據(jù)中1的個(gè)數(shù)(或各位相加)為3,所以奇校驗(yàn)位為0,這種校驗(yàn)方法很簡(jiǎn)單,但是這種校驗(yàn)方法有很大的誤碼率,假設(shè)由于傳輸過(guò)程中的干擾,接受斷接受到的數(shù)據(jù)是0010 0011,通過(guò)奇校驗(yàn)原酸,得到奇校驗(yàn)位的值為0,雖然校驗(yàn)通過(guò),但是數(shù)據(jù)已經(jīng)發(fā)生了錯(cuò)誤。

校驗(yàn)和同理也會(huì)有類似的錯(cuò)誤:

?

一個(gè)好的校驗(yàn)方法,配合數(shù)字信號(hào)編碼方式,如(差分)曼徹斯特編碼,(不)歸零碼等對(duì)數(shù)據(jù)進(jìn)行編碼,可大大提高通信的健壯性和穩(wěn)定性,例如以太網(wǎng)中使用的是CRC-32校驗(yàn),本文介紹CRC校驗(yàn)的原理和實(shí)現(xiàn)方法。

CRC算法簡(jiǎn)介

循環(huán)冗余校驗(yàn)(Cyclic Redundancy check,CRC)是一種根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包或計(jì)算機(jī)文件等書記產(chǎn)生簡(jiǎn)短固定位數(shù)校驗(yàn)碼的一種信道編碼技術(shù),主要用來(lái)檢測(cè)或校驗(yàn)數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯(cuò)誤,它是利用除法以及余數(shù)的原理來(lái)做錯(cuò)誤幀檢測(cè)的。

CRC校驗(yàn)計(jì)算速度快,檢錯(cuò)能力強(qiáng),易于用編碼器等硬件電路實(shí)現(xiàn),從檢錯(cuò)的正確率與速度成本等方面,都比奇偶校驗(yàn)方式具有優(yōu)勢(shì),因而,CRC成為計(jì)算機(jī)信息通信領(lǐng)域最為普遍的校驗(yàn)方式,常見(jiàn)應(yīng)用有以太網(wǎng)/USB通信,壓縮解壓,視頻編碼,圖像存儲(chǔ),磁盤讀寫等。

CRC參數(shù)模型

不知道你是否遇到過(guò)這種情況,同樣的CRC多項(xiàng)式,調(diào)用不同的CRC計(jì)算函數(shù),得到的結(jié)果卻不一致,而且和手算的結(jié)果也不一樣,這就涉及到CRC的參數(shù)模型了,計(jì)算一個(gè)正確的CRC值,需要知道CRC的參數(shù)模型。

一個(gè)完整的CRC參數(shù)模型應(yīng)該包含一下信息:WIDTH, POLY, INIT, REFIN, REFOUT, XOROUT

  • NAME:參數(shù)模型名稱
  • WIDTH:?寬度,即生成的CRC數(shù)據(jù)寬度,如CRC-8,生成CRC為8位
  • POLY:十六進(jìn)行多項(xiàng)式,省略最高位1,如X^8+X^2+X+1,二進(jìn)制為1 0000 0111,省略最高位1,轉(zhuǎn)換為16進(jìn)制為0x07。
  • INIT:CRC初始值,和WIDTH位寬一致。
  • REFIN:true或者false,在進(jìn)行計(jì)算前,原始數(shù)據(jù)是否翻轉(zhuǎn),eg:原始數(shù)據(jù)0x34 = 0011 0100
  • ? ? ? ? ? ? ? 如果REFIN為ture,進(jìn)行反轉(zhuǎn)之后為0010 1100 = 0x2c
  • REFOUT:true或者false,運(yùn)算完成后,得到的CRC值是否進(jìn)行翻轉(zhuǎn),如計(jì)算得到的CRC值為:
  • ? ? ? ? ? ? ? 0x97 = 1001 0111,如果REFOUT為ture,進(jìn)行翻轉(zhuǎn)后為1110 1001 = 0xE9
  • XOROUT:計(jì)算結(jié)果與此參數(shù)進(jìn)行異或運(yùn)算后得到最終的CRC值,和WIDTH位寬一致。

PS:首先把生成多項(xiàng)式轉(zhuǎn)換成二進(jìn)制數(shù),由G(X)?= X^8?+ X^2?+X+1可以知道(它一共是9位(總位數(shù)等于最高位的冪次加1,即8+1=9),然后根據(jù)多項(xiàng)式各項(xiàng)的含義(多項(xiàng)式只列出二進(jìn)制值為1的位,也就是這個(gè)二進(jìn)制的第8位、第3位、第1位、第0位的二進(jìn)制均為1,其它位均為0)很快就可得到它的二進(jìn)制比特串為1 0000 0111)

參考了:CRC碼計(jì)算及校驗(yàn)原理的最通俗詮釋 - 苦澀的茶 - 博客園 (cnblogs.com)

通常如果只給了一個(gè)多項(xiàng)式,其他的沒(méi)有說(shuō)明,則默認(rèn):INIT:0x00,REFIN=false,REFOUT=false,XOROUT=0x00

常用的21個(gè)標(biāo)準(zhǔn)CRC參數(shù)模型:

CRC算法名稱多項(xiàng)式公式寬度多項(xiàng)式初始值結(jié)果異或值輸入反轉(zhuǎn)輸出反轉(zhuǎn)
CRC-4/ITUx4?+ x + 14030000truetrue
CRC-5/EPCx5?+ x3?+ 15090900falsefalse
CRC-5/ITUx5?+ x4?+ x2?+ 15150000truetrue
CRC-5/USBx5?+ x2?+ 15051F1Ftruetrue
CRC-6/ITUx6?+ x + 16030000truetrue
CRC-7/MMCx7?+ x3?+ 17090000falsefalse
CRC-8x8?+ x2?+ x + 18070000falsefalse
CRC-8/ITUx8?+ x2?+ x + 18070055falsefalse
CRC-8/ROHCx8?+ x2?+ x + 1807FF00truetrue
CRC-8/MAXIMx8?+ x5?+ x4?+ 18310000truetrue
CRC-16/IBMx16?+ x15?+ x2?+ 116800500000000truetrue
CRC-16/MAXIMx16?+ x15?+ x2?+ 11680050000FFFFtruetrue
CRC-16/USBx16?+ x15?+ x2?+ 1168005FFFFFFFFtruetrue
CRC-16/MODBUSx16?+ x15?+ x2?+ 1168005FFFF0000truetrue
CRC-16/CCITTx16?+ x12?+ x5?+ 116102100000000truetrue
CRC-16/CCITT-FALSEx16?+ x12?+ x5?+ 1161021FFFF0000falsefalse
CRC-16/X25x16?+ x12?+ x5?+ 1161021FFFFFFFFtruetrue
CRC-16/XMODEMx16?+ x12?+ x5?+ 116102100000000falsefalse
CRC-16/DNPx16?+ x13?+ x12?+ x11?+ x10?+ x8?+ x6?+ x5?+ x2?+ 1163D650000FFFFtruetrue
CRC-32x32?+ x26?+ x23?+ x22?+ x16?+ x12?+ x11?+ x10?+ x8?+ x7?+ x5?+ x4?+ x2?+ x + 13204C11DB7FFFFFFFFFFFFFFFFtruetrue
CRC-32/MPEG-2x32?+ x26?+ x23?+ x22?+ x16?+ x12?+ x11?+ x10?+ x8?+ x7?+ x5?+ x4?+ x2?+ x + 13204C11DB7FFFFFFFF00000000falsefalse

CRC校驗(yàn)在電子通信領(lǐng)域非常常用,可以說(shuō)有數(shù)據(jù)處理的地方就有CRC校驗(yàn):

舉幾個(gè)例子:

  • 美信(MAXIM)的芯片DS2401/DS18B20,都是使用的CRC-8/MAXIM模型
  • SD卡或MMC使用的是CRC-7/MMC模型
  • Modbus通信協(xié)議使用的是CRC-16/MODBUS參數(shù)模型
  • USB協(xié)議中使用的是CRC-5/USB和CRC-16/USB模型
  • STM32自帶的硬件CRC計(jì)算模塊使用的是CRC-32模型

至于多項(xiàng)式的選擇,初始值和異或值得選擇,輸入輸出是否翻轉(zhuǎn),這就這幾到一定得編碼和數(shù)學(xué)知識(shí)了,感興趣得朋友可以了解一下每個(gè)CRC模型個(gè)個(gè)參數(shù)得來(lái)源,至于每種參數(shù)模型得檢錯(cuò)能力,重復(fù)率,需要專業(yè)的數(shù)學(xué)計(jì)算了,不在本文討論的范圍內(nèi)。

CRC計(jì)算

好了,了解了CRC參數(shù)模型知識(shí),下面手算一個(gè)CRC值,來(lái)了解CRC計(jì)算的原理。

問(wèn):原始數(shù)據(jù)0x34,使用CRC-8/MAXIN參數(shù)模型,求CRC值?

?答:根據(jù)CRC參數(shù)模型表,得到CRC-8/MAXIN的參數(shù)如下:

POLY = 0x31 = 0011 0001(最高位1已經(jīng)省略) INIT = 0x00 XOROUT = 0x00 REFIN = TRUE REFOUT = TRUE

?注意:原始數(shù)據(jù)和參數(shù)中的INIT值不是一個(gè)東西!!!

有了上面的參數(shù),這樣計(jì)算條件才算完整,下面來(lái)實(shí)際計(jì)算:

  • 0:原始數(shù)據(jù)= 0x34 = 0011 0100 , POLY=0x31 = 1 0011 0001
  • 1:INIT = 0x00,原始數(shù)據(jù)和初始值進(jìn)行異或運(yùn)算保持不變?
  • 2:REFIN為true,需要先對(duì)原始數(shù)據(jù)進(jìn)行翻轉(zhuǎn):0011 0100 ——> 00101100
  • 3:原始數(shù)據(jù)左移8位,即后面補(bǔ)8個(gè)0:0010 1100 0000 0000
  • 4:把處理后的數(shù)據(jù)和多項(xiàng)式進(jìn)行模2除法,求得余數(shù)

? ? ? ? ? ? ?原始數(shù)據(jù):0010 1100 0000 0000 = 10 1100 0000 0000

? ? ? ? ? ? ? 多項(xiàng)式:1 0011 0001

? ? ? ? ? ? ? 模2除法取余數(shù)低8位:1111 1011

  • ?5:與XOROUT進(jìn)行異或,1111 1011 xor 0000 0000 = 1111 1011
  • ?6:因?yàn)镽EFOUT為TRUE,對(duì)結(jié)果進(jìn)行翻轉(zhuǎn)得到最終的CRC-8值:1101 1111 = 0xDF
  • ?7:數(shù)據(jù)+CRC :0011 0100 1101 1111 = 0x34DF,相當(dāng)于原始數(shù)據(jù)左移8位+余數(shù)

看到這里細(xì)心的同學(xué)肯定會(huì)有疑問(wèn):

1:為什么step1,原始數(shù)據(jù)和初始值異或運(yùn)算保持不變 ?

? ? ? ?答:算法規(guī)定在進(jìn)行上述模2運(yùn)算之前,需要先將要計(jì)算的數(shù)據(jù)與初始值進(jìn)行異或,然后再與多項(xiàng)式進(jìn)行計(jì)算。

2:為什么要將原始數(shù)據(jù)左移8位 ?

? ? ?答:暫時(shí)不清楚,這里有提到左移的規(guī)則,但是有待商榷

不要跑,CRC沒(méi)這么難!(簡(jiǎn)單易懂的CRC原理闡述) - SegmentFault 思否

實(shí)驗(yàn)1:

如上所述,對(duì)原始數(shù)據(jù)0x34的模2除法過(guò)程如圖中所示:

?

實(shí)驗(yàn)二:

對(duì)原始數(shù)據(jù)0xc,使用CRC-4/ITU參數(shù)模型,求CRC值?

?

?與手算結(jié)果一致。

?CRC校驗(yàn)

上面通過(guò)筆算的方式,講解了CRC計(jì)算的原理,下面來(lái)介紹一下如何進(jìn)行校驗(yàn)。

按照上面CRC計(jì)算的結(jié)果,最終的數(shù)據(jù)幀:0011 0100 1101 1111 = 34DF,前8位0011 0100是原始數(shù)據(jù),后8位1101 1111 是 CRC結(jié)果。

接收端的校驗(yàn)有兩種方式,一種是和CRC計(jì)算一樣,在本地把接收到的數(shù)據(jù)和CRC分離,然后在本地對(duì)數(shù)據(jù)進(jìn)行CRC運(yùn)算,得到的CRC值和接收到的CRC進(jìn)行比較,如果一致,說(shuō)明數(shù)據(jù)接收正確,如果不一致,說(shuō)明數(shù)據(jù)有錯(cuò)誤。

另一種方法是把整個(gè)數(shù)據(jù)幀進(jìn)行CRC運(yùn)算,因?yàn)槭菙?shù)據(jù)幀相當(dāng)于把原始數(shù)據(jù)左移8位,然后加上余數(shù),如果直接對(duì)整個(gè)數(shù)據(jù)幀進(jìn)行CRC運(yùn)算(除以多項(xiàng)式),那么余數(shù)應(yīng)該為0,如果不為0說(shuō)明數(shù)據(jù)出錯(cuò)

?附上在線CRC校驗(yàn)計(jì)算器:

CRC(循環(huán)冗余校驗(yàn))在線計(jì)算_ip33.com

總結(jié)

以上是生活随笔為你收集整理的来搞清楚CRC校验的原理和实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。