黨宏社,方 鑫
(陜西科技大學(xué) 電氣與信息工程學(xué)院,陜西 西安 710021)
中國地面數(shù)字電視廣播傳輸標準GB20600-2006(以下簡稱“國標”)適用于地面?zhèn)鬏數(shù)臄?shù)字多路電視/高清晰度電視固定和移動廣播業(yè)務(wù)的幀結(jié)構(gòu)、信道編碼和調(diào)制系統(tǒng)。國標中的信道編碼部分采用了BCH(外碼)+QC-LDPC(內(nèi)碼)的級聯(lián)糾錯編碼技術(shù),使誤碼糾錯能力和信號調(diào)制性能更高,系統(tǒng)抗干擾能力更強[1]。其內(nèi)碼采用了非規(guī)則的QC-LDPC碼,性能更加接近隨機非規(guī)則的LDPC碼。
信道編碼器作為發(fā)射機的重要組成部分,設(shè)計十分關(guān)鍵。而信道編碼器中的LDPC編碼器必須能夠進行3種碼率的編碼工作,F(xiàn)PGA實現(xiàn)占用資源較多,對系統(tǒng)的成本和復(fù)雜度有重要影響,設(shè)計難度較高。因此設(shè)計的重點與難點就是要在滿足系統(tǒng)要求的基礎(chǔ)上,盡可能地降低資源的消耗,達到資源消耗與系統(tǒng)性能的平衡。
BCH+QC-LDPC級連糾錯原理如圖1所示,TS碼流輸入分組模塊后,由模塊分組并產(chǎn)生每組的數(shù)據(jù)使能信號后輸入下一級。根據(jù)國標要求,信道編碼器分為外碼編碼器BCH與內(nèi)碼編碼器LDPC兩部分,兩級編碼器中還添加了一個刪除前261 bit的0并按照碼率組織數(shù)據(jù)的結(jié)構(gòu),其作用是用于編碼數(shù)據(jù)長度切換,以便達到更好的編碼效率。編碼器模塊工作時鐘為50 MHz,由一個板載50 MHz晶振產(chǎn)生。
圖1 BCH+QC-LDPC級連糾錯原理圖
根據(jù)國標,BCH(762,752)碼由 BCH(1023,1013)系統(tǒng)碼縮短而成,該BCH碼生成多項式為GBCH(x)=1+x3+x10,可知編碼器共需10個移位寄存器。BCH編碼器結(jié)構(gòu)如圖2所示。
圖2 BCH編碼器結(jié)構(gòu)圖
開關(guān)A:前752個時鐘周期閉合,使數(shù)據(jù)輸入編碼器,進行BCH編碼;后10個時鐘周期斷開,輸出10 bit校驗位。開關(guān)B:前752個時鐘周期向下,輸入數(shù)據(jù)輸出;后10個時鐘周期向上,輸出10 bit校驗位。
每個周期BCH編碼器完成一次長度為1023的編碼運算,然后接受下一次數(shù)據(jù)輸入,進行下次編碼。
LDPC碼的生成矩陣Gqc的結(jié)構(gòu)為[1]
式中:I是 b×b 階單位矩陣;O 是 b×b 階零陣;Gi,j是 b×b階循環(huán)矩陣,取 0≤i≤k-1,0≤j≤c-1。
LDPC 碼由循環(huán)矩陣Gi,j生成。
LDPC編碼器是整個信道編碼器的核心[2-3],設(shè)計規(guī)模大,因此采用了自頂向下的設(shè)計方法,將這個編碼器劃分為6個子模塊:計數(shù)器控制器,數(shù)據(jù)輸入控制器,ROM總線控制器,運算器陣列,F(xiàn)IFO控制器和輸出控制器。LDPC編碼器的整體結(jié)構(gòu)圖如圖3所示。
圖3 LDPC編碼器結(jié)構(gòu)圖
LDPC編碼器各個部分及其功能如下:
1)計數(shù)器控制器
計數(shù)器控制器控制整個編碼器內(nèi)部的工作時序。該子模塊包含3個計數(shù)器:count_127運算計數(shù)器、count_row行列計數(shù)器和count_output輸出計數(shù)器。運算計數(shù)器對運算器每次載入新Gi,j首行數(shù)據(jù)后的運算次數(shù)進行計數(shù),每溢出一次代表完成了一次行運算;行列計數(shù)器對行運算的次數(shù)進行計數(shù),每溢出一次代表完成了一次編碼;輸出計數(shù)器對輸出字進行計數(shù),每溢出一次代表完成了一次編碼結(jié)果輸出。
2)數(shù)據(jù)輸入控制器
該子模塊完成對運算器陣列的輸入數(shù)據(jù)的時序控制,同時產(chǎn)生ROM地址數(shù)據(jù)并對其進行約束。
在仿真測試中發(fā)現(xiàn)了兩個問題:
(1)ROM地址數(shù)據(jù)不能與輸入數(shù)據(jù)同步,必須比輸入數(shù)據(jù)提前2個時鐘周期出現(xiàn)在總線上,否則會造成數(shù)據(jù)錯位。原因在于ROM從讀取地址到輸出數(shù)據(jù)需要2個時鐘周期。由于ROM地址數(shù)據(jù)無法提前,因此設(shè)計時將輸入數(shù)據(jù)進行了2個時鐘周期的延時,達到了相同的設(shè)計效果。
(2)ROM必須使用CLK全局時鐘的下降沿工作,否則會造成ROM讀取地址數(shù)據(jù)時,恰好是地址正在變化的不穩(wěn)定時刻,造成數(shù)據(jù)讀取錯誤。解決辦法是對CLK時鐘進行反向后提供給ROM,這樣讓ROM讀取地址的時刻延遲了半個時鐘周期,解決了數(shù)據(jù)讀取錯誤問題。
3)ROM總線控制器
該子模塊只需按照輸入的碼率設(shè)定值將對應(yīng)碼率的ROM數(shù)據(jù)讀入數(shù)據(jù)總線即可。
4)運算器陣列
運算器陣列由35個運算器串聯(lián)組成,使用時根據(jù)不同的碼率選擇不同數(shù)目的運算器組成陣列進行運算。每1個運算器在使用過輸入數(shù)據(jù)后,將輸入數(shù)據(jù)保持后從數(shù)據(jù)輸出口向后一級運算器輸出。每個運算器可通過1個移位寄存器累加(SRAA)電路構(gòu)成,采用反饋移位寄存器與邏輯門設(shè)計編碼器電路實現(xiàn)。0.4碼率LDPC需要 35個 SRAA,0.6碼率 LDPC需要 23個 SRAA,0.8碼率LDPC需要11個SRRA,但不同碼率不會同時出現(xiàn),所以只需設(shè)計35個SRAA即可。SRAA編碼電路如圖4所示。
圖4 SRAA編碼電路
設(shè)計中發(fā)現(xiàn),雖然每個SRAA中均設(shè)計有與門,但是由于是輸入數(shù)據(jù)與127 bit矩陣數(shù)據(jù)做與運算,結(jié)果不是127 bit的0,就是原矩陣數(shù)據(jù)。因此設(shè)計時不用刻意設(shè)計出與門,只需要利用Verilog語言的 If…else語句的特點,不加入else語句就會默認保持結(jié)果,即可完成設(shè)計。
每個單個的運算器完成以下功能:(1)獲取輸入待編碼數(shù)據(jù)比特和ROM數(shù)據(jù);(2)若輸入待編碼數(shù)據(jù)為1,則將ROM數(shù)據(jù)與結(jié)果寄存器中的數(shù)據(jù)按位異或后存入結(jié)果寄存器;若輸入為0,則什么也不做;(3)將ROM數(shù)據(jù)循環(huán)右移1位,同時將本次運算的輸入待編碼數(shù)據(jù)輸出給下一個運算器。運算器只需不停地實現(xiàn)以上3個功能,即可完成運算任務(wù)。外部數(shù)據(jù)輸入控制由數(shù)據(jù)輸入控制器完成。
下面以碼率為 0.4的 LDPC(7493,3048)碼為例,詳細說明運算過程。矩陣Gi,j如圖5所示。
圖5 SRAA陣列運算示意圖
第1個時鐘到來時:第1個比特進入運算器1,與進入鎖存器中的ROM首行127 bit數(shù)據(jù)(即G[0][0])做與運算,結(jié)果放入data_out臨時寄存器中,鎖存器中數(shù)據(jù)右移1位,同時將第1個比特輸出至運算器2的bit_in數(shù)據(jù)輸入線上。
第2個時鐘到來時:第2個比特進入運算器1,與已移位的鎖存器中數(shù)據(jù)(即國標文件中的G[0][1])做與運算,再與data_out中的數(shù)據(jù)做異或運算,并放入data_out中,鎖存器中的數(shù)據(jù)右移1位;同時運算器2完成上一步運算后,把第1個比特輸出至運算器3;運算器1把第2個比特輸出至運算器2中。
第3~35個時鐘完成如前兩步所示。
第36~127個時鐘到來時:ROM數(shù)據(jù)停止輸入,運算器繼續(xù)完成與鎖存器中移位數(shù)據(jù)的運算過程。
第128個時鐘到來時:ROM被輸入新數(shù)據(jù)(G[1][0]),完成一個小陣(127×127)的運算。
當運算器運算結(jié)束時,讀出運算結(jié)果,同時ROM地址復(fù)位,給運算器重新賦入數(shù)據(jù)(即G[0][0])。
得到的127×35=4445個數(shù)據(jù)為校驗位,輸出到127×24=3048 個原始數(shù)據(jù)前,組成 LDPC(7493,3048)碼。
5)FIFO控制器
該子模塊的任務(wù)是將最后一個運算器輸出的輸入數(shù)據(jù)按127 bit組合為一組,存入FIFO中,待校驗碼輸出完畢后輸出。
6)輸出控制器
在輸出控制器中,若輸出使能位被計數(shù)器控制器置1,則與輸出計數(shù)器同步運行,將每個運算器輸出的運算結(jié)果輸出至輸出口上。設(shè)計時僅需注意在輸出第一個127 bit校驗位時需要將indication輸出線輸出高電平,以便后級處理時使用。
編譯結(jié)果表明,整個信道編碼器占用了Altera的EP1S30B956C5芯片的12874個 (40%)邏輯單元與287060 bit(9%)存儲器。
在經(jīng)過時序仿真后,圖6的BCH編碼器輸出結(jié)果示意圖表明了輸出BCH編碼器運轉(zhuǎn)正常,按照程序設(shè)計的方式工作并輸出了正確的結(jié)果。
圖6 BCH編碼器輸出結(jié)果示意圖
LDPC輸出示意圖如圖7所示。address地址信號在使能信號輸入前2個時鐘周期將數(shù)據(jù)送入了ROM,完成了各個模塊的時鐘同步。每個時鐘周期下的數(shù)據(jù)準確無誤;各個約束條件都發(fā)生了作用,在合適的時刻控制地址線,完成了地址的輸入切換。所有的輸出結(jié)果都準確,時序正確;在編碼輸出的同時,與新一次的編碼運算銜接得很好。
測試與驗證主要是檢驗設(shè)計的信道編碼器能否準確、穩(wěn)定、快速地對每個輸入比特完成編碼。
圖7 LDPC輸出示意圖
將編譯通過的編碼器在Quartus II中加入邏輯分析儀后再編譯下載至芯片,連接測試數(shù)據(jù)輸入模塊,將編碼器的所有控制與數(shù)據(jù)信號加入邏輯分析儀中[4],然后將預(yù)設(shè)的數(shù)據(jù)輸入,檢查各個信號線的輸出是否正確;若各個信號無誤,則將芯片的工作頻率逐漸上調(diào),直到數(shù)據(jù)出現(xiàn)錯誤停止,測試最高工作頻率。
在測試過程中,每一步均采集了大量數(shù)據(jù),并與Matlab仿真的數(shù)據(jù)進行比較,并未發(fā)現(xiàn)誤碼,說明上述設(shè)計的信道編碼器能夠準確、穩(wěn)定、快速地對每個輸入比特完成編碼。工作頻率測試發(fā)現(xiàn)上述設(shè)計的信道編碼器的最高工作頻率為60 MHz,為了保證運算的準確性與穩(wěn)定性,正常使用時采用50 MHz時鐘工作,而實際需要的最高時鐘頻率為6×7.56 MHz=45.36 MHz,這說明所設(shè)計的編碼器完全滿足系統(tǒng)需要。
筆者提出了一種三碼率、低復(fù)雜度、可擴展的國標數(shù)字電視信道編碼器的結(jié)構(gòu),該編碼器可根據(jù)設(shè)定的編碼碼率,自動進行對應(yīng)碼率的數(shù)字電視發(fā)射機前端編碼工作。該結(jié)構(gòu)資源消耗低,配置簡單靈活,吞吐率大。
[1]GB 20600-2006,數(shù)字電視地面廣播傳輸系統(tǒng)幀結(jié)構(gòu),信道編碼和調(diào)制[S].北京:中國標準出版社,2006.
[2]楊抒文,彭克武,潘長勇.DTMB發(fā)射機LDPC編碼器的設(shè)計與優(yōu)化[J].電視技術(shù),2008,32(7):4-5.
[3]王文君,朱曉暄,康桂霞,等.結(jié)構(gòu)化LDPC碼的高速編譯碼器FPGA 實現(xiàn)[J].數(shù)據(jù)采集與處理,2008(23):113-118.
[4]齊志強,葛建華,尚文靜.地面數(shù)字電視國標編碼器設(shè)計與實現(xiàn)[J].電視技術(shù),2007,31(10): 35-36.