卷積碼是深度空間通信系統(tǒng)和無線通信系統(tǒng)中常用的一種差錯控制編碼。它克服了分組碼由于以碼塊為單位編譯碼而使分組間的相關(guān)信息丟失的缺點(diǎn)。(2,1,8)卷積碼在2G、3G通信系統(tǒng)中得到了廣泛的運(yùn)用。CDMA/IS-95系統(tǒng)的前向信道[3]、CDMA20001x的前反向鏈路都使用了生成多項(xiàng)式為(561,753)碼率為1/2的(2,1,8)卷積碼。針對目前卷積碼譯碼器占用資源較多,最高工作頻率較低的缺點(diǎn),本文設(shè)計了一種新的基于FPGA的(2,1,8)卷積碼譯碼器。該譯碼器工作頻率高,輸出時延小,占用資源少。
1? (2,1,8)卷積碼譯碼器的總體設(shè)計
本文所實(shí)現(xiàn)的(2,1,8)卷積碼譯碼器是基于維特比算法的硬判決譯碼器。整個系統(tǒng)分為啟動單元、中間處理單元、譯碼輸出單元3個單元模塊。系統(tǒng)總體結(jié)構(gòu)圖如圖1所示。對(2,1,8)卷積碼譯碼器,啟動單元處理的是前8個輸入的碼字,中間處理單元處理的是后續(xù)輸入的碼字。譯碼輸出單元實(shí)現(xiàn)對譯碼器譯出碼字的輸出。本設(shè)計中,各狀態(tài)節(jié)點(diǎn)的路徑度量和幸存路徑均采用FPGA片內(nèi)的寄存器作為存儲主體,即采用的是寄存器交換法。這樣譯碼輸出時不用回溯,能極大提高譯碼器的譯碼速率。
?
2? (2,1,8)卷積碼譯碼器各模塊設(shè)計
2.1 啟動單元模塊
?。?,1,8)卷積碼譯碼器共有256個狀態(tài)節(jié)點(diǎn)。在處理前8個輸入碼字中的第i(i為大于0且小于9的整數(shù))個碼字時,只需對其中的2i個狀態(tài)節(jié)點(diǎn)進(jìn)行處理,而且轉(zhuǎn)移至這2i個狀態(tài)節(jié)點(diǎn)的前一狀態(tài)節(jié)點(diǎn)都各僅有一個,其狀態(tài)轉(zhuǎn)移圖如圖2所示。因此并不需執(zhí)行比較和選擇操作。該單元的關(guān)鍵在于確定處理第i個碼元時,需對哪些狀態(tài)節(jié)點(diǎn)的幸存路徑和路徑度量值更新。經(jīng)分析可知:在第i個碼元處理結(jié)束后。當(dāng)且僅當(dāng)某節(jié)點(diǎn)對應(yīng)的狀態(tài)值的二進(jìn)制形式的低(8-k)位比特均為0,譯碼器才可能到達(dá)該狀態(tài)節(jié)點(diǎn)。據(jù)此本文設(shè)計了如下的一種巧妙方法確定某狀態(tài)節(jié)點(diǎn)是否能到達(dá)。設(shè)置一個8bit位寬的寄存器型變量sd0。其初始值置為0x7f,即將其最高位置為0,每處理完一個碼元,就將sd0右移一位,在判斷狀態(tài)值為i的節(jié)點(diǎn)是否需要處理時,將sd0與i進(jìn)行按位與運(yùn)算,若其結(jié)果為0,則該狀態(tài)節(jié)點(diǎn)需被處理,否則,直接進(jìn)入對下一狀態(tài)節(jié)點(diǎn)的判斷處理。
?
在計算各狀態(tài)節(jié)點(diǎn)的路徑度量BM時,本設(shè)計采取了如下方案。預(yù)先計算出(2,1,8)卷積碼的256個狀態(tài)在輸入為0時的編碼結(jié)果,并將其存儲在一個由256個位寬為2bit的寄存器組中。處理接收的卷積碼碼字時,首先計算出該碼字與(2,1,8)卷積碼的4個可能碼字00,01,10,11的不同的比特的位數(shù)。并分別存儲在對應(yīng)的4個2bit位寬的路徑度量寄存器l0,l1,l2,l3中。將狀態(tài)節(jié)點(diǎn)i和(i+128)的兩個路徑度量值分別記為BM0和BM1,節(jié)點(diǎn)i的BM0和BM1分別為編碼器處于狀態(tài)(2×i)和(2×i+1)且輸入為0時的輸出碼字與當(dāng)前時刻輸入碼字不同的比特數(shù)。節(jié)點(diǎn)(i+128)的BM0和BM1分別為編碼器處于狀態(tài)(2×i)和(2×i+1)且輸入為1時的輸出碼字與當(dāng)前時刻輸入碼字不同的比特數(shù)。且任何狀態(tài)節(jié)點(diǎn)的兩個路徑度量值BM0和BM1之和為2,據(jù)此就可得出各個狀態(tài)節(jié)點(diǎn)的BM0和BM1的值。
2.2 中間處理單元
中間處理單元的主體是加比選操作模塊。(2,1,8)卷積碼譯碼器處理完開始的8個碼元之后,其狀態(tài)轉(zhuǎn)移圖如圖3所示。此時,到達(dá)每個狀態(tài)節(jié)點(diǎn)的路徑有兩條,到達(dá)狀態(tài)節(jié)點(diǎn)i和i+128的兩條路徑分別來自節(jié)點(diǎn)2×i和2×i+1,其中i為小于128的自然數(shù)。對狀態(tài)i和i+128對應(yīng)節(jié)點(diǎn)的幸存路徑和路徑度量值的更新就是要比較節(jié)點(diǎn)2×i和2×i+1的在前一碼元處理結(jié)束后的路徑度量與它們轉(zhuǎn)移至狀態(tài)i和i+128時對應(yīng)的路徑度量之和,并取其中較小者。
?
該單元需解決的一個關(guān)鍵問題就是路徑度量的溢出問題。若不對該問題進(jìn)行處理,隨著譯碼序列長度的增加,將根據(jù)各狀態(tài)的路徑度量寄存器存儲值的大小判斷各狀態(tài)路徑度量的相對大小發(fā)生錯誤,從而使得譯碼出錯。經(jīng)過對(2,1,8)卷積碼譯碼器網(wǎng)格圖的研究發(fā)現(xiàn):硬判決時,256個狀態(tài)的路徑度量的最大值與最小值之差不會超過15,若用5比特位寬的寄存器型變量存儲各狀態(tài)的路徑度量,當(dāng)最大路徑度量值達(dá)到31即將溢出時,最小路徑度量值一定不小于16,此時將所有256個狀態(tài)節(jié)點(diǎn)的路徑度量值均減去16,這樣就解決了溢出問題。根據(jù)各狀態(tài)的路徑度量值的最高比特位是0還是1就可判斷其值是否大于等于16。
2.3 譯碼輸出單元
本設(shè)計譯碼輸出單元采取截短譯碼算法。即譯碼到達(dá)一定深度時,就開始輸出譯碼結(jié)果。該譯碼深度一般應(yīng)不小于5倍卷積碼的約束長度。本設(shè)計中譯碼深度取為45。譯碼輸出采用任意狀態(tài)判決準(zhǔn)則。每個時刻將全0狀態(tài)的幸存路徑的最高比特位移出作為譯碼器輸出。采用任意狀態(tài)判決準(zhǔn)則能降低硬件的復(fù)雜度。
3? 仿真結(jié)果及分析
采用EP1S20F484C5作為目標(biāo)器件,將譯碼器用Quartus2自帶的編譯器編譯綜合后的結(jié)果顯示:該譯碼器共占用了14226個邏輯單元LE,譯碼器的最高工作頻率可達(dá)102MHz,其輸出時延為47個時鐘周期。文獻(xiàn)[13]采用RAM作為幸存路徑的存儲主體實(shí)現(xiàn)的(2,1,8)卷積碼譯碼器,采用APEXEP20K200作為目標(biāo)芯片時,共使用了2200個邏輯單元,和16塊RAM,譯碼器最高僅可支持40MHz的時鐘,完成一步約束長度為9(256狀態(tài))的加、比、選操作需要132個時鐘周期。內(nèi)部的最高譯碼速度僅可達(dá)588kb/s。因此本設(shè)計僅用相對較少的硬件資源消耗換取了較大的譯碼速率的提高。
由糾錯編碼的理論可知,當(dāng)線性分組碼的碼字間的最小距離為dmin時,其最多能糾正[(dmin-1)/2]個比特的錯誤,運(yùn)算符[]表示不超過該數(shù)的最大整數(shù)。卷積碼中用自由最小距離df代替,生成多項(xiàng)式為(561,753)的(2,1,8)卷積碼的自由最小距離為df=12,因此其能糾正最多為5個比特的突發(fā)錯誤。
為驗(yàn)證所設(shè)計的卷積碼譯碼器的糾錯性能,首先基于有限狀態(tài)機(jī)設(shè)計了一個編碼器,當(dāng)其輸入為111111111111111100000000時,經(jīng)過一個時鐘周期的時延,編碼器輸出碼字為321201103333333301213223,將該序列的前5比特數(shù)據(jù)取反后作為譯碼器的輸入,其仿真結(jié)果如圖4所示。
?
由圖4中的仿真波形可看出:經(jīng)過47個時鐘周期的延遲之后,譯碼器糾正了輸入碼元5個比特的錯誤,正確譯出了信息碼字。從而說明該譯碼器設(shè)計正確。
4? 結(jié)語
本文基于FPGA技術(shù)設(shè)計了一種(2,1,8)卷積碼的硬判決維特比譯碼器。該譯碼器以FPGA片內(nèi)的寄存器作為路徑度量和幸存路徑的存儲單元,經(jīng)分析得出了路徑度量單元的最小位寬,有效降低了對芯片資源的消耗。采用截短譯碼算法,降低了硬件的復(fù)雜度。采取了一種巧妙的方法實(shí)現(xiàn)了譯碼器的啟動過程單元。綜合和仿真結(jié)果表明:該譯碼器用較少的硬件資源消耗就換取了極大的譯碼速度的提高。
評論
查看更多