黨宏社,方 鑫
(陜西科技大學 電氣與信息工程學院,陜西 西安 710021)
中國地面數字電視廣播傳輸標準GB20600-2006(以下簡稱“國標”)適用于地面傳輸的數字多路電視/高清晰度電視固定和移動廣播業務的幀結構、信道編碼和調制系統。國標中的信道編碼部分采用了BCH(外碼)+QC-LDPC(內碼)的級聯糾錯編碼技術,使誤碼糾錯能力和信號調制性能更高,系統抗干擾能力更強[1]。其內碼采用了非規則的QC-LDPC碼,性能更加接近隨機非規則的LDPC碼。
信道編碼器作為發射機的重要組成部分,設計十分關鍵。而信道編碼器中的LDPC編碼器必須能夠進行3種碼率的編碼工作,FPGA實現占用資源較多,對系統的成本和復雜度有重要影響,設計難度較高。因此設計的重點與難點就是要在滿足系統要求的基礎上,盡可能地降低資源的消耗,達到資源消耗與系統性能的平衡。
BCH+QC-LDPC級連糾錯原理如圖1所示,TS碼流輸入分組模塊后,由模塊分組并產生每組的數據使能信號后輸入下一級。根據國標要求,信道編碼器分為外碼編碼器BCH與內碼編碼器LDPC兩部分,兩級編碼器中還添加了一個刪除前261 bit的0并按照碼率組織數據的結構,其作用是用于編碼數據長度切換,以便達到更好的編碼效率。編碼器模塊工作時鐘為50 MHz,由一個板載50 MHz晶振產生。

圖1 BCH+QC-LDPC級連糾錯原理圖
根據國標,BCH(762,752)碼由 BCH(1023,1013)系統碼縮短而成,該BCH碼生成多項式為GBCH(x)=1+x3+x10,可知編碼器共需10個移位寄存器。BCH編碼器結構如圖2所示。

圖2 BCH編碼器結構圖
開關A:前752個時鐘周期閉合,使數據輸入編碼器,進行BCH編碼;后10個時鐘周期斷開,輸出10 bit校驗位。開關B:前752個時鐘周期向下,輸入數據輸出;后10個時鐘周期向上,輸出10 bit校驗位。
每個周期BCH編碼器完成一次長度為1023的編碼運算,然后接受下一次數據輸入,進行下次編碼。
LDPC碼的生成矩陣Gqc的結構為[1]

式中:I是 b×b 階單位矩陣;O 是 b×b 階零陣;Gi,j是 b×b階循環矩陣,取 0≤i≤k-1,0≤j≤c-1。
LDPC 碼由循環矩陣Gi,j生成。
LDPC編碼器是整個信道編碼器的核心[2-3],設計規模大,因此采用了自頂向下的設計方法,將這個編碼器劃分為6個子模塊:計數器控制器,數據輸入控制器,ROM總線控制器,運算器陣列,FIFO控制器和輸出控制器。LDPC編碼器的整體結構圖如圖3所示。

圖3 LDPC編碼器結構圖
LDPC編碼器各個部分及其功能如下:
1)計數器控制器
計數器控制器控制整個編碼器內部的工作時序。該子模塊包含3個計數器:count_127運算計數器、count_row行列計數器和count_output輸出計數器。運算計數器對運算器每次載入新Gi,j首行數據后的運算次數進行計數,每溢出一次代表完成了一次行運算;行列計數器對行運算的次數進行計數,每溢出一次代表完成了一次編碼;輸出計數器對輸出字進行計數,每溢出一次代表完成了一次編碼結果輸出。
2)數據輸入控制器
該子模塊完成對運算器陣列的輸入數據的時序控制,同時產生ROM地址數據并對其進行約束。
在仿真測試中發現了兩個問題:
(1)ROM地址數據不能與輸入數據同步,必須比輸入數據提前2個時鐘周期出現在總線上,否則會造成數據錯位。原因在于ROM從讀取地址到輸出數據需要2個時鐘周期。由于ROM地址數據無法提前,因此設計時將輸入數據進行了2個時鐘周期的延時,達到了相同的設計效果。
(2)ROM必須使用CLK全局時鐘的下降沿工作,否則會造成ROM讀取地址數據時,恰好是地址正在變化的不穩定時刻,造成數據讀取錯誤。解決辦法是對CLK時鐘進行反向后提供給ROM,這樣讓ROM讀取地址的時刻延遲了半個時鐘周期,解決了數據讀取錯誤問題。
3)ROM總線控制器
該子模塊只需按照輸入的碼率設定值將對應碼率的ROM數據讀入數據總線即可。
4)運算器陣列
運算器陣列由35個運算器串聯組成,使用時根據不同的碼率選擇不同數目的運算器組成陣列進行運算。每1個運算器在使用過輸入數據后,將輸入數據保持后從數據輸出口向后一級運算器輸出。每個運算器可通過1個移位寄存器累加(SRAA)電路構成,采用反饋移位寄存器與邏輯門設計編碼器電路實現。0.4碼率LDPC需要 35個 SRAA,0.6碼率 LDPC需要 23個 SRAA,0.8碼率LDPC需要11個SRRA,但不同碼率不會同時出現,所以只需設計35個SRAA即可。SRAA編碼電路如圖4所示。

