基于FPGA的改進型分組交織器的設(shè)計與實現(xiàn)
Turbo碼是由法國人Berrou于1993年提出的一種性能優(yōu)越的信道編碼方案[1],其應(yīng)用已逐步推廣到衛(wèi)星通信、移動通信和計算機通信等領(lǐng)域。交織器作為Turbo碼編碼器中的重要組成部分,在Turbo碼的性能中起著至關(guān)重要的作用,因此交織器的設(shè)計成了Turbo碼設(shè)計中的一個重要方面,交織器的好壞將直接關(guān)系到整個Turbo碼系統(tǒng)的優(yōu)劣。
本文分析了交織器在Turbo碼中的作用,以及分組交織器[2]存在的缺陷,提出一種改進型的分組交織器,即交織深度和寬度可控的分組交織器的設(shè)計方法。該交織器可根據(jù)數(shù)字通信中信道的實際特性,做到交織矩陣深度和寬度可控,能夠更好的滿足不同幀長度數(shù)據(jù)傳輸?shù)囊?,從而達到最佳的抗突發(fā)連續(xù)錯誤的目的。
交織器設(shè)計采用Altera公司生產(chǎn)的Cyclone系列FPGA芯片,利用其內(nèi)部嵌入式存儲資源,用雙端口存儲器實現(xiàn)。
1 傳統(tǒng)分組交織器的作用、原理及缺陷
1.1 交織器的作用
在傳統(tǒng)信道編碼中,交織器的作用是將信源序列打亂,將它們分散到不同的數(shù)據(jù)序列中,以消除相鄰碼元之間的相關(guān)性。這樣,當信號經(jīng)歷衰落或突發(fā)干擾時,鄰近碼元被噪聲淹沒的可能性會大大降低,從而增強了抵御長時間突發(fā)噪聲的能力,同時也有利于接收端的譯碼接收。
另外,交織器作為Turbo碼編碼器中的重要組成部分,對提高Turbo碼的性能起著至關(guān)重要的作用。文獻[3]指出,Turbo碼作為線性碼,其糾錯譯碼性能主要由碼字的重量分布決定,而交織器實際上正是決定了Turbo碼的重量分布。所以,Turbo碼的性能很大程度上由交織器所決定。
1.2 分組交織器的原理
分組交織是一種簡單的交織方式,其原理是在發(fā)送端將待交織的輸入數(shù)據(jù)均勻分成m個碼組,每個碼組由n段數(shù)據(jù)組成,這樣便構(gòu)成一個n×m的交織矩陣,其中,m為交織深度,n為交織約束長度或?qū)挾?。待交織?shù)據(jù)以公式的順序進入交織矩陣,再以公式的順序從交織矩陣中送出,這樣就完成了對輸入數(shù)據(jù)的分組交織。
1.3 分組交織器存在的缺陷
分組交織器雖然具有原理簡單,易于硬件實現(xiàn)的特點。但其存在的主要缺點是由于交織矩陣的深度和寬度固定,不能夠根據(jù)信道(特別是變參信道)中突發(fā)誤碼長度、糾錯碼的約束長度、糾錯能力做出調(diào)整,這樣,信息序列中出現(xiàn)的突發(fā)錯誤就不能夠盡量隨機分布在數(shù)據(jù)幀內(nèi)。交織后,輸入至編碼器中的消息序列仍有很大的相關(guān)性。這就導(dǎo)致了Turbo碼譯碼器在相繼譯碼中不能正確的譯碼,會產(chǎn)生較高的譯碼錯誤。
基于以上原因,希望設(shè)計出交織矩陣深度和寬度可控的分組交織器,以適應(yīng)不同數(shù)據(jù)幀長度的需要。從而更好的適應(yīng)通信系統(tǒng)的特性要求,提高系統(tǒng)克服突發(fā)差錯的能力。
2 改進分組交織器的FPGA設(shè)計與實現(xiàn)
2.1 FPGA選取及總體實現(xiàn)
交織器的設(shè)計采用Altera公司生產(chǎn)的Cyclone系列FPGA實現(xiàn)。根據(jù)系統(tǒng)的總體要求選用了一片EP1C3T100C8芯片,該系列芯片具有成本低、設(shè)計靈活、系統(tǒng)便于集成等優(yōu)點[4],因而在數(shù)字通信系統(tǒng)設(shè)計中得到了廣泛的應(yīng)用。此外,Cyclone系列芯片內(nèi)部具有嵌入式RAM存儲空間,可以實現(xiàn)較為復(fù)雜的邏輯功能,當用作片內(nèi)存儲器時,其存儲數(shù)據(jù)的寬度和深度可由設(shè)計人員設(shè)定。因而利用存儲器可以方便的設(shè)計出交織器,從而能夠大大減小電路的體積和復(fù)雜度。
FPGA實現(xiàn)交織器的原理框圖如圖1所示,從圖中可以看出交織器主要由讀、寫地址序列發(fā)生器,雙端口RAM以及讀寫使能控制幾部分組成。其中讀寫使能控制主要用來產(chǎn)生雙端口RAM的讀寫控制信號,并決定讀、寫地址序列發(fā)生器何時啟動工作。
FPGA實現(xiàn)交織器的原理框圖
2.2 讀地址序列產(chǎn)生算法及設(shè)計
2.2.1 交織器讀地址產(chǎn)生算法
交織器設(shè)計的關(guān)鍵部分在于“讀/寫地址”的產(chǎn)生。設(shè)交織器的交織矩陣為n m矩陣,根據(jù)分組交織原理,輸入數(shù)據(jù)以0,1,2…,mn-1的順序地址方式寫入存儲器,交織后輸出為:0,n,2n,…, (m-1)n,1,n+1,2n+1, …,(m-1)n+1,2,…,mn-1.
地址產(chǎn)生算法采用雙重循環(huán)的方式(算法流程如圖2所示),算法流程說明如下:
算法流程圖
①首先根據(jù)信道實際情況及數(shù)據(jù)幀長,選定合適的交織
將計數(shù)變量i,j清零;
?、趯τ嫈?shù)變量j進行判斷:如果j<m,則j++;
如果j=m,則跳到第3步;
③對計數(shù)變量i進行判斷:如果i<n,則i++并將j清零之后跳回第2步;如果i=n,則跳回第1步,開始新一輪循環(huán)。
在整個循環(huán)過程中,讀地址變量add不斷輸出“亂序”的交織地址add=j n+i,以達到設(shè)計的要求。
通過上述分析可以看出,算法中運用了加法、乘法、比較、計數(shù)等算術(shù)邏輯運算,則地址生成的FPGA設(shè)計過程中,需要運用加法器,乘法器,比較器,計數(shù)器等器件以實現(xiàn)相應(yīng)功能。在設(shè)計過程中,這些器件采用由QuartusⅡ軟件為設(shè)計人員提供的參數(shù)化宏單元模塊LPM(library of parameterized modules),使用它不僅可以簡化電路復(fù)雜度,而且大大提高了設(shè)計速度。
2.2.2 讀地址序列產(chǎn)生器設(shè)計
讀地址是整個交織器設(shè)計部分的關(guān)鍵,采用“亂序讀出”的方式。電路設(shè)計主要由加法、乘法器,計數(shù)器和比較器模塊構(gòu)成,其地址序列產(chǎn)生流程在算法分析中已作過詳細說明,這里只作簡單介紹:計數(shù)器Ⅰ相當于變量j,首先在時間脈沖cp的驅(qū)動下從初始狀態(tài)“00000000”開始遞增計數(shù),當?shù)扔谠O(shè)定交織深度m時,產(chǎn)生一個時鐘脈沖信號來驅(qū)動計數(shù)器Ⅱ,此時計數(shù)器Ⅱ的計數(shù)加一,同時與另一設(shè)定數(shù)據(jù)n進行比較,當相等時計數(shù)器Ⅰ、Ⅱ同時清0,重新開始計數(shù)。
讀地址序列產(chǎn)生器
讀地址產(chǎn)生結(jié)果由數(shù)據(jù)n與計數(shù)器Ⅰ每次的輸出數(shù)據(jù)相乘,再與計數(shù)器Ⅱ的計數(shù)數(shù)據(jù)相加而得到。產(chǎn)生的序列依次為:0,n,2n,…,(m-1)n,1,n+1,2n+1,…,(m-1)n+1,2,…,mn-1.
2.3 寫地址序列產(chǎn)生器設(shè)計
交織器采用“順序?qū)懭搿钡膶懙刂贩绞?,即產(chǎn)生“0,1,2 …,mn-1”的順序地址序列。因此寫地址序列產(chǎn)生器的實現(xiàn)可由乘法器,比較器和計數(shù)器等宏單元模塊構(gòu)成(如圖4所示),寫地址具體產(chǎn)生說明如下:
寫地址序列產(chǎn)生器
首先8位計數(shù)器在時鐘脈沖cp的驅(qū)動下由初始狀態(tài)“00000000”開始遞增計數(shù),產(chǎn)生的計數(shù)數(shù)據(jù)分成兩路:一路送到雙端口RAM的寫地址端,作為交織器的寫地址產(chǎn)生信號;另一路則送到比較器的一個輸入端,同乘法器輸出的結(jié)果進行比較:當計數(shù)器累計計數(shù)值小于乘法器計算結(jié)果時,計數(shù)器繼續(xù)累加計數(shù);而當計數(shù)值等于乘法器的計算結(jié)果時,比較器產(chǎn)生中斷控制信號使得計數(shù)器清0,并重新開始計數(shù)。
2.4 讀寫使能控制設(shè)計
考慮到雙端口RAM對其內(nèi)部同一單元地址不能同時進行讀寫操作,因此,整個交織器設(shè)計需用讀寫使能控制電路用來對雙端口RAM的地址讀寫進行控制,并同時決定讀寫發(fā)生器何時開始工作。由于雙端口RAM的讀、寫實現(xiàn)都是從零地址開始的,因而RAM內(nèi)的每個存儲單元的讀操作都應(yīng)在寫操作之后,從而保證每個讀出數(shù)據(jù)的有效性。
讀寫使能控制電路如圖5所示,讀寫控制電路采用類似于分頻器原理[4]的工作方式,電路主要由計數(shù)器、比較器和D觸發(fā)器來實現(xiàn):計數(shù)器與n m比較的結(jié)果作為D觸發(fā)器的時鐘脈沖信號,當計數(shù)器的計數(shù)值等于n m時,觸發(fā)器的輸出狀態(tài)進行一次反轉(zhuǎn),即相當于構(gòu)成了一個n m的分頻器電路。觸發(fā)器的輸出結(jié)果分成兩路:一路送到雙端口RAM的寫地址使能端;另一路經(jīng)過反相后送給讀地址使能端。這樣便可以使存儲器RAM在“n m”的地址空間范圍內(nèi)交替進行“讀/寫”數(shù)據(jù)的操作。
讀寫使能控制電路
2.5 設(shè)計中的遇到的問題及解決辦法
交織器的設(shè)計中包含的運算有相乘和相加,相乘會造成字長的變化。這便會帶來數(shù)據(jù)位數(shù)匹配的問題,下面我們以讀地址電路(圖4)為例給出解決辦法:
進入乘法器的兩路數(shù)據(jù)均為8位,經(jīng)過乘法運算后,數(shù)據(jù)位數(shù)會增加到16位,同時需要與來自計數(shù)器Ⅱ的8位數(shù)據(jù)進行加法運算。通常情況下多采取舍入或截尾的方法,即將16位數(shù)據(jù)的高8位字節(jié)舍去,這種方法的不足是當m、n的乘積大于256(11111111H)時,數(shù)據(jù)的高8位不全為0,舍去會帶來輸出結(jié)果的錯誤,因而可能造成交織器輸出碼字的錯誤。因此,可采用“補位”的辦法,將輸入加法器的8位數(shù)據(jù)補成16位(在8位數(shù)據(jù)前補8位0),以增長位寬從而達到數(shù)位匹配的目的。
3 QuartusⅡ仿真結(jié)果及分析
交織器的仿真波形如圖6所示(其中“clk”為驅(qū)動時鐘,“rden”、“wren”為讀、寫使能,“data”、“result”為輸入、輸出雙端口RAM的數(shù)據(jù)序列):
Quartus
從QuartusⅡ波形仿真結(jié)果看到當交織矩陣的m,n值為5和3時,雙口RAM的輸出數(shù)據(jù)為“0、5、10、1、6…”;當m,n調(diào)整為8和 6后,雙口RAM的輸出為“0、8、16、24…”。可以看出,在任意選取不同的m值和n值后,交織器能夠根據(jù)分組交織的原理將輸入RAM的數(shù)據(jù)字或比特位流進行交織,輸出所需的數(shù)據(jù)序列,達到了交織矩陣深度和寬度可控的目的。
4 小結(jié)
本文介紹了可針對不同交織需要的改進型分組交織器FPGA設(shè)計,該交織器的主要特點是可根據(jù)信道中突發(fā)誤碼的長度、出現(xiàn)的頻率以及糾錯碼的約束長度、糾錯能力設(shè)定合適的交織深度和寬度(m,n),需要指出的是,m,n選得越大,信道編碼的約束長度越大,從而對付信道中長突發(fā)差錯的能力也就越強,但m,n選得越大,也就需要越大的存儲空間,同時會引入更長的延時,所以應(yīng)根據(jù)數(shù)字通信系統(tǒng)的實際情況選擇合適的m值和n值。
本文作者創(chuàng)新點:對傳統(tǒng)分組交織器進行了改進,實現(xiàn)了分組交織器的交織矩陣深度和寬度可控,能夠很好的滿足不同數(shù)據(jù)幀傳輸?shù)囊?,具有更好的抗信道突發(fā)錯誤的能力。