近來有人問起Mark Balch在「Complete Digital Design – A Comprehensive Guide to Digital Electronics and Computer System Architecture」(見所附文獻「1」)裡給出的CRC(Cyclic Redundancy Check,即循環冗余檢驗)碼推算是否有錯,正好我很久很久以前做過類似的推導(記得是用CRC16),就在本地圖書館把這本書借來看了看,覺得推導沒問題,只是插圖有問題,現在統一回復(原是英文,改寫成漢字)在這裡供感興趣的朋友參考。
Mark Balch舉的CRC8的例子是當年ITU(International Telecommunication Union)推薦的用於保護ATM Cell Headers,所用的校驗位也叫HEC(Header Error Check)位,其生成多項式(Polynomial)是:X^8 + X^2 + X + 1。用線性反饋移位寄存器(LFSR,Linear-Feedback Shift Register)實現時,其電路如圖一所示。
圖一,CRC8的LFSR實現(X標註的矩形是寄存器,圓形是「異或」邏輯)
文獻「1」給出的Figure 9.10 (HEC LFSR)在連接上不正確,應該以上圖為準。
根據圖一,可以按表一生成如文獻「1」在其Table 9.7中給出的一樣的並行HEC邏輯。輸入數據流前八位是D7D6…D0,並行CRC碼的初始值為0(這對輸入數據流為零的例子不利,也是HEC校驗的短處。)。最後一行(Cycle 8)按位給出了並行CRC位的生成邏輯,例如8位CRC[7:0]的C[2]=X{2,1,6,0} = X2^X1^X6^X0。
表一,推導並行HEC邏輯
這裡X{3,2,7,1}表示X3^X2^X7^X1,而X[i] = C[i]^D[i],^表示「異或」(Exclusive OR)操作。注意:A^A = 0,0^A = A。
參考文獻
1,Complete Digital Design – A Comprehensive Guide to Digital Electronics and Computer System Architecture,Mark Balch,McGraw-Hill,2003