趙旦峰1,朱鐵林1,劉 淵
(1.哈爾濱工程大學(xué) 信息與通信工程學(xué)院,哈爾濱 150001;2.西北工業(yè)大學(xué) 電子信息學(xué)院,西安 710129)
1993年,在瑞士日內(nèi)瓦召開(kāi)的國(guó)際通信會(huì)議上,C.Berrou等人提出了一種新型的信道編碼方案——Turbo碼[1]。經(jīng)過(guò)近20年的研究與發(fā)展,Turbo碼已廣泛應(yīng)用于深空通信、移動(dòng)通信[2]等各個(gè)領(lǐng)域。然而,傳統(tǒng)編譯碼器的硬件設(shè)計(jì)都是根據(jù)仿真結(jié)果選擇單一的參數(shù)進(jìn)行固化設(shè)計(jì)[3],指標(biāo)變化時(shí)則需要對(duì)程序進(jìn)行大幅度修改及重新配置,甚至更換系統(tǒng)方案,缺乏通用性。因此,如何在不同的應(yīng)用場(chǎng)合,根據(jù)系統(tǒng)對(duì)信息可靠性和數(shù)據(jù)實(shí)時(shí)性不同的指標(biāo)要求,由用戶對(duì)兩者進(jìn)行靈活地折衷選擇以適應(yīng)不同目標(biāo)背景具有重要的現(xiàn)實(shí)意義。
Turbo碼的誤碼性能和延時(shí)在很大程度上取決于信息幀長(zhǎng),幀長(zhǎng)越長(zhǎng),譯碼性能越好,隨之而來(lái)的是譯碼延時(shí)的增大。因此,設(shè)計(jì)一種幀長(zhǎng)可配置的Turbo碼編譯碼方案,使譯碼延時(shí)與譯碼性能在不同信道環(huán)境下均能達(dá)到最佳平衡,具有廣泛的應(yīng)用價(jià)值。
基于此,本文將二次置換多項(xiàng)式(QPP)交織器集成于FPGA內(nèi)部,在系統(tǒng)初始化時(shí)計(jì)算交織地址、映射交織圖樣;同時(shí),對(duì)數(shù)據(jù)存儲(chǔ)模塊進(jìn)行深度可調(diào)設(shè)計(jì),并將編譯碼電路中涉及到幀長(zhǎng)參數(shù)的變量連接于IO電路,由用戶自行輸入,完成了一種幀長(zhǎng)可配置的Turbo碼編譯碼器的硬件方案,為其專用集成芯片的開(kāi)發(fā)與改進(jìn)提供了參考。
Turbo碼譯碼過(guò)程中需要多次循環(huán)迭代運(yùn)算(一般為4~8次),每次迭代都需要對(duì)整幀信息進(jìn)行軟輸入軟輸出(SISO)算法處理,每增加1 bit,就會(huì)增加相應(yīng)的運(yùn)算時(shí)延,因此幀長(zhǎng)對(duì)系統(tǒng)吞吐率有重要影響。同時(shí),由于幀長(zhǎng)直接關(guān)乎到交織后信息的漢明距離和碼重分布[4],從而影響碼字抗突發(fā)錯(cuò)誤的能力,因此幀長(zhǎng)也是影響譯碼性能的關(guān)鍵因素之一。
幀長(zhǎng)可配置Turbo編譯碼器的設(shè)計(jì)思想是:在編譯碼之前,首先由鍵盤(pán)電路輸入幀長(zhǎng)等參數(shù),系統(tǒng)根據(jù)指標(biāo)要求對(duì)編譯碼器進(jìn)行初始化,該過(guò)程主要是設(shè)置電路中存儲(chǔ)器的深度,進(jìn)行交織地址的計(jì)算、映射,并通過(guò)顯示設(shè)備輸出狀態(tài)信號(hào);初始化過(guò)程結(jié)束后,編譯碼器進(jìn)入準(zhǔn)備狀態(tài),一旦有數(shù)據(jù)輸入,即啟動(dòng)編譯碼流程。由此得到Turbo編譯碼器系統(tǒng)框圖如圖1所示。
圖1 改進(jìn)的Turbo碼編譯碼系統(tǒng)框圖
圖1的Turbo碼編譯碼器中,所有有關(guān)信息長(zhǎng)度的參數(shù)均設(shè)置為輸入變量,包括存儲(chǔ)器深度、計(jì)數(shù)器周期、狀態(tài)機(jī)控制等。根據(jù)系統(tǒng)框圖,接下來(lái)進(jìn)行模塊化設(shè)計(jì)。
(1)
交織地址Π(i)由如下公式計(jì)算得到:
Π(i)=(f1i+f2i2)modK
(2)
式中,參數(shù)f1和f2取決于交織長(zhǎng)度K,具體值可參考文獻(xiàn)[2]。
傳統(tǒng)交織器的FPGA設(shè)計(jì)一般采用軟件編程(C語(yǔ)言)的方法,根據(jù)通信協(xié)議,將系統(tǒng)所需幀長(zhǎng)的交織圖樣預(yù)先計(jì)算出來(lái),生成存儲(chǔ)器初始化文件載入到ROM中[5]。這樣雖然降低了硬件復(fù)雜度,卻不能自行配置編碼幀長(zhǎng),缺乏靈活性和通用性。因此,設(shè)計(jì)中將交織算法集成于FPGA內(nèi)部,幀長(zhǎng)改變時(shí)啟動(dòng)交織器重新計(jì)算交織地址存儲(chǔ)于RAM中。因?yàn)椴⒉皇敲繋畔⒕幾g碼時(shí)都需要運(yùn)行交織算法模塊,只是在初始化階段載入交織地址,使交織算法與編譯碼器分時(shí)工作,在編譯碼交織時(shí)只需讀雙口RAM即可,不會(huì)增加譯碼延時(shí)。QPP交織器的硬件結(jié)構(gòu)框圖如圖2所示。
圖2 QPP交織器的硬件結(jié)構(gòu)框圖
在編譯碼器初始化階段,首先從外部輸入信息幀長(zhǎng)K,經(jīng)過(guò)防抖動(dòng)處理,由幀長(zhǎng)采集電路傳送到f1、f2運(yùn)算單元,查表得到f1、f2的值,提供給交織運(yùn)算模塊。
交織算法集成單元是交織器設(shè)計(jì)的核心單元。主要功能是根據(jù)LTE協(xié)議標(biāo)準(zhǔn)以及參數(shù)K、f1、f2,在時(shí)序控制模塊的約束下,計(jì)算交織地址。
計(jì)算中涉及到FPGA不支持的對(duì)任意整數(shù)取余的操作,均轉(zhuǎn)化為固定次數(shù)的加減循環(huán)操作,采取小時(shí)鐘計(jì)算、大時(shí)鐘輸出的措施,保證交織數(shù)據(jù)的正確讀取。
計(jì)算交織地址的同時(shí)產(chǎn)生寫(xiě)入地址,將交織地址順序存儲(chǔ)到雙口RAM中,由此完成了交織器的主體設(shè)計(jì)。整個(gè)交織計(jì)算過(guò)程是在時(shí)序控制模塊下有條不紊地管理運(yùn)行的。隨后發(fā)送握手信號(hào),可以開(kāi)始Turbo碼編譯碼流程。調(diào)用交織器模塊時(shí)只需將順序地址輸入到雙口RAM的讀地址端,便能得到既定的偽隨機(jī)交織地址。Turbo碼編譯碼器中交織、解交織的實(shí)現(xiàn)流程框圖如圖3所示。
圖3 交織、解交織工作原理框圖
圖3中時(shí)序控制模塊的管理下,讀/寫(xiě)地址產(chǎn)生器產(chǎn)生順序地址,將信息序列順序?qū)懭氲綌?shù)據(jù)存儲(chǔ)雙口RAM中,同時(shí)用此順序地址去訪問(wèn)存儲(chǔ)有交織地址的雙口RAM,將此雙口RAM的輸出作為數(shù)據(jù)存儲(chǔ)雙口RAM的讀地址,將信息序列按照交織地址讀出,即得到交織后信息序列,完成數(shù)據(jù)的交織[6]。
而解交織為交織的逆過(guò)程,即先將交織后信息序列按照交織地址寫(xiě)入雙口RAM中,然后按照順序地址將數(shù)據(jù)讀出,即得到原始信息序列,完成數(shù)據(jù)的解交織。
Turbo碼編碼器由遞歸系統(tǒng)卷積碼(RSC)子編碼器、交織器、復(fù)接電路等構(gòu)成,實(shí)現(xiàn)框圖如圖4所示。
圖4 Turbo碼編碼器實(shí)現(xiàn)結(jié)構(gòu)圖
圖4中,系統(tǒng)初始化完畢后,交織器已存儲(chǔ)有對(duì)應(yīng)幀長(zhǎng)的交織圖樣,編碼器首先接收到一幀信息存儲(chǔ)于RAM中,開(kāi)始信號(hào)啟動(dòng)編碼過(guò)程。在時(shí)鐘管理模塊和時(shí)序控制模塊的指引下,計(jì)數(shù)器產(chǎn)生順序地址,再以此順序地址訪問(wèn)交織器得到交織地址,分別以順序地址和交織地址從存儲(chǔ)有信息序列的RAM中讀取數(shù)據(jù)進(jìn)入對(duì)應(yīng)的RSC進(jìn)行編碼,同時(shí)復(fù)接電路對(duì)信息位和校驗(yàn)位進(jìn)行串并轉(zhuǎn)換,一幀信息編碼完畢對(duì)子編碼器做歸零處理。編碼器的工作流程圖如圖5所示。
圖5 Turbo碼編碼器工作流程
圖5中,編碼器默認(rèn)處于空閑狀態(tài)(IDLE),信息存儲(chǔ)結(jié)束后,開(kāi)始信號(hào)(start)啟動(dòng)編碼器進(jìn)入CODE(交織、編碼、復(fù)接)狀態(tài),當(dāng)一幀信息編碼完畢(cover=1)分別對(duì)兩個(gè)子編碼器進(jìn)行歸零處理(TAIL、TAIL2狀態(tài)),歸零結(jié)束后返回IDLE狀態(tài),等待下一幀信息數(shù)據(jù)的到來(lái)。
根據(jù)譯碼原理和交織器實(shí)現(xiàn)方式,得到譯碼器實(shí)現(xiàn)結(jié)構(gòu)圖如圖6所示。
圖6 Turbo碼譯碼器結(jié)構(gòu)圖
圖6中,為節(jié)省硬件資源,采用子譯碼器單核復(fù)用的結(jié)構(gòu)模式。當(dāng)子譯碼器模塊作為子譯碼器1時(shí),信息比特ys順序?qū)懭氪鎯?chǔ)器后順序讀出到子譯碼器中,L-a2以交織地址寫(xiě)入存儲(chǔ)器,順序地址讀出作為子譯碼器1的先驗(yàn)信息,同時(shí)校驗(yàn)位選擇yp1,子譯碼器1根據(jù)3個(gè)輸入進(jìn)行軟輸入軟輸出(SISO)譯碼運(yùn)算,得到新的L-a2及L-e;此后子譯碼器作為子譯碼器2,以交織地址將ys從存儲(chǔ)器中讀出,L-a2以順序地址寫(xiě)入存儲(chǔ)器,交織地址讀出作為子譯碼器2的先驗(yàn)信息,同時(shí)校驗(yàn)位選擇yp2,子譯碼器2根據(jù)3個(gè)輸入進(jìn)行SISO譯碼運(yùn)算,得到新的L-a2及L-e,完成一次迭代。在達(dá)到指定的迭代次數(shù)后,將L-e解交織后進(jìn)行硬判決,得到譯碼序列。設(shè)計(jì)中,子譯碼器采用復(fù)雜度與性能折衷的Max-Log-MAP譯碼算法,計(jì)算過(guò)程如下:根據(jù)輸入的信息位、校驗(yàn)位及先驗(yàn)信息的軟信息,在時(shí)序控制模塊的管理下,分別進(jìn)行分支轉(zhuǎn)移度量、前向狀態(tài)度量、后向狀態(tài)度量和對(duì)數(shù)似然比的計(jì)算及存儲(chǔ),以備下次譯碼運(yùn)算調(diào)用。
在Xilinx ISE開(kāi)發(fā)工具上,用Verilog HDL語(yǔ)言對(duì)上述各功能模塊進(jìn)行編程描述;在對(duì)整體系統(tǒng)進(jìn)行時(shí)序設(shè)計(jì)及算法優(yōu)化的基礎(chǔ)上,用ModelSim SE 6.2a進(jìn)行布局布線后仿真。
編譯碼系統(tǒng)初始化時(shí),可配置幀長(zhǎng)QPP交織器的時(shí)序仿真圖如圖7所示。
圖7 幀長(zhǎng)128的交織圖樣波形圖
圖7為輸入幀長(zhǎng)K=128時(shí),交織模塊輸出的交織地址波形圖。在每個(gè)大周期內(nèi)將交織地址計(jì)算出來(lái)并在每個(gè)大時(shí)鐘周期的最后一個(gè)小時(shí)鐘周期將此交織地址寫(xiě)入雙口RAM,完成交織模塊的設(shè)計(jì)。
交織器通過(guò)驗(yàn)證后,對(duì)Turbo碼編碼器進(jìn)行時(shí)序仿真,得到仿真波形圖如圖8所示。
圖8 Turbo碼編碼器仿真波形圖
圖8中,幀長(zhǎng)設(shè)置為512,由于沒(méi)有刪余,每輸入1個(gè)信息位,對(duì)應(yīng)輸出3位系統(tǒng)碼字。經(jīng)多次驗(yàn)證,與Matlab仿真數(shù)據(jù)進(jìn)行對(duì)比,結(jié)果正確。
將編碼碼字量化后傳遞給譯碼器,譯碼迭代6次,幀長(zhǎng)設(shè)置為512,得到Turbo碼譯碼器時(shí)序仿真波形圖如圖9所示。
圖9 Turbo碼譯碼器波形仿真圖
圖9中,譯碼器首先根據(jù)幀長(zhǎng)設(shè)置初始化交織圖樣,然后對(duì)系統(tǒng)碼字解復(fù)接,得到信息序列(ys)、校驗(yàn)位1(yp1)、校驗(yàn)位2(yp2),與外信息(L-all)一起輸入子譯碼器進(jìn)行SISO譯碼運(yùn)算,迭代6次后判決得到譯碼結(jié)果(decoderout)。多次仿真無(wú)誤后,將程序下載配置到Xilinx公司Virtex-2 Pro系列的XC2VP30 FPGA中,利用串口調(diào)試助手,軟件編寫(xiě)測(cè)試窗口,進(jìn)行測(cè)試。結(jié)果顯示,本設(shè)計(jì)可以利用外圍鍵盤(pán)電路自行輸入幀長(zhǎng),進(jìn)行交織運(yùn)算,得到交織圖樣,并能依據(jù)幀長(zhǎng)參數(shù)正確實(shí)現(xiàn)Turbo編譯碼功能,達(dá)到了設(shè)計(jì)要求。
本文提出并實(shí)現(xiàn)了一種可根據(jù)具體參數(shù)要求現(xiàn)場(chǎng)配置幀長(zhǎng)的Turbo編譯碼器設(shè)計(jì)方案,與固定幀長(zhǎng)系統(tǒng)相比,具有更強(qiáng)的靈活性,是一種比較理想的通用型方案。然而由于FPGA自身特點(diǎn)的限制,即使選擇算法相對(duì)簡(jiǎn)單的QPP交織方式,當(dāng)信息幀長(zhǎng)6 144時(shí)交織地址初始化過(guò)程仍耗時(shí)將近40 s,雖然不對(duì)后續(xù)編譯碼速率產(chǎn)生影響,但是如何有效縮短初始化時(shí)間,根據(jù)算法特點(diǎn)簡(jiǎn)化交織運(yùn)算電路仍有待進(jìn)一步研究。
參考文獻(xiàn):
[1] Berrou C,Glavieux A, Thitimajshima P. Near Shannon Limit Error-Correcting Coding and Decoding Turbo-Codes[C]//Proceedings of ICC’93.Geneva:IEEE,1993:1064-1070.
[2] 沈嘉,索士強(qiáng),全海洋,等. 3GPP長(zhǎng)期演進(jìn)(LTE)技術(shù)原理與系統(tǒng)設(shè)計(jì)[M].北京:人民郵電出版社,2009:92-96.
SHEN Jia,SUO Shi-qiang,QUAN Hai-yang,et al.3GPP Long Term Evolution:Principle and System Design[M].Beijing:Posts & Telecom Press,2009:92-96.(in Chinese)
[3] 羅綺麗, 劉應(yīng)狀, 蕭奮洛. 一種高效的Turbo碼硬件實(shí)現(xiàn)算法[J]. 電訊技術(shù), 2006,46(4): 36-40.
LUO Qi-li, LIU Ying-zhuang, XIAO Fen-luo. A High Efficient Implementation Algorithm for Decoding Turbo Codes[J].Telecommunication Engineering,2006,46(4): 36-40.(in Chinese)
[4] 劉東華. Turbo碼原理與應(yīng)用技術(shù)[M]. 北京: 電子工業(yè)出版社, 2004: 236-238.
LIU Dong-hua. Principle and Application Technology of Turbo Code[M]. Beijing: Publishing House of Electronics Industry, 2004: 236-238. (in Chinese)
[5] 薛禮妮, 崔維新. Turbo碼隨機(jī)交織器的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電訊技術(shù), 2009, 49(10): 70-73.
XUE Li-ni, CUI Wei-xin. Design and Implementation of Turbo Codes Random Interleaver[J]. Telecommunication Engineering, 2009, 49(10): 70-73. (in Chinese)
[6] 羅清華. Turbo碼編譯碼器FPGA設(shè)計(jì)與實(shí)現(xiàn)[D]. 哈爾濱: 哈爾濱工程大學(xué), 2008: 36-37.
LUO Qing-hua. The design and Implementation of Turbo Encoder and Decoder Based on FPGA[D]. Harbin: Harbin Engineering University, 2008: 36-37. (in Chinese)