1 前言

在 前面的部落格  CRC校驗原理和verilog實現方法()  中,介紹了CRC校驗的原理和手動計算過程。本文說一下我在學習CRC校驗FPGA實現的一點心得體會。

2 線性反饋移位暫存器

線性反饋移位暫存器簡稱LFSR,用於產生可重複的偽隨機序列,也可用來實現CRC校驗。LFSR主要由觸發器(暫存器)、異或門以及反饋線路組成。

已知多項式,其中gn~g0 是係數,g0取值為1,其他係數可以是0或1。該多項式用二進位制表示為,用LFSR表示為:

或者表示為:

第一種表示法為伽羅瓦LFSR,第二種表示法叫斐波那契LFSR。

可以看出,對於一個n次多項式,可以使用n-1個移位暫存器和最多n-2個異或門實現。LFSR可以實現模二除法。

3 模2除法與LFSR

把被除數的資料,從第一個暫存器的輸入端接入,就可以實現模二運算。

對於一個n次多項式,可以使用n-1個移位暫存器,和最多n-1個異或門,實現模二運算。

假如被除數是2位的資料S[1:0]=01b,多項式是10011b。CRC校驗裡面,習慣省略最高位的1,多項式用0011b表示。那麼S除以0011b的模二運算數位電路結構為:

其中d1~d4是暫存器輸入;q1~q4是暫存器輸出。暫存器需要賦初值,一般賦全1或全0。

下面對模二運算的邏輯表示式進行推導。

首先MSB參與計算,此時:

d1=S[1]^q4;

d2= S[1]^q1^q4;

d3=q2;

d4=q3。

經過一次移位後:

q1=d1= S[1]^q4;

q2= d2= S[1]^q1^q4;

q3= d3=q2;

q4= d4=q3。

此時有:

d1=S[0]^q3;

d2= S[0]^ S[1]^q4^q3;

d3= S[1]^q1^q4;

d4= q2。

令c[3:0]={q4,q3,q2,q1},d[3:0]={d4,d3,d2,d1},那麼d就是最終的運算結果表示式,如下

d[3]=c[1];

d[2]= S[1]^c[0]^c[3];

d[1]= S[0]^ S[1]^ c[3]^ c[2];

d[0]= S[0]^ c[2]。

令c的初值為0,則01b對0011b的模二除法的餘數為0011。

與手動計算進行對比,結果一致。

上述的被除數S可以換成任意位寬,推導過程一樣,當然S位寬越大,推導越複雜,最終的邏輯表示式也越複雜。

上面的邏輯表示式,用verilog異或邏輯閘很容易實現。

4 CRC校驗的verilog實現

知道如何用verilog實現模二除法,CRC校驗的實現就很容易了。但是CRC校驗模型一般會有一些特定要求,如輸入輸出翻轉、CRC暫存器初始值等。下一篇部落格繼續分享。

參考連結:

1、 https://blog.csdn.net/qq_44113393/article/details/89852994

2、 https://www.cnblogs.com/weijianlong/p/11947741.html