循環(huán)冗余校驗碼的單片機及CPLD實(shí)現
1 基本原理
本文引用地址:http://dyxdggzs.com/article/171833.htm串行數據的差錯檢驗是保證數據正確的必要手段,通常采用奇遇校驗法和循環(huán)冗余校驗法。這兩種方法都是通過(guò)冗余數據來(lái)提供必要信息。奇偶校驗法適用于以字節為單位數據傳輸。例如用偶校驗傳送1個(gè)ASCII字符時(shí),要附加1個(gè)校驗位,從而使全部9位中“1”的個(gè)數為偶數。奇偶校驗簡(jiǎn)單易行,但當數據崩潰或出現多位錯誤時(shí),往往不能檢驗出來(lái),因而可靠性不高。
循環(huán)冗余碼校驗法利用了循環(huán)和反饋機制,校驗碼由輸入數據與歷史數據經(jīng)過(guò)較為復雜的運算而得到。因此,冗余碼包含了更為豐富的數據間的信息,可靠性更高。校好的循環(huán)冗余碼可校驗出以下錯誤:①全部數據位任意奇數個(gè)位出錯;②全部數據位中任意連續2位出錯;③處于一個(gè)8位時(shí)間窗內的任1~8位數據出錯。
使用循環(huán)冗余碼校驗方法通信時(shí),發(fā)送方先計算待發(fā)數據的校驗碼,然后將數據與校驗碼起發(fā)出;接收方接收數據的同時(shí)進(jìn)行循環(huán)冗余碼的計算,并將計算結果與來(lái)自發(fā)送方的校驗碼相比較,如不相同表示傳輸過(guò)程中出現了錯誤,接收方必須通知發(fā)送方再次發(fā)送該組數據。
假設要傳輸64位數據(最后8位是校驗碼),并使用多項式x8+x5+x4+1來(lái)產(chǎn)生8位循環(huán)冗余校驗碼(以下簡(jiǎn)稱(chēng)CRC碼)。其邏輯結構可用異或門(mén)和移位寄存器表示,如圖1所示。寄存器的值即為輸入數據的CRC碼。首先來(lái)輸入數據與最低位的異或值,如為“0”,只需將當前CRC碼邏輯右移1位(首位補零),即可得到新CRC碼;如為“1”,則將當前CRC碼與18H異或,再循環(huán)右移1位即可。該校驗碼有以下特點(diǎn):①當輸入的8位數據(低位在前)與當前 CRC碼相同時(shí),輸出的CRC碼將是零。因此,當包含8位CRC碼的全部64位數據輸入后,輸出的CRC碼應為零。②只要有非零位即可判決傳輸錯誤,而必復雜的校驗技術(shù)。
2 用匯編語(yǔ)言產(chǎn)生循環(huán)冗長(cháng)余校驗碼
在8051單片機上,由以下代碼可得8位CRC碼(存于變量CRC中),8位輸入數據暫存于A(yíng)CC中。
DO_CRC:PUSH ACC ;保存輸入數據
PUSH B ;保存B寄存器
PUSH ACC ;再次保存
MOV B,#8 ;共有8位數據
CRC_LOOP:XRL A,CRC
RRC A ;將最低位與輸入數據的異或值放入進(jìn)位標志中
MOV A,CRC
JNC ZERO
XRL A,#18H;當前CRC碼與18H異或
ZERO: RRC A ;右移1位
MOV CRC,A ;保存新CRC碼
POP ACC
RR A ;取出輸入數據的第2位
PUSH ACC
DJNZ B,CRC_LOOP ;循環(huán)
POP ACC
POP B
POP ACC ;恢復各寄存器
RET
上述程序對每一位輸入數據都要執行一系列操作,運算量很大,但內存占用少,適合于內存緊張的情況。當內存充裕時(shí),可以使用效率更高的查表法。
3 用查表法求CRC碼
將輸入數據按字節分開(kāi),每字節值在0~255之間。令當前CRC碼為00H,當分別輸入0~255時(shí),得到256個(gè)CRC碼。將它們順序排列就構成了循環(huán)冗余校驗碼表。用當前CRC碼與輸入字節異或后的值作為下標,查表即可求出新CRC碼。下例中,crc存放CRC碼,ACC存放輸入字節, crc_table為循環(huán)冗余校驗表的入口地址。代碼如下:
XRL A,crc ;當前CRC碼與輸入數據異或
PUSH DPH
PUSH DPL ;保存數據指針
MOV DPTR #crc_table
MOVC A,@A+DPTR;查表
MOV crc,A
POP DPL
POP DPH ;恢復數據指針
RET
crc_table:
DB 00H,5EH,BCH,E2H,61H,3FH,DDH,83H
DB C2H,9CH,7EH,20H,A3H,FDH,1FH,41H
DB 9DH,C3H,21H,7FH,FCH,A2H,40H,1EH
……
評論