DVB 標準#
Digital Video Broadcasting(數字視頻廣播)是一個完整的數字電視解決方案,其中包括 DVB-C(數字電視有線傳輸標準),DVB-T(數字電視地面傳輸標準),DVB-S(數字電視衛星傳輸標準),下面主要介紹 DVB-S 系統。
DVB-S 為數字衛星廣播標準,衛星傳輸具有覆蓋面廣、節目容量大等優點。信號採用 RS (188,204) 和卷積碼的級聯編碼,調製方式為 QPSK。
DVB-S 信道編碼及調製的基本原理#
原理框圖#
根據 ETSI 的 DVB-S 標準,原理框圖如下所示
由於衛星提供的 DTH 服務特別受功率限制的影響,因此主要的設計目的應該為抗噪聲和干擾,而不是頻譜效率。為了在不過度損害頻譜效率的前提下實現很高的能量效率,系統應使用 QPSK 調製和卷積碼和 RS 碼的級聯。
接口#
信道編碼#
TS 流適配單元(adaptation)#
輸入的 TS 流根據 MPEG-2 格式按照固定的長度打包,數據包的長度為 188,幀頭為同步字 。DVB-S 標準中要求每 8 個 TS 數據包組成一個超幀,將超幀中的 8 個同步頭進行反轉,變為,其餘的同步頭不變。同時還要自動插入空包,在數據包後插入 16 個 0,將長度為 188 的數據包包補充成長度為 204 的數據包,與後續的信道編碼模塊建立時鐘匹配和接口連接。
擾碼單元(energy dispersal)#
基帶信號中含有很多連 “1” 或者連 “0” 的現象,會導致基帶信號的頻譜中含有較多的低頻成分,既不利於信號在信道的傳輸,也不利於在接收端提取時鐘信號。因此採用擾碼,將 TS 流轉化成偽隨機序列。DVB-S 標準中的隨機化的原理圖如下:
偽隨機二進制序列的生成多項式如下:
擾碼以 8 個數據包組成的超幀為單位進行處理,在每一個單元開始處理時,將序列裝入寄存器,對其進行擾碼處理。數據包的同步字不進行擾碼處理。
RS 編碼#
外碼採用 RS 編碼,其具有同時糾正隨機錯誤和突發錯誤的能力,並且糾正突發錯誤更有效。DVB-S 採用的編碼格式為 RS (239,255) 截斷而得到的 RS (188,204) 編碼,最大可糾錯長度為 8 個字節,編碼從同步字或開始。
編碼原理簡述#
假設信息多項式為
碼生成多項式為
其中的,則生成多項式的展開式為
將除以後,餘式為關於的 15 次多項式,其 16 個系數即為生成的 16 個校驗字節,將其添加到 188 長度的數據包後即可完成的編碼。
卷積交織#
在數字信號傳輸過程中,由於一些突發性干擾,會導致一連串的數據錯誤,很有可能超出 RS 碼的糾錯範圍。而卷積交織可以將錯誤的字符分散開,使得信道變成近似無記憶信道。DVB-S 中採用的是交織深度為 12 的卷積交織。交織和解交織的框圖如下:
卷積編碼#
內碼採用的是型的卷積碼,編碼效率為,由 6 個移位寄存器和 2 個模二加加法器構成,1 個 bit 信號生成 2 個 bit 的編碼信號,約束長度為 7。
當信道質量較好時可以對編碼信號進行删餘,提高信道利用率。
Matlab 仿真#
TS 流適配及擾碼模塊#
CLKdivide#
一路高清電視信號的碼率為,因此二進制信號的速率為,輸入的數據為類型,所以輸入的信號速率為。所以 CLKdivide 模塊將的時鐘分頻到和。
sigSource#
此模塊產生輸入的 TS 流信號,並且生成 RS 編碼的開始、結束和使能信號。由於每輸出一個 188 字節長度的數據包後要暫停輸出 TS 流插入空包,所以採用使能系統,每計數 188 次後拉低使能插入空包。
HeaderProcess#
此模塊對輸入的 TS 流進行速率轉換和組超幀,每八個數據包組合為一個超幀,並反轉第一個同步字,由轉為,並生成使能 sigSource 的信號。同時生成擾碼模塊的控制信號。
第一個 Multiport Switch 用來進行插入空包,第二個 Multiport Switch 用來反轉超幀的第一個同步字。
myScrambler#
根據擾碼的生成多項式進行設計。HeaderProcess 生成的擾碼使能信號正好在輸入同步字時拉低,不進行擾碼處理,擾碼復位信號在輸入了一個超幀後重新裝入初始序列”100101010000000“。
仿真數據#
RS 編碼模塊#
使用 HDL Coder 中的模塊,由於時鐘速率為,因此需要加入一個觸發模塊,保證 RS 編碼是按照碼元速率進行編碼。
卷積交織#
同樣加入觸發模塊,保證交織的速度為碼元速率。
uint8 轉 binary 模塊#
首先對輸入的數據按位相與,取出每一位的數據後使用 Multiport Switch 逐位輸出,計數器的使能速率為碼元速率 $R_B$ 的 8 倍。
卷積編碼#
不進行删餘的話,編碼效率為。也可以進行删餘,可以得到的編碼效率。在一定帶寬內,編碼效率越大傳輸效率越大,同時糾錯能力越差。
Vivado 實現#
Vivado 的代碼大部分都由 HDL Coder 生成,或者由 Matlab 生成系數文件,再導入到 Vivado 的 IP 核中。
DataSource_Scrambler#
直接生成 hdl 代碼的話,DataSource_Scrambler 模塊中的 sigSource 模塊在的頻率下建立時間的裕量不滿足時序,因此在生成 HDL 之前進行如下配置:
在輸出端加入一級流水線後,綜合布線後時序即可通過。同時在這個模塊的輸出信號處全部加上一個 delay 模塊組成流水線。
擾碼模塊#
可以看到每輸入 8 個數據包後,擾碼內部的 D 觸發器的初值得到重置,同時反轉後的同步字沒有被擾碼處理。
數據對齊#
在仿真過程中,發現同步字和 RS 編碼的使能信號沒有對齊,因此添加如下模塊:
在將輸出的使能信號延後一個數據周期,即可保證信號的同步。
RS 編碼#
將 modelsim 的數據導入到 matlab 進行解碼,可以看到將 188 個數據包完整的解了出來。
升餘弦滾降濾波器#
Matlab 濾波器設計#
根據 DVB-S 標準的要求,升餘弦滾降系數為,使用 Matlab 的 filterDesigner 工具設計濾波器系數。
在 FPGA 中要對濾波器系數進行定點化處理。
對系數進行 32 位量化後幅值響應如下:
對系數進行 16 位量化後幅值響應如下:
可以看出 16 位量化的幅值響應和 32 位量化的響應幾乎一樣,為了節省空間,因此使用 16 位量化。
量化結束後點擊目標→Xilinx 系數文件 生成 coe 文件。
Vivado Fir 濾波器設計#
選擇 Source 為 COE FIle
輸入的採樣頻率要和時鐘頻率相等,不進行過採樣。
在 Implementation 中將系數類型選擇為有符號數,位寬設置為。
輸入的信號為正負 1,所以輸入的位寬為 2,第一位為符號位。輸出模式設置為全精度。
波形#
使用 XDMA 進行數據的輸入和輸出採集#
結構框圖如上。
工程的總體結構如上所示,數據通過 XDMA 的 M_AXIS_H2C 接口寫入數據。由於寫入數據的位寬為,工程中信號處理部分的輸入位寬為 8bit,因此加入 AXISDataWidthConverter 模塊將位寬從 16BYTE 轉為 1BYTE,並寫入 FIFO,使用 AXIGPIO 模塊讀取 FIFO 的 almost full 信號,如果 FIFO 被寫滿,almost full 被拉高,就停止寫入數據。讀取 DVB-S 生成的 QPSK 信號時,由於經過了升餘弦滾降濾波和調製,信號的位寬已經較大,為了降低複雜度選擇將調製信號高位補零至 128bit 後經 M_AXIS_C2H 接口輸出到 Host 主機。
調試過程見