新一代移動通信系統目前主要采用多載波傳輸技術, 基帶傳輸速率較3G 有很大提高, 一般要求業務速率能達到30 Mb/ s 以上。約束長度卷積碼以及Viterbi譯碼器由于其性能和實現的優點, 在新一代通信系統中仍然占有一席之地。這就要求進一步提高Viterbi 譯碼器的譯碼速率, 同時優化Viterbi 設計以減少由速率提高和約束長度的增加帶來的硬件實現復雜度。
1 Viterbi 譯碼器基本結構
Viterbi 譯碼器主要由分支度量計算( BMU ) , 度量累積存貯( PathMet ric) , 度量比較判斷( ACS) 以及回溯譯碼( T raceBack) 4 個模塊組成[ 1] , 如圖1 所示。本文優化主要針對約束長度為9 的1/ 2 卷積碼, 生成多項式為561( oct) , 753( oct) 。
BMU ( Branch Met ric Unit ) 模塊計算接收的2 個軟信息與4 種可能的編碼輸出的歐式距離, 作為分支度量送入ACS 模塊。ACS( Add_ Compar e_ Select ) 模塊根據編碼方式和狀態轉移將分支度量和256 狀態的度量分別進行累積相加, 得到進入下一時刻的新度量, 然后比較到達下一時刻同一狀態的2 種度量大小, 選擇小的度量, 同時生成各狀態的幸存比特輸出。Tr ace Back 回溯模塊由ACS 生成的當前時刻的判決比特回溯L個時刻( L 為回溯深度) , 得到L 時刻前的狀態和譯碼輸出。
2 Xilinx Virtex II 的結構和功能
Virtex II 是Xilinx 公司的高性能系列FPGA。最高規模能達到8 000 000 門, 內部時鐘高達400 MHz。存貯單元具有高達到3 M 容量的真正雙端口Block Ram。運算單元中包括最多168 b 的專用乘法器。Virtex II 中的可配置單元為CLB ( Config urable Log ic Bloccks) 。CLB 中的資源可以靈活配置成多種結構。包括實現查找表, 移位寄存器等功能。在存貯資源不夠的時候, CLB 也可以配置為分布式的Ram[ 2] 。
雙口BlockRam 是Viterbi 譯碼器中實現回溯譯碼的主要模塊, 其端口如圖2 所示??梢钥闯鯞lock-Ram 具有2 套獨立的地址和數據輸入、輸出線, 獨立的端口使能、寫使能控制線, 而且2 個端口各自的時鐘輸入可以不同。這些結構保證了Blo ckRam 是一個完全真正雙端口操作的存貯器。Virtex II 系列中BlockRam 最多有168 個, 每個容量為18 k??梢耘渲贸刹煌臄祿挾群蜕疃?。同時BlockRam 的訪問時間只有3. 3 ns, 能夠保證高速的存取要求。
3 基于Xilinx BlockRam 的回溯優化方案
3. 1 回溯算法的原理和存在的問題
在Viterbi 譯碼模塊中, ACS 和TraceBack 是最核心的模塊。ACS 需進行大量的累積和比較運算,TraceBack 需進行多步回溯運算。當Viterbi 譯碼器譯碼狀態為256 時, 這些運算都需要占用大量的時間和資源。對于256 狀態的1/ 2 卷積碼的譯碼, 需要512 個加法器, 512 個比較器和選擇器來完成累加度量、比較度量大小, 并選擇小的度量作為該狀態新的度量。對一個狀態度量更新的操作如圖3 所示。
ACS 得出的256 位的判決比特送入回溯模塊進行譯碼?;厮葑g碼通過尋找在一定深度范圍內的最小度量的路徑來獲得最大似然譯碼。實現中采用截尾譯碼, 每一個時鐘到來的時候, ACS 模塊會送入當前時刻各狀態的幸存比特( 如圖4 中的Sig n[ S] ) , 從這些幸存比特可以得到由當前各狀態往回L 時刻的最小路徑上, 前一時刻經過的狀態( 如圖4 中, Sig n[ S] =0, 最小路徑上前一時刻狀態為T 1, 否則為T 2) 。如果存貯了L 個時刻的256 位狀態幸存比特, 就可以從當前時刻的某一狀態開始回溯L 時刻得到對應的最小路徑起始狀態( 如圖4 中從S 狀態回溯L 時刻得到初始的P 狀態) 。實際上無論從當前的何種狀態開始回溯, 當回溯深度L 為5~10 倍的編碼寄存器數時, 所得到的L 時刻前的初始狀態都是相同的( 當采用約束長度為9 的卷積碼, L 最少應為40) [ 3] 。
按照上述的回溯方案對256 狀態的卷積碼進行譯碼時, 會占用大量的資源, 在Virtex II 系列中的Xc2v 3000 上綜合時如果對ACS 模塊也不做任何處理的話甚至會產生資源不夠的情況。除此之外這種回溯要求在一個時鐘周期內進行L 步回溯操作, 結果導致速率達不到30 Mb/ s 的要求。
3. 2 基于Xilinx BlockRam 的回溯優化方案
雖然一個時鐘周期回溯L 步在30 MHz 的時鐘速率下不能完成, 但是如果回溯前的開始狀態已經是確定的最小路徑中的狀態, 那么每回溯一步就對應一個譯碼輸出, 這樣的輸出速率就能達到高速率。最后只需對L 步的回溯譯碼輸出做一個L 深度的倒序( LIFO)就能得到正確順序的譯碼輸出。
Xilinx Virtex II 的雙端口BlockRam[ 2] 能夠真正地對2 個端口進行不同的讀寫操作。這種結構能很好的吻合改進回溯算法的要求。應用這種結構可以存貯ACS 送入的幸存比特, 同時通過控制地址的讀寫來實現寫入幸存比特和回溯譯碼讀出同步進行?;厮菽K存貯管理原理如圖5 所示?;厮菽K的實現結構如圖6 所示。
在圖5 中, 1, 2, 3 分別為3 塊位寬為256, 深度為64 的雙端口BlockRam, 實現中將3 塊合為1 塊位寬256, 深度192 的Blo ckRam。Blo ckRam 的2 個口設為A 口和B 口。A 口為只讀口, 每個時鐘到來時, 將地址T b_ add 指向的ACS 幸存比特讀出, 并回溯計算出前一時刻的狀態。B 口為讀寫口, 且讀操作優于寫操作。當時鐘到來時, 先根據當前的狀態和地址Dec_ add所讀出的幸存比特計算出前一時刻的狀態和譯碼輸出, 然后在相同的時鐘周期內在同一地址處將ACS新產生的幸存比特寫入。
圖5 中細箭頭表示譯碼讀出和ACS 幸存比特寫入地址( Dec_ add) 的起始位置和方向, 粗箭頭表示回溯讀出前一時刻狀態的讀地址( T b_ add) 的起始位置和前進方向。每64 個時鐘開始時, 回溯讀出的起始狀態設為0, 而譯碼讀出的初始狀態為上一個64 個時鐘結束時回溯得到的初始狀態( 虛線箭頭所示) 。每64 個時鐘開始的時候, 雙端口BlockRam 的2 個讀寫地址的初始值按照圖示的規律循環右移, 且前進的方向每64 個時鐘反向一次。到64×6 個時鐘后恢復初始的地址值和方向。
由圖5 中可以看出, 64×3 個時鐘后, 將對塊2回溯得到的狀態作為初始狀態開始對塊1 中的幸存比特進行回溯譯碼, 這時才開始真正的譯碼輸出。所以譯碼延時為192 個時鐘周期, 譯碼的回溯深度為64 個時鐘周期。
4 性能分析
本文的優化方案在Xilinx ISE 5 集成環境下進行Verilog 描述以及綜合和布局布線, 并使用Modelsim7 對約束長度為9、回溯深度為64 的Viterbi 軟譯碼器在信噪比為2. 8 db 的高斯白噪聲信道中進行了后仿真, 接收誤碼率小于10- 7。
采用不同約束長度的譯碼器在ISE 5. 2 環境下進行綜合和布局布線后, 速率和面積的比較結果如表1所示。仿真使用的FPGA 為Xilinx Virtex II 系列中的Xc2v 3000[ 2] 。
由表1 可以得出, 當采用基于Xilinx 雙口Block-Ram 的優化方案時, 可以明顯地減少Viterbi 軟譯碼器的占用面積, 大大提高軟譯碼速率。在使用約束長度為9 的卷積碼時, 優化后Viterbi 軟譯碼器的面積只占用Xc2v3000 的47%, 其速率能達到40 Mb/ s 以上。
本設計已經成功下載于Xilinx Xc2v 3000 中, 正常運行在30. 72 MHz 的系統譯碼時鐘下。
評論
查看更多