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