龐志鋒+劉欣欣+王曉君
摘要:衛(wèi)星定位接收機(jī)中的卷積碼譯碼即Viterbi譯碼,在處理器中面臨著占有資源比較多、處理時(shí)間太長等問題,為了減少處理器中資源占用和提高它的處理速度,采用了多通道復(fù)用和串行加比選蝶形單元的方法,在FPGA平臺(tái)上用硬件描述語言設(shè)計(jì)出一種高性能Viterbi譯碼器,大大減少資源占用,提高了接收機(jī)的處理速度。
關(guān)鍵詞:卷積碼;Viterbi算法;FPGA;資源占用
中圖分類號:TN919 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號:1009-3044(2017)28-0251-03
Abstract: Satellite positioning receiver decoding convolutional code Viterbi decoder, facing the problem of share more resources and processing time in the processor, the processor in order to reduce the occupied resources and improve the processing speed, using multi channel multiplexing and serial plus selection butterfly unit method, using hardware description language to design a high performance Viterbi decoder FPGA platform, greatly reduce the resource utilization, improve the processing speed of the receiver.
Key words: convolutional code; Viterbi algorithm; FPGA; resource consumption
卷積碼是廣泛應(yīng)用于無線通信、衛(wèi)星通信等多種通信系統(tǒng)中的信道編碼方式。Viterbi算法是卷積碼的最大似然譯碼算法,該算法譯碼速度快、性能好,并且實(shí)現(xiàn)硬件結(jié)構(gòu)也比較簡單,是最優(yōu)的卷積碼譯碼算法[1]。在現(xiàn)代通信系統(tǒng)中,要使信號能夠更可靠地在信道中傳輸,往往需要在信道編碼中采用糾錯(cuò)碼來降低信號受噪聲的影響,以降低傳輸?shù)恼`碼率。卷積碼及其Viterbi譯碼是比較常用的信道編碼方案。
1 卷積編碼及Viterbi算法基本原理
卷積碼是由移位寄存器和n個(gè)模2加法器組成,當(dāng)前狀態(tài)的輸入進(jìn)來的數(shù)據(jù)和寄存器組中的數(shù)據(jù)共同決定著編碼器的輸出結(jié)果。(2,1,7)卷積碼的生成多項(xiàng)式為G=(171,133),電路圖如圖1所示[2]。(2,1,7)卷積碼編碼器由6個(gè)延時(shí)器(圖1中的q-1模塊,可用寄存器實(shí)現(xiàn))和兩個(gè)模2加法器組成,它的編碼約束度為7,碼率為1/2,即輸入端輸入1b信息,輸出端輸出2b編碼信息,并分為上、下兩路并行輸出。
Viterbi譯碼算法是找最大度量的最大似然路徑,即找出局部最優(yōu)的幸存信息就等效于找到最優(yōu)幸存信息,它將比較進(jìn)入每一狀態(tài)下的所有路徑,然后得出最優(yōu)路徑并存儲(chǔ),即幸存路徑,步驟為:(1)從某一時(shí)間單位[l=m]開始,將每個(gè)路徑中的分支度量值計(jì)算出來,然后將所有狀態(tài)的分支度量值和幸存路徑存儲(chǔ)下來;(2)[l]增加l,[l=m+1],累加更新后的分支度量值和之前的分支度量值,然后計(jì)算出來最大度量的路徑,然后把更新后的幸存路徑及其度量值存儲(chǔ)下來,并刪掉其他路徑;(3)若[l 2 基于硬件描述語言的Viterbi算法 由Viterbi譯碼算法可以得出Viterbi譯碼器的結(jié)構(gòu)框圖,圖2是Viterbi譯碼器結(jié)構(gòu)框圖,一個(gè)Viterbi譯碼器,一般都會(huì)包括圖2所示的幾個(gè)基本部分:控制模塊、分支度量計(jì)算模塊、加比選模塊、幸存路徑管理模塊和一些必要的存儲(chǔ)模塊。 2.1 仲裁邏輯設(shè)計(jì) 仲裁寫控制,首先輪詢一遍所有通道,將通道使能轉(zhuǎn)為寫信號暫存在寫使能寄存器中,并且在此輪詢中將數(shù)據(jù)也暫存,并將寫使能與暫存數(shù)據(jù)例化進(jìn)相應(yīng)的FIFO中。 通道FIFO數(shù)據(jù)向緩存FIFO中導(dǎo)入控制,判斷每一個(gè)FIFO中的數(shù)據(jù)是否滿足了譯碼的條件的數(shù)量,若滿足了譯碼條件的數(shù)量,并且緩存FIFO的空信號有效時(shí),則可以將數(shù)據(jù)從滿足條件的通道FIFO中導(dǎo)入到緩存FIFO中,此時(shí)通道FIFO的讀使能與緩存FIFO的寫使能信號的高電平長短應(yīng)該為486個(gè)主鐘,這樣控制輸入到緩存FIFO中的數(shù)據(jù)為486,當(dāng)導(dǎo)入到緩存FIFO中的數(shù)據(jù)達(dá)到了486個(gè)時(shí),將產(chǎn)生Decode_start信號與相應(yīng)的通道號。 仲裁讀控制,當(dāng)譯碼模塊處于忙狀態(tài),然后譯碼模塊的讀使能有效,并且FIFO不空時(shí),則將啟動(dòng)FIFO讀使能,再利用讀使能將FIFO中數(shù)據(jù)進(jìn)行輸出。仲裁邏輯模塊的原理圖如圖3所示。 2.2 控制模塊 控制模塊主要的任務(wù)是產(chǎn)生系統(tǒng)內(nèi)部各個(gè)模塊的各種控制信號,這些內(nèi)部的控制信號保證了各個(gè)功能模塊的協(xié)調(diào)工作。因此,控制模塊對于系統(tǒng)有序高效的運(yùn)行非常重要,是整個(gè)Viterbi譯碼系統(tǒng)的核心模塊[3]。 當(dāng)Decode_start信號有效時(shí),譯碼控制模塊中的Control_vaild信號置高電平,在主鐘和Control_vaild信號有效下主鐘計(jì)數(shù)器Clk_cnt加1,每當(dāng)Clk_cnt為0時(shí),RD_FIFO置高電平持續(xù)1個(gè)鐘,蝶形狀態(tài)計(jì)數(shù)器Status_num根據(jù)當(dāng)前Clk_cnt的計(jì)數(shù)值減1處理,在Status_num輸出延遲2個(gè)主鐘后輸出Butter_select(為了匹配距離計(jì)算模塊的節(jié)奏)將每對蝶形單元的輸出送譯碼計(jì)算模塊,當(dāng)Clk_cnt為32時(shí),Status_num保持31不變,當(dāng)Clk_cnt計(jì)數(shù)值達(dá)到37時(shí),清零重新開始計(jì)數(shù),每當(dāng)Clk_cnt清零時(shí),送存儲(chǔ)模塊的Ping_Pang信號翻轉(zhuǎn),同時(shí)譯碼控制模塊的Bit_cnt計(jì)數(shù)器加一,當(dāng)Bit_cnt計(jì)數(shù)為242時(shí),輸出Frame_over信號送仲裁模塊,當(dāng)Bit_cnt計(jì)數(shù)值為242且Clk_cnt計(jì)數(shù)值為35時(shí),輸出Combine_result_enable信號送譯碼輸出模塊進(jìn)行最后64位結(jié)果的拼接。當(dāng)Bit_cnt計(jì)數(shù)值為134且Clk_cnt計(jì)數(shù)值為0時(shí),輸出ID_bit_enable信號送譯碼輸出模塊進(jìn)行ID號輸出。控制模塊的時(shí)序圖如圖4所示。
2.3 加比選(ACS)模塊
ACS單元把前一狀態(tài)的度量值,與當(dāng)前輸入信號的分支度量相加得到該分支的度量值,比較不同分支路徑度量的大小,選擇最小的度量值,更新當(dāng)前狀態(tài)的新度量值,并存儲(chǔ)到RAM中,當(dāng)更新完所有狀態(tài)的度量值,將讀出RAM中的數(shù)據(jù)給ACS模塊使用。所以可以得出,加比選模塊由加法器、比較器和選擇器組成。加比選模塊將度量值保存到距離存儲(chǔ)單元,更新距離度量值。同時(shí)將最優(yōu)路徑存到路徑存儲(chǔ)單元,更新最優(yōu)路徑。
加法器是距離計(jì)算模塊得出的分支度量值和存儲(chǔ)單元得到的累加度量值相加;比較器是0狀態(tài)下輸入為0時(shí)相加的結(jié)果和1狀態(tài)下輸入為0時(shí)相加的結(jié)果作比較。0狀態(tài)下輸入為32相加的結(jié)果和1狀態(tài)下輸入為32時(shí)相加的結(jié)果作比較,上面兩個(gè)結(jié)果作比較得出最優(yōu)路徑;選擇器是比較選出較小的一個(gè)度量值輸出給存儲(chǔ)單元,選擇出的最優(yōu)路徑也存入存儲(chǔ)單元。
3 仿真及接收機(jī)測試結(jié)果
整個(gè)系統(tǒng)使用Verilog HDL完成了設(shè)計(jì),在Modelsim SE 6.6d平臺(tái)上進(jìn)行了仿真,將Matlab生成的數(shù)據(jù)寫入一個(gè)Modelsim待讀的存儲(chǔ)器中,然后利用測試激勵(lì)文件來讀取數(shù)據(jù),數(shù)據(jù)經(jīng)過頂層模塊后,數(shù)據(jù)主要經(jīng)過仲裁復(fù)用模與譯碼模塊還有中斷模塊中進(jìn)行仲裁復(fù)用、譯碼和叫中斷,在Modelsim中產(chǎn)生最后輸出的數(shù)據(jù)。利用Modelsim產(chǎn)生的數(shù)據(jù)與Matlab仿真生成的數(shù)據(jù)進(jìn)行對比,Modelsim仿真出來的誤碼個(gè)數(shù)和誤碼的位置都和Matlab一一對應(yīng),兩種仿真的數(shù)據(jù)都嚴(yán)格對應(yīng),并且在Xilinx ISE Design Suite 13.2平臺(tái)上進(jìn)行了綜合。仿真結(jié)果如圖5所示。
誤碼性能圖6是根據(jù)Matlab仿真出來的RD維特比譯碼case列表畫出來的,該表格的數(shù)據(jù)與誤比特率理論值都一一對應(yīng)。
4 結(jié)束語
本文通過研究(2,1,7)卷積碼Viterbi譯碼的FPAG(Field Programmable Gate Array現(xiàn)場可編程門陣列)實(shí)現(xiàn)算法,設(shè)計(jì)了采用多通道情況下使用仲裁邏輯、雙口RAM、加比選單元選擇最優(yōu)路徑的軟判決Viterbi譯碼器。該譯碼器既滿足了譯碼速度,又比并行算法節(jié)省了約50%的硬件資源,而且還便于和其他系統(tǒng)模塊結(jié)合。
參考文獻(xiàn):
[1] 傅民倉,馮立杰,李文波.基于FPGA的高速Viterbi譯碼器優(yōu)化設(shè)計(jì)和實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2006,29(7):52-54.
[2] 蔡志龍,馮文江,楊洋.一種基于FPGA的Viterbi譯碼器優(yōu)化算法[J].現(xiàn)代電子技術(shù),2008,31(17):105-107.
[3] 丘磊,張巖.基于FPGA的高性能Viterbi譯碼器的設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2010,27(7):246-249.
[4] 韓可,鄧中亮,施樂寧.(2,1,7)卷積碼Viterbi譯碼器FPGA實(shí)現(xiàn)方案[J].現(xiàn)代電子技術(shù),2007,30(15):90-96.
[5] 牛晨曦,張輝.一種基于FPGA的Viterbi譯碼器[J].現(xiàn)代電子技術(shù),2005,28(3):56-57.
[6] 王連成.基于FPGA的Viterbi譯碼器設(shè)計(jì)[J].電子元器件應(yīng)用,2010,12(5):39-40.
[7] 王新梅,肖國鎮(zhèn).糾錯(cuò)碼—原理與方法:修訂版[M].西安:西安電子科技大學(xué)出版社,2001:443-460.
[8] 吳厚航.深入淺出玩轉(zhuǎn)FPGA[M].北京:北京航空航天大學(xué)出版社,2010.
[9] 張傳達(dá),李小文.卷積碼編碼及其Viterbi譯碼器的實(shí)現(xiàn)[J].無線電工程,2006,36(07).
[10] 樊昌信,曹麗娜.通信原理[M].北京:國防工業(yè)出版社,2008.
[11] Scllegel C.Fundamentals of Digital Communication and Blocking Coding, Chapter 4: Convolutional Codes[M].IEEE Press, 2002.endprint