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