1. 程式人生 > >CRC校驗原理和verilog實現方法(一)

CRC校驗原理和verilog實現方法(一)

1.CRC簡介

 CRC全稱迴圈冗餘校驗(Cyclic Redundancy Check, CRC),是通訊領域資料傳輸技術中常用的檢錯方法,用於保證資料傳輸的可靠性。網上有關這方面的部落格和資料很多,本文儘量簡潔的梳理一下它的原理。後面還會結合自己的實踐經驗(不多),說一說如何使用verilog語言在FPGA中做CRC校驗。感興趣的朋友可以關注我後續的更新,一起交流學習!

CRC校驗的基本思路是資料傳送方傳送資料之前,先生成一個CRC校驗碼,可以是單bit也可以是多bit,並附在有效資料末尾,以序列方式傳送到接收方。接收方接收到資料後,進行CRC校驗,根據校驗結果就可以知道資料是否有誤。

CRC校驗碼的生成:將有效資料擴充套件後作為被除數,使用一個指定的多項式作為除數,進行模二除法,得到的餘數就是校驗碼。

資料接收方的CRC校驗:將接受的資料(有效資料+CRC校驗碼)擴充套件後作為被除數,用指定的多項式作為除數,進行模二除法,得到餘數為0,則表示校驗正確。

2.CRC校驗過程

2.1多項式選取

多項式關係到檢查錯誤的可靠性,其中有一定的數學關係,這裡不去深究,感興趣的朋友可查閱通訊原理和線性編碼相關書籍。

多項式的常規表示式:G(x)=x^n+x^(n-1)…+1,其中n>=1。

也可以用2進位制數表示,以便軟體程式設計。例如多項式G(x)=x^5+x^3+x^2+1,用2進製表示就是101101;多項式G(x)=x^6+x^5+x^1+1,用2進製表示就是1100011。很容易看出規律吧。

有些資料裡將多項式最高位的1省略,不過這裡建議手動計算時保留這一位,免得出錯。

通訊領域有一些常用的多項式,如下表示所示,可根據通訊方式選擇,例如CRC-5/USB演算法對應的是用於USB通訊的CRC多項式。

  

2.2求餘數(傳送方) 

求餘目的是得到CRC校驗碼。首先將有效資料擴充套件n位作為被除數,n是多項式的最高次冪,例如前面的多項式101101最高次冪是5(比2進位制位數少1),則有效資料擴充套件5位。然後用多項式的2進位制數用模2除法去除被除數,得到的餘數是CRC校驗碼。

先搞明白模2除法運算機制。

模2除法可以藉助邏輯上的異或運算和移位實現,例如被除數是2進位制的10001111,除數是1010,則模2除法求餘數的計算過程如下圖所示,得到商是101,餘數是111。可以看出,每次計算,除數最高位的“1”都要和被除數最高位的“1”對齊,然後進行異或運算。得到的餘數位數不小於除數,則移位後再次對齊、計算,直到餘數位數(從最高位的1開始算)小於除數位數。

 

再看CRC校驗碼的計算過程。

假如傳送的有效資料是10101010(注意是2進位制),我們把它作為被除數。這裡選擇CRC-5/USB校驗演算法,多項式是x^5+x^2+1,對應2進位制形式是100101。

首先對有效資料擴充套件5bit,也就是在後面添5個0,得到被除數1010101000000。然後進行模2除法,最終得到5bit(比多項式少1bit)餘數11000,這就是CRC校驗碼。

把上面得到的校驗碼附在有效資料後面,構成資料1010101011000,然後傳送給接收方。 

2.3求餘數(接收方)

資料接收方對資料(包含校驗碼)求餘數,計算過程與上述完全相同。最終得到的餘數為0,才能說明資料傳輸無誤。

假如接收的資料無誤,這裡寫出來接收方的計算過程:

 

最終得到餘數為0,證明資料無誤。

需要注意的是,在構造被除數之前,原始資料必須是以位元組(8bit)為單位,如果不夠一個完整的位元組,可以在高位補0。這一點在後面verilog實現時很關鍵。

3.CRC校驗計算例項

關於CRC校驗碼的計算,上面繁瑣的手算有助於瞭解計算過程,現在也有很多CRC計算工具,線上的和離線的都有。例如參考連結1的線上計算工具,可以用來驗證手算或者自己的校驗程式碼的計算結果。

這裡用一個2byte資料做一次完整CRC校驗,其中校驗碼的計算分別用手算和線上工具計算進行對比。

1)要傳送的資料是0x8421,對應2進製為1000 0100 0010 0001;校驗演算法使用CRC-8,對應多項式是100000111。

2)手動計算,求校驗碼:有效資料擴充套件後為1000 0100 0010 0001 0000 0000,計算得CRC校驗碼為00000101,16進製為0x05。(算到眼疼~

3)線上工具計算校驗碼:得0x05,結果一致,說明手算無誤。

4)在原始的傳送資料後面附上校驗碼:得1000 0100 0010 0001 0000 0101,即0x842105。

4)手動計算,求接收方的校驗結果:得0x00。

5)線上工具計算,求接收方的校驗結果:得0x00,接收校驗無誤。

參考連結:

1、http://www.ip33.com/crc.html

2、https://www.cnblogs.com/liushui-sky/p/9962123.