摘 要:以GSM移動通信系統(tǒng)為例,在分析GSM通信系統(tǒng)信道編碼結構、交織方式的基礎上,提出基于FPGA用塊內交織方法實現(xiàn)該系統(tǒng)中的交織器,利用VHDL語言完成該系統(tǒng)中交織器的具體設計,并驗證設計的正確性和可行性,為使用軟件無線電實現(xiàn)GSM基站系統(tǒng)奠定了基礎。
關鍵詞:信道編碼;交織器;仿真分析;軟件無線電
中圖分類號:TN91122文獻標識碼:B
文章編號:1004-373X(2008)08-075-03
Design of Interleave Encoder in Mobile Communication System
FAN Yan′gen1,2,LIU Songyan2,HUANG Danling1,ZHAO Lin1
(1.Heilongjiang Institute of Science and Technology,Harbin,150027,China;
2.Microelectronics Center,Harbin Institute of Technology,Harbin,150001,China)
Abstract:On the basis of analyzing the channel coding structure and interleave style of the system,taking an example of GSM,this passage introduces a new method based on FPGA to realize the interleave of system,introduces the detailed design of the interleave with VHDL in the system,testifies the exactness and feasibility of this method and establishes the basis to realize GSM base station system using software radio.
Keywords:channel coding;interleave;simulation analysis;software radio
軟件無線電[1]是一種實現(xiàn)無線通信的新的體系結構,是無線通信產業(yè)從模擬到數(shù)字、從固定到移動這兩次革命后的第三次革命,是從硬件無線通信到軟件無線通信的革命。
在從事使用軟件無線實現(xiàn)GSM基站研究中,在深入研究GSM通信系統(tǒng)信道編碼結構、交織方式的基礎上,利用VHDL硬件描述語言完成GSM基站信道編碼中使用的交織器的具體設計,為進一步研究軟件無線技術在GSM基站系統(tǒng)中應用打下基礎。
1 GSM的話音編碼與信道編碼
在GSM通信系統(tǒng)中,全速率話音編碼算法為規(guī)則脈沖激勵及長期預測算法(RPELTP)。模擬話音首先通過一個ADC以8 kHz采樣頻率進行采樣,每個采樣點用均勻13 b編碼。話音編碼器對每20 ms一段的話音進行壓縮編碼,編碼結果為每20 ms產生260 b的數(shù)據(jù)塊。這260 b的數(shù)據(jù)根據(jù)他們的重要性分成為3類:Ia類、Ib類和Ⅱ類。Ia類共50 b,為非常重要的數(shù)據(jù)。如果這些數(shù)據(jù)被修改,恢復的話音將發(fā)生很大的錯誤,甚至無法恢復正常的話音,因此這些數(shù)據(jù)需要嚴格保護。Ib類數(shù)據(jù)共132 b,是比較重要的數(shù)據(jù),需要進行較好的保護。Ⅱ類數(shù)據(jù)共78 b,為一般重要的數(shù)據(jù),發(fā)生一些差錯也不會對恢復的話音有太大的影響,通常不對其進行保護。根據(jù)數(shù)據(jù)重要性的不同,決定信道編碼中采用不同的保護方法。
GSM通信系統(tǒng)的信道編碼首先對Ia類數(shù)據(jù)進行差錯檢測編碼,產生3個循環(huán)冗余校驗(CRC)比特,這些比特的產生使用多項式為G(x)=X3⊕X⊕1。3個CRC比特附在Ia類的50 b后面,再與Ib類數(shù)據(jù)組合在一起進行K=5,r=1/2的卷積編碼,卷積編碼器使用的2個多項式為P1(x)=X4⊕X3⊕1和P2(x)=X4⊕X3⊕X⊕1,卷積編碼產生的結果是兩個189 b的序列,將他們與不需要保護的Ⅱ類數(shù)據(jù)復合在一起,產生一個完整的經過信道編碼的話音幀,共456 b。
2 交織編碼器工作原理
信道編碼中采用交織技術[2],可打亂碼字比特之間的相關性,將信道中傳輸過程中的成群突發(fā)錯誤轉換為隨機錯誤,從而提高整個通信系統(tǒng)的可靠性。交織編碼根據(jù)交織方式的不同,可分為線性交織、卷積交織和偽隨機交織。其中線性交織編碼是一種比較常見的形式。所謂線性交織編碼器,是指把糾錯編碼器輸出信號均勻分成m個碼組,每個碼組由n段數(shù)據(jù)構成,這樣就構成一個n×m的矩陣。這里把這個矩陣稱為交織矩陣。如圖1所示,數(shù)據(jù)以a11,a12,…,a1n,a21,a22,…,a2n,…,aij,… ,am1,am2,…,amn(i=1,2,…,m;j=1,2,…,n)的順序進入交織矩陣,交織處理后以a11,a21,…,am1,a12,a22,…,am2,…,a1n,a2n,…,amn的順序從交織矩陣中送出,這樣就完成對數(shù)據(jù)的交織編碼。還可以按照其他順序從交織矩陣中讀出數(shù)據(jù),不管采用哪種方式,其最終目的都是把輸入數(shù)據(jù)的次序打亂。 如果aij只包含1個數(shù)據(jù)比特,稱為按比特交織[3];如果aij包含多個數(shù)據(jù)比特,則稱為按字交織。接收端的交織譯碼同交織編碼過程相類似。
a11a12…a1n
a21a22…a2n
am1am2…amn交織處理后[TXX→*2] a11a21…am1
a12a22…am2
a1na2n…amn
圖1 n×m交織矩陣線性交織編碼
一般來說,如果有n個(m,k)碼,排成n×m矩陣,按列交織后存儲或傳送,讀出或接收時恢復原來的排列,若(m,k)碼能糾t個錯誤,那么交織后就可糾nt個錯誤。對糾正信道傳輸過程中出現(xiàn)的突發(fā)錯誤效果明顯。
GSM中使用這種比特交織器。其交織方式為將信道編碼后的每20 ms的數(shù)據(jù)塊m=456 b拆分到8組中,每組57 b,然后這每組57 b分配到不同的Burst中。
3 交織編碼器的軟件設計
GSM通信系統(tǒng)必須滿足實時性的要求,因此,交織編碼引入的延時應盡可能小。為了同時滿足塊內交織進行(57,8)矩陣轉置變換和延時盡可能小的要求,該交織器利用2片雙口RAM實現(xiàn),記作RAM[CD#*2] 和RAM[CD#*2] B。交織處理時,按地址從0~455 將456 b輸入數(shù)據(jù)全部寫入RAM[CD#*2]A,待456 b數(shù)據(jù)全部送入RAM[CD#*2]A后,控制信號使RAM[CD#*2]A由寫狀態(tài)轉換到讀狀態(tài),同時,將輸入的待交織數(shù)據(jù)寫入RAM[CD#*2]B,RAM[CD#*2]B為寫狀態(tài),交織器由RAM[CD#*2]A輸出數(shù)據(jù)。經過456個時鐘周期后,從RAM[CD#*2]A讀出456 b數(shù)據(jù)的同時,RAM[CD#*2]B寫入一個時隙的456 b數(shù)據(jù)。此時,改變RAM[CD#*2]A和RAM[CD#*2]B的讀寫狀態(tài),RAM[CD#*2]A開始寫,從RAM[CD#*2]B中讀取數(shù)據(jù)。如此反復完成數(shù)據(jù)的實時連續(xù)交織處理。
完成交織處理的核心問題是處理好讀/寫地址之間的關系,該交織器讀/寫地址的變換采用如下算法完成:
readaddress(j×8+i)=writeaddress(i×57+j)
(i=0,1,2,…,7;j=0,1,2,…,57)
為減少FPGA運算量,可利用Matlab,C語言等實現(xiàn)讀/寫地址矩陣轉置運算。這里采用Matlab完成讀/寫地址矩陣轉置運算,具體程序為:x=0:1:455;reshape(x,57,8)。讀/寫地址的變換結果存儲在address[CD#*2]ROM.mif文件中[4]。利用VHDL語言描述該交織編碼器完整代碼如下:
[HT4][HT5”]
LIBRARY IEEE;
USE IEEE.STD[CD#*2]LOGIC[CD#*2]1164.ALL;
USE IEEE.STD[CD#*2]LOGIC[CD#*2]SIGNED.ALL;
USE IEEE.STD[CD#*2]LOGIC[CD#*2]UNSIGNED.ALL;
USE IEEE.STD[CD#*2]LOGIC[CD#*2]ARITH.ALL;
LIBRARY lpm;
USE lpm.lpm[CD#*2]components.ALL;
LIBRARY altera[CD#*2]mf;
USE altera[CD#*2]mf.altera[CD#*2]mf[CD#*2]components.all;
ENTITYGSM[CD#*2]VHDL IS
GENERIC (intlv[CD#*2]length: positive := 456);
PORT(clk:INSTD[CD#*2]LOGIC;
data[CD#*2]in: INSTD[CD#*2]LOGIC;
wr[CD#*2]addr[CD#*2]A,rd[CD#*2]addr[CD#*2]A: BUFFER STD[CD#*2]LOGIC[CD#*2]VECTOR(8 DOWNTO 0);
intlv[CD#*2]data[CD#*2]A,intlv[CD#*2]data[CD#*2]B:BUFFER STD[CD#*2]LOGIC;
RAM[CD#*2]select[CD#*2]cnt:BUFFER STD[CD#*2]LOGIC[CD#*2]VECTOR(9 DOWNTO 0);
RAM[CD#*2]select,RAM[CD#*2]read[CD#*2]ena:BUFFER STD[CD#*2]LOGIC;
intlv[CD#*2]out:BUFFER STD[CD#*2]LOGIC );
END ENTITY GSM[CD#*2]VHDL;
ARCHITECTURE address[CD#*2]control[CD#*2]fan OF GSM[CD#*2]VHDL is
SIGNAL RAM[CD#*2]read[CD#*2]delay1 :STD[CD#*2]LOGIC;
SIGNAL RAM[CD#*2]out[CD#*2]A,RAM[CD#*2]out[CD#*2]B :STD[CD#*2]LOGIC;
BEGIN
RAM[CD#*2]select[CD#*2]cnt[CD#*2]mine : COMPONENT lpm[CD#*2]counter
GENERIC MAP (LPM[CD#*2]WIDTH=>10,LPM[CD#*2]MODULUS=>912)
PORT MAP (clock=>clk,updown=>′1′,q=>RAM[CD#*2]select[CD#*2]cnt);
RAM[CD#*2]select[CD#*2]mine :COMPONENT lpm[CD#*2]compare
GENERIC MAP(LPM[CD#*2]WIDTH=>10,LPM[CD#*2]REPRESENTATION=> \"UNSIGNED\")
PORT MAP(dataa=>RAM[CD#*2]select[CD#*2]cnt,datab=>\"0111001000\",ageb=>RAM[CD#*2]select);
data[CD#*2]input[CD#*2]select: PROCESS(RAM[CD#*2]select,data[CD#*2]in)
BEGIN
IF RAM[CD#*2]select =′0′ THEN
intlv[CD#*2]data[CD#*2]A <= data[CD#*2]in;
intlv[CD#*2]data[CD#*2]B <=′0′;
ELSE
intlv[CD#*2]data[CD#*2]A <=′0′;
intlv[CD#*2]data[CD#*2]B <= data[CD#*2]in;
END IF;
END PROCESS data[CD#*2]input[CD#*2]select;
wr[CD#*2]addr[CD#*2]A[CD#*2]mine : COMPONENT lpm[CD#*2]counter
GENERIC MAP (LPM[CD#*2]WIDTH=>9,LPM[CD#*2]MODULUS=>intlv[CD#*2]length)
PORT MAP (clock=>clk,updown=>′1′,q=>
wr[CD#*2]addr[CD#*2]A);
rd[CD#*2]addr[CD#*2]mine[CD#*2]A:COMPONENT altsyncram
GENERIC MAP (OPERATION[CD#*2]MODE=>\"ROM\",WIDTH[CD#*2]A =>9,WIDTHAD[CD#*2]A =>9,OUTDATA[CD#*2]REG[CD#*2]A=>\"clock0\",INIT[CD#*2]FILE => \"address[CD#*2]ROM.mif\")
PORT MAP (clock0=>clk,address[CD#*2]a=>
wr[CD#*2]addr[CD#*2]A,q[CD#*2]a=>rd[CD#*2]addr[CD#*2]A);
RAM[CD#*2]read[CD#*2]delay[CD#*2]one: COMPONENT lpm[CD#*2]ff
GENERIC MAP (LPM[CD#*2]WIDTH=>1)
PORT MAP(data(0)=>RAM[CD#*2]select,clock=>clk,q(0)=>RAM[CD#*2]read[CD#*2]delay1);
RAM[CD#*2]read[CD#*2]delay[CD#*2]two: COMPONENT lpm[CD#*2]ff
GENERIC MAP (LPM[CD#*2]WIDTH=>1)
PORT MAP(data(0)=>RAM[CD#*2]read[CD#*2]delay1,clock=>clk,q(0)=>RAM[CD#*2]read[CD#*2]ena);
RAM[CD#*2]A:COMPONENT lpm[CD#*2]ram[CD#*2]dp
GENERIC MAP (LPM[CD#*2]WIDTH=>1,LPM[CD#*2]WIDTHAD=>9)
PORT MAP(data(0)=> intlv[CD#*2]data[CD#*2]A,
rdaddress=>rd[CD#*2]addr[CD#*2]A,wraddress=>wr[CD#*2]addr[CD#*2]A,
rdclock=>clk,wrclock=>clk,
rden=>RAM[CD#*2]read[CD#*2]ena,wren=>NOT RAM[CD#*2]select,
q(0)=>RAM[CD#*2]out[CD#*2]A);
RAM[CD#*2]B:COMPONENT lpm[CD#*2]ram[CD#*2]dp
GENERIC MAP (LPM[CD#*2]WIDTH=>1,LPM[CD#*2]WIDTHAD=>9)
PORT MAP(data(0)=> intlv[CD#*2]data[CD#*2]B,
rdaddress=>rd[CD#*2]addr[CD#*2]A,wraddress=>wr[CD#*2]addr[CD#*2]A,
rdclock=>clk,wrclock=>clk,
rden=>NOT RAM[CD#*2]read[CD#*2]ena,wren=>RAM[CD#*2]select,
q(0)=>RAM[CD#*2]out[CD#*2]B);
intlv[CD#*2]out<=RAM[CD#*2]out[CD#*2]A WHEN RAM[CD#*2]read[CD#*2]ena=′1′ ELSE
RAM[CD#*2]out[CD#*2]B;
END ARCHITECTURE address[CD#*2]control[CD#*2]fan;
4 仿真分析
利用Altera公司的Quartus Ⅱ工具軟件, 對該交織器仿真分析,得到的時序仿真波形如圖2所示。從讀地址(rd[CD#*2]addr[CD#*2]A)和寫地址(wr[CD#*2]addr[CD#*2]A)以及(data[CD#*2]in)和(intlv[CD#*2]out)可以看出,該交織器完成既定的交織功能,延時相當小,該設計方法正確可行。
圖2 交織器部分時序仿真波形
5 結 語
本文提出基于FPGA實現(xiàn)交織器的方法,給出利用VHDL語言描述該交織器的全部代碼。通過仿真分析驗證該實現(xiàn)方案的正確性和可行性。為進一步研究GSM通信系統(tǒng)基站軟件化打下了良好的基礎。
參 考 文 獻
[1]楊小牛,樓才義,徐建良.軟件無線電原理與應用[M].北京:電子工業(yè)出版社,2004.
[2]徐元欣,王匡,仇佩亮.實現(xiàn)卷積交織的幾種實用方法[J].電路與系統(tǒng)學報,2001,6(1):712.
[3]白寶明,馬嘯,王新梅.隨機交織器的設計與實現(xiàn)[J].通信學報,2000,21(6):611.
[4]潘松,黃繼業(yè).EDA技術實用教程[M].北京:科學出版社,2002.
作者簡介
范艷根 男,1979年出生,安徽太湖人,講師,2002年畢業(yè)于黑龍江科技學院,現(xiàn)為哈爾濱工業(yè)大學微電子中心碩士研究生。主要從事信號與信息處理方面的教學與科研工作。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文