用組合語言實現BCH解碼校驗演算法

2021-04-03 02:08:29 字數 3299 閱讀 6005

資料傳輸通訊中,常常因傳輸差錯造成誤碼錯碼,尤其在無線通訊中,空中的突發或隨機干擾雜訊會造成編碼差錯。為了提高傳輸的正確率,往往採用一些校驗方法,以檢驗糾正傳輸差錯。通訊中校驗的方法很多,其中的bch編碼有其獨特的優點:不僅可以檢糾突發差錯,還能檢糾隨機差錯,被廣泛地採用在微機級的通訊中。但對更低層的微控制器級的資料傳輸通訊糾錯,往往採用奇偶校驗等簡單的校驗方法。bch校驗因其演算法複雜,尤其是動態實時的無線通訊中,微控制器的通訊往往無法採用bch解碼檢糾。

1 bch碼結構

bch碼是一種檢糾能力較強的迴圈碼。它由資訊多項式m(x)和校驗多項式j(x)組成,如以t(x)表示整個bch(31:21)碼字的31位碼組多項式,則:

t(x)=m(x)+j(x)   (1)

在31位bch碼的後面再加上1位,以保證整個碼字32位中「1」的個數為偶數。該位稱偶校驗位。這樣就形成bch(31:21)加1位偶校驗位的標準碼字,其結構為:

其中校驗多項式j(x)由公式(2)計算:

x0x1……x20

x21……x30

x31t(x)

j(x)

偶校驗位

j(x)=m(x)/s(x)    (2)

式中s(x)是bch(31:21)碼的生成多項式,見式(3):

生成多項式s(x)的值在bch(31:21)碼的值是固定的。

bch碼是一種迴圈碼,迴圈碼是利用除法來糾錯的。由於任一碼組多項式t(x)都能被生成多項式s(x)整除,所以在接收端可以將接收碼組r(x)用s(x)去除。若在傳輸中未發生錯誤,接收碼與傳送碼相同,即r(x)=t(x),故接收碼組r(x)必定能被生成多項式s(x)整除;若碼組在傳輸中發生錯誤,即r(x)≠t(x),r(x)被s(x)除時,可能除不盡而有餘項y(x),因此,可根據餘項是否為零來判斷碼中有無錯誤(檢錯),如有餘項,通過一定的運算就可以確定錯誤位置,從而加以糾正(糾錯)。

這裡r(x)被s(x)除,是32位被11除,這在非實時靜態的微機級實現非常簡單;但在實時的、動態的、微控制器級的通訊中實現要快速巧妙的演算法才能實現,否則,現有的碼未檢錯及糾錯完畢,下乙個碼已經到了。因為動態中位和位的時距t往往只有幾十μs,以9.6b/s的簡訊為例,t=104μs。在這104μs中要完成檢錯、定位和糾錯三個演算法程式,才是乙個完整的解碼檢糾過程。

2 檢錯

根據上述原理,檢錯過程也就是求算r(x)被s(x)除的餘項y(x)的過程,如餘項y(x)=0,則r(x)=t(x),傳輸無差錯;如餘項y(x)≠0,則r(x)≠t(x),檢出傳輸差錯。

在演算法語言中,所有的運算總歸於二種運算:加和減。這是電子計算機的二進位制基本電路特性所決定的,也是組合語言唯一的算術運算方法。為此,這裡把除法用模二加法再加右移位實現。

已知:s(x)=11101101001

r(x)=r3r4r5r6 (ri為8位暫存器)

呼叫下面的模二加法右移子程式,得到r(x)/s(x)的餘項y(x)=r3r4。

;32位/16位模二加法右移子程式

m2add:mov r7,#00

m2ddgx:mov a,r3

xrl a,#0edh ;s(x)的高位=oed(h)

mov r3a

mov a,r4

cpl acc.5 ;s(x)的低3位=001(b)

mov r4,a

mov a,r3

acc7e10:jb acc.7m2addgx ;r(x)的最高位為「0」,則r(x)右移

mov a,r6

rlc a

mov r6,a

mov a,r5

rlc a

mov r5,a

mov a,r4

rlc a

mov r4,a

mov a,r3

rlc a

mov r3,a

mov r7

cjne r7,#10h,acc7e10 ;右移總次數為16次

ret餘項y(x)的高8位在r3暫存器中,低3位在r4的高3位。

3 定位

如果y(x)=r3r4≠0,表示接收到的碼組r(x)有差錯,下一步則由y(x)的值推算差錯在r(x)中的位置。

理論上要找出r(x)中差錯的位置,必須計算出差錯校驗子c(x)。在實踐中,校驗子c(x)的計算不僅費時間,而且多位檢糾還需多個校驗子c(x)。為此,經過幾年的實踐,把y(x)(即r3r4)直接作為綜合校驗子,通過快速查表找到差錯位置。查詢程式的大小和檢糾差錯位數有關,這裡以檢糾4位差錯為例,說明定位糾錯的方法。

;4位差錯位址查詢子程式

bitposi:mov b,0 ;對r(x)高位至低位的移動計數

mov r2,#1fh ;設**長度

bto a: mov a,b

inc b

acall tabsub ;呼叫**子程式,讀入**值

clr c

subb a,r3 ;y(x)中的r3 和**值比較

jnz binc1 :不相等,轉出

mov a,b ;相等,繼續

acall tabsub

clrsubb a,r4 ;y(x)中的r4和**值比較

jnz r2decl:不相等,轉出

setb f0 ;相等,置標誌位返回

retbincl:inc b

r2decl:djnz r2,btoa

ret ;**查畢,沒有相等的值,不置標誌位返回

從查詢子程式返回的b暫存器的值,即為差錯在r(x)中從高位到低位的位數值。

;4位差錯**子程式

tabsub:inc a

movc a,@a+pc;將相對位置的**送入a暫存器

retdb 0ebh ;**開始,長度為查詢子程式中

db 00 ;r2暫存器的預置值

db 76h..

.4 糾錯

找到了差錯在r(x)位置,就可以糾錯了。

糾錯的原理比較簡單,因為微控制器處理的是二進位制數,而二進位制數只有二個狀態,即不是「0」就是「1」。也就是說,r(x)中差錯位是「0」,則改為「1」;差錯位是「1」,則改為「0」。所以糾錯要對所在位求反就行了.

至此,整個檢錯、定位、糾錯的bch碼校驗檢糾過程結束。bch碼校驗演算法,經過實踐的檢驗,不失為微控制器級的資料傳輸校驗好演算法。這種方法可以對多位隨機差錯和多位突發差錯進行檢驗和糾錯,具體位數的多少僅受微控制器工作頻率的限制,而不受方法的限制。

用組合語言實現在210實現流水燈

用組合語言實現在210實現流水燈 參考朱有鵬arm裸機程式設計 1 makefile的解釋 1 首先簡單的解釋一下這個的makefile 目標檔案 led.bin 依賴的檔案led.o 也就是led.bin不存在的時候,或者led.o更新的時候,會執行這個makefile 那麼就執行後面的命令 第二...

組合語言實現階乘

static int fact int n return fact n 1 n public static void main string args 開始遞迴函式呼叫 addiu sp,0,0x10010080 初始化棧位址 壓棧入參 addiu s0,0,5 n 5 sw s0,0 sp n 5...

用組合語言實現氣泡排序 基於MIPS指令系統

這是計組第乙個小實驗,實現從鍵盤輸入十個數字,並把它們按從大到小排序輸出。氣泡排序流程圖 c語言實現氣泡排序 void swap int a,int k void sort int a,int n data sortarray space 40 separate asciiz line asciiz...