圖4 SRAA編碼電路
設計中發現,雖然每個SRAA中均設計有與門,但是由于是輸入數據與127 bit矩陣數據做與運算,結果不是127 bit的0,就是原矩陣數據。因此設計時不用刻意設計出與門,只需要利用Verilog語言的 If…else語句的特點,不加入else語句就會默認保持結果,即可完成設計。
每個單個的運算器完成以下功能:(1)獲取輸入待編碼數據比特和ROM數據;(2)若輸入待編碼數據為1,則將ROM數據與結果寄存器中的數據按位異或后存入結果寄存器;若輸入為0,則什么也不做;(3)將ROM數據循環右移1位,同時將本次運算的輸入待編碼數據輸出給下一個運算器。運算器只需不停地實現以上3個功能,即可完成運算任務。外部數據輸入控制由數據輸入控制器完成。
下面以碼率為 0.4的 LDPC(7493,3048)碼為例,詳細說明運算過程。矩陣Gi,j如圖5所示。

圖5 SRAA陣列運算示意圖
第1個時鐘到來時:第1個比特進入運算器1,與進入鎖存器中的ROM首行127 bit數據(即G[0][0])做與運算,結果放入data_out臨時寄存器中,鎖存器中數據右移1位,同時將第1個比特輸出至運算器2的bit_in數據輸入線上。
第2個時鐘到來時:第2個比特進入運算器1,與已移位的鎖存器中數據(即國標文件中的G[0][1])做與運算,再與data_out中的數據做異或運算,并放入data_out中,鎖存器中的數據右移1位;同時運算器2完成上一步運算后,把第1個比特輸出至運算器3;運算器1把第2個比特輸出至運算器2中。
第3~35個時鐘完成如前兩步所示。
第36~127個時鐘到來時:ROM數據停止輸入,運算器繼續完成與鎖存器中移位數據的運算過程。
第128個時鐘到來時:ROM被輸入新數據(G[1][0]),完成一個小陣(127×127)的運算。
當運算器運算結束時,讀出運算結果,同時ROM地址復位,給運算器重新賦入數據(即G[0][0])。
得到的127×35=4445個數據為校驗位,輸出到127×24=3048 個原始數據前,組成 LDPC(7493,3048)碼。
5)FIFO控制器
該子模塊的任務是將最后一個運算器輸出的輸入數據按127 bit組合為一組,存入FIFO中,待校驗碼輸出完畢后輸出。
6)輸出控制器
在輸出控制器中,若輸出使能位被計數器控制器置1,則與輸出計數器同步運行,將每個運算器輸出的運算結果輸出至輸出口上。設計時僅需注意在輸出第一個127 bit校驗位時需要將indication輸出線輸出高電平,以便后級處理時使用。
編譯結果表明,整個信道編碼器占用了Altera的EP1S30B956C5芯片的12874個 (40%)邏輯單元與287060 bit(9%)存儲器。
在經過時序仿真后,圖6的BCH編碼器輸出結果示意圖表明了輸出BCH編碼器運轉正常,按照程序設計的方式工作并輸出了正確的結果。

圖6 BCH編碼器輸出結果示意圖
LDPC輸出示意圖如圖7所示。address地址信號在使能信號輸入前2個時鐘周期將數據送入了ROM,完成了各個模塊的時鐘同步。每個時鐘周期下的數據準確無誤;各個約束條件都發生了作用,在合適的時刻控制地址線,完成了地址的輸入切換。所有的輸出結果都準確,時序正確;在編碼輸出的同時,與新一次的編碼運算銜接得很好。
測試與驗證主要是檢驗設計的信道編碼器能否準確、穩定、快速地對每個輸入比特完成編碼。

圖7 LDPC輸出示意圖
將編譯通過的編碼器在Quartus II中加入邏輯分析儀后再編譯下載至芯片,連接測試數據輸入模塊,將編碼器的所有控制與數據信號加入邏輯分析儀中[4],然后將預設的數據輸入,檢查各個信號線的輸出是否正確;若各個信號無誤,則將芯片的工作頻率逐漸上調,直到數據出現錯誤停止,測試最高工作頻率。
在測試過程中,每一步均采集了大量數據,并與Matlab仿真的數據進行比較,并未發現誤碼,說明上述設計的信道編碼器能夠準確、穩定、快速地對每個輸入比特完成編碼。工作頻率測試發現上述設計的信道編碼器的最高工作頻率為60 MHz,為了保證運算的準確性與穩定性,正常使用時采用50 MHz時鐘工作,而實際需要的最高時鐘頻率為6×7.56 MHz=45.36 MHz,這說明所設計的編碼器完全滿足系統需要。
筆者提出了一種三碼率、低復雜度、可擴展的國標數字電視信道編碼器的結構,該編碼器可根據設定的編碼碼率,自動進行對應碼率的數字電視發射機前端編碼工作。該結構資源消耗低,配置簡單靈活,吞吐率大。
[1]GB 20600-2006,數字電視地面廣播傳輸系統幀結構,信道編碼和調制[S].北京:中國標準出版社,2006.
[2]楊抒文,彭克武,潘長勇.DTMB發射機LDPC編碼器的設計與優化[J].電視技術,2008,32(7):4-5.
[3]王文君,朱曉暄,康桂霞,等.結構化LDPC碼的高速編譯碼器FPGA 實現[J].數據采集與處理,2008(23):113-118.
[4]齊志強,葛建華,尚文靜.地面數字電視國標編碼器設計與實現[J].電視技術,2007,31(10): 35-36.