咸陽職業(yè)技術學院 史亞維 楊 斌
Turbo乘積碼編碼器的FPGA設計與實現
咸陽職業(yè)技術學院 史亞維 楊 斌
Turbo乘積碼(Turbo Product Codes)是一種先進的前向糾錯(FEC,Forward Error Correction)信道編碼,糾錯性能好,編碼效率高,同時由于其編碼構造采用了線性分組碼,所以譯碼方法簡單,實現復雜度低。本文對Turbo乘積碼編碼技術進行了研究,給出了編碼器的FPGA設計實現方案,該編碼器的設計在Xilinx公司Virtex-II系列的FPGA平臺上進行了實驗驗證。實驗結果表明,本設計的編碼器滿足預期指標要求。
Turbo編碼;前向糾錯碼;FPGA
隨著微電子技術、通信技術和計算機技術的發(fā)展,新的通信業(yè)務和信息業(yè)務不斷涌現,用戶對信息傳輸的質量要求不斷提高。由于通信信道固有的噪聲和衰落特性,或者存在存儲媒介的缺陷等原因,信號在信道傳輸(或存/?。┻^程中,必然會受到影響從而產生失真。因此通常需要采用差錯控制編碼技術來檢測和糾正失真引起的傳輸錯誤。Turbo乘積碼是一種先進的前向糾錯信道編碼,糾錯性能好,編碼效率高,同時由于其編碼構造采用了線性分組碼,所以譯碼方法簡單,實現復雜度低。因此本文主要介紹Turbo乘積碼的編碼器技術,提出了一種編碼器的FPGA設計實現方案。
按照構成碼子碼種類的不同,Turbo乘積碼可分為Reed Solomon乘積碼,BCH乘積碼,加了一個奇偶校驗比特后構成的擴展Hamming乘積碼以及單一的奇偶校驗乘積碼。乘積碼由一系列多維的(n,k)分組碼構成,在二維或三維空間使用不同長度的碼可得到不同的碼率。為了降低譯碼復雜度,Turbo乘積碼通常由擴展?jié)h明碼、奇偶校驗碼或它們的組合構成。
一般而言,如果考慮兩個系統(tǒng)線性分組碼c1= (n1,k1,d1),c2=(n2,k2,d2)如圖1所示,這里ni,ki,di(i= 1 ,2)分別表示碼長,信息比特數和最小漢明距離。二維TPC編碼c=c1?c2可如下獲得:
1)把(k1×k2)信息比特放入一矩陣中;
2)使用行編碼器c1對k2行進行編碼,產生行校驗位,得到k2行、n1列的矩陣;
3)使用列編碼器c2對n1列進行編碼,產生列校驗位,得到n2行、n1列的矩陣。
以上步驟2)和3)不能同時進行,因此這樣的編碼過程屬串行級聯方式。這樣得到二維Turbo乘積碼的參數為:n=n1×n2,k=k1×k2,d=d1×d2。碼率為R=R1×R2,這里Ri是碼ci的碼率,Ri=ki/ni。為了降低編碼器和譯碼器的復雜度,通常令c1=c2。
圖2所示是Turbo碼編碼器的結構,Turbo碼編碼器通過交織器把兩個遞歸系統(tǒng)卷積碼并行級聯,這兩個分量碼編碼器結構相同,編碼器的輸出端包括信息位和兩個校驗位,首先把輸入碼流kD劃分為長度為N的數據信息塊,送給每個編碼器。第一個編碼器產生N比特的校驗碼流1kY;第二個編碼器也處理同樣的信息數據,但要經過一個具有固定交織方式的交織器的擾序,也生成N比特的校驗碼流2kY。Turbo編碼器把原始信息數據碼流kD和校驗碼流Y1k、Y2k一起傳送,經過復用器調制后,生成了Turbo碼序列X。為了提高碼率,校驗碼流Y1k、Y2k需要經過刪余器,采用刪余技術從這兩個校驗序列中周期地刪除一些校驗位,形成校驗位序列X。
為了實現實時編碼,根據編碼數據流向為單向性的特點,本設計采用流水線結構。整個編碼器分成三部分,第一部分為輸入數據緩存,第二部分為編碼,第三部分為輸出數據緩存。這種設計結構可以使數據接收、數據編碼和數據輸出三部分流水進行,從而大大提高了編碼速率。按照上述的設計結構,對TPC編碼器的FPGA設計實現進行模塊的劃分。原理框圖如圖3所示。
行編碼模塊和列編碼模塊基本相同,因此放在一起介紹。行/列編碼模塊又劃分為三個子模塊來完成編碼功能,其子模塊框圖如圖4所示。
從FIFO或者RAM中把要進行編碼的串行數據讀出,轉換成57bits的并行數據,擴展?jié)h明碼編碼模塊對輸入的57比特數據進行擴張漢明碼編碼,加上校驗位后為64比特。然后再經過并串轉換為串行數據存入緩存中,為下一步編碼或編碼輸出做好準備。
其中,串并/并串轉換可以通過移位寄存器來實現,按照相應的時鐘節(jié)拍,每輸入一位數據進行相應的移位。串并轉換實現的Verilog代碼為:
并串轉換實現的Verilog代碼為:
擴展?jié)h明碼編碼模塊把并串轉換后57位寬的并行數據,按照擴展?jié)h明碼的編碼規(guī)則,在高位添加7個校驗比特,輸出數據位64位寬的并行數據,每一組數據代表一個擴展?jié)h明碼組。按照擴展?jié)h明碼的編碼規(guī)則,其核心部分的Verilog代碼如下所示:
其中,data_out[63]為所有前63位的奇偶校驗,data_out[62:57]為漢明碼校驗,data_out[56:0]為原始數據。
在編碼過程中要先進行行編碼再進行列編碼,中間必須進過行列的交織。本項目中行列交織采用雙端口RAM實現,行列交織時存在RAM地址的跳變,在設計時采用兩個計數器實現,設兩個計數器分別為i[5:0]、j[5:0],則可按照以下公式計算跳變的列地址:
不難發(fā)現,64=26,由于其特殊性,公式的乘法實現也相對比較簡單,用Verilog語言可以描述為:
使用這樣的方法就很好地解決了編碼過程中的行列交織問題,亦即先進行行編碼再進行列編碼的問題。
本文采用可編程邏輯器件FPGA實現了一種先進的前向糾錯編碼Turbo乘積碼的編碼,使用Verilog硬件描述語言完成了編碼器的設計工作,在Xilinx FPGA芯片上完成了編碼器的硬件驗證,從實驗結果可看出設計的編碼器滿足預期指標要求。
[1]劉東華編著.Turbo碼原理與應用技術[M].北京:電子工業(yè)出版社,2004,1.
[2]王新梅,肖國鎮(zhèn)編著.糾錯碼——原理與方法(修訂版)[M].西安:西安電子科技大學出版社,2001,4.
[3]田耘,徐文波,張延偉等編著.無線通信FPGA設計[M].北京:電子工業(yè)出版社,2008,2
[4]夏宇聞編著.Verilog數字系統(tǒng)設計教程(第2版)[M].北京:北京航空航天大學出版社,2008,6
史亞維(1982—),女,陜西咸陽人,碩士研究生,助教,現供職于咸陽職業(yè)技術學院,主要研究方向:FPGA和數字電路設計。