moerjielovecookie

Sawen_Blog

一个普通工科牲的博客网站
x
github
follow
email

DVB-S系統設計報告

DVB 標準#

Digital Video Broadcasting(數字視頻廣播)是一個完整的數字電視解決方案,其中包括 DVB-C(數字電視有線傳輸標準),DVB-T(數字電視地面傳輸標準),DVB-S(數字電視衛星傳輸標準),下面主要介紹 DVB-S 系統。

DVB-S 為數字衛星廣播標準,衛星傳輸具有覆蓋面廣、節目容量大等優點。信號採用 RS (188,204) 和卷積碼的級聯編碼,調製方式為 QPSK。

DVB-S 信道編碼及調製的基本原理#

原理框圖#

根據 ETSI 的 DVB-S 標準,原理框圖如下所示

1717241147381.png

由於衛星提供的 DTH 服務特別受功率限制的影響,因此主要的設計目的應該為抗噪聲和干擾,而不是頻譜效率。為了在不過度損害頻譜效率的前提下實現很高的能量效率,系統應使用 QPSK 調製和卷積碼和 RS 碼的級聯。

接口#

2024after4202406012140085.png

信道編碼#

TS 流適配單元(adaptation)#

輸入的 TS 流根據 MPEG-2 格式按照固定的長度打包,數據包的長度為 188,幀頭為同步字 47hex47_{hex}。DVB-S 標準中要求每 8 個 TS 數據包組成一個超幀,將超幀中的 8 個同步頭進行反轉,變為b8hexb8_{hex},其餘的同步頭不變。同時還要自動插入空包,在數據包後插入 16 個 0,將長度為 188 的數據包包補充成長度為 204 的數據包,與後續的信道編碼模塊建立時鐘匹配和接口連接。

擾碼單元(energy dispersal)#

基帶信號中含有很多連 “1” 或者連 “0” 的現象,會導致基帶信號的頻譜中含有較多的低頻成分,既不利於信號在信道的傳輸,也不利於在接收端提取時鐘信號。因此採用擾碼,將 TS 流轉化成偽隨機序列。DVB-S 標準中的隨機化的原理圖如下:

2024after4202406012158761.png

偽隨機二進制序列的生成多項式如下:

1+x14+x151 + x^{14} + x^{15}

擾碼以 8 個數據包組成的超幀為單位進行處理,在每一個單元開始處理時,將序列100101010000000”100101010000000“裝入寄存器,對其進行擾碼處理。數據包的同步字不進行擾碼處理。

RS 編碼#

外碼採用 RS 編碼,其具有同時糾正隨機錯誤和突發錯誤的能力,並且糾正突發錯誤更有效。DVB-S 採用的編碼格式為 RS (239,255) 截斷而得到的 RS (188,204) 編碼,最大可糾錯長度為 8 個字節,編碼從同步字47hex47_{hex}b8hexb8_{hex}開始。

2024after4202406021124574.png

編碼原理簡述#

假設信息多項式為

m(x)=m187x187+m186x186++m1x1+m0m(x)=m_{187}x^{187}+m_{186}x^{186}+\cdots+m_1x^1+m_0

碼生成多項式為

g(x)=(x+a0)(x+a1)(x+a2)(x+a14)(x+a15)g(x)=(x+a^0)(x+a^1)(x+a^2)\cdots(x+a^{14})(x+a^{15})

其中的a=02hexa  = 02_{hex},則生成多項式的展開式為

g(x)=x16+59x15+13x14+104x13+189x12+68x11+209x10+30x9+8x8+163x7+65x6+41x5+229x4+98x3+50x2+36x+59g(x)=x^{16}+59x^{15}+13x^{14}+104x^{13}+189x^{12}+68x^{11}+209x^{10}\\\\+30x^{9}+8x^8+163x^7+65x^6+41x^5+229x^4+98x^3+50x^2+36x+59

x16m(x)x^{16}\cdot m(x)除以g(x)g(x)後,餘式為關於xx的 15 次多項式,其 16 個系數即為生成的 16 個校驗字節,將其添加到 188 長度的數據包後即可完成RS(188,204)RS(188,204)的編碼。

卷積交織#

在數字信號傳輸過程中,由於一些突發性干擾,會導致一連串的數據錯誤,很有可能超出 RS 碼的糾錯範圍。而卷積交織可以將錯誤的字符分散開,使得信道變成近似無記憶信道。DVB-S 中採用的是交織深度為 12 的卷積交織。交織和解交織的框圖如下:

2024after4202406021621696.png

卷積編碼#

內碼採用的是(2,1,7)(2,1,7)型的卷積碼,編碼效率為kn=12\frac{k}{n}=\frac{1}{2},由 6 個移位寄存器和 2 個模二加加法器構成,1 個 bit 信號生成 2 個 bit 的編碼信號,約束長度為 7。

2024after4202406021629604.png

當信道質量較好時可以對編碼信號進行删餘,提高信道利用率。

Matlab 仿真#

TS 流適配及擾碼模塊#

2024after4202406052140904.png

CLKdivide#

一路高清電視信號的碼率為8Mbps8Mbps,因此二進制信號的速率為8Mbps8Mbps,輸入的數據為uint8uint8類型,所以輸入的信號速率為1M1M。所以 CLKdivide 模塊將200MHz200MHz的時鐘分頻到1MHz1MHz8MHz8MHz

sigSource#

此模塊產生輸入的 TS 流信號,並且生成 RS 編碼的開始、結束和使能信號。由於每輸出一個 188 字節長度的數據包後要暫停輸出 TS 流插入空包,所以採用使能系統,每計數 188 次後拉低使能插入空包。

1717680505998.png

HeaderProcess#

此模塊對輸入的 TS 流進行速率轉換和組超幀,每八個數據包組合為一個超幀,並反轉第一個同步字,由0x470x47轉為0xb80xb8,並生成使能 sigSource 的信號。同時生成擾碼模塊的控制信號。

1717595838765.png

第一個 Multiport Switch 用來進行插入空包,第二個 Multiport Switch 用來反轉超幀的第一個同步字。

myScrambler#

根據擾碼的生成多項式進行設計。HeaderProcess 生成的擾碼使能信號正好在輸入同步字時拉低,不進行擾碼處理,擾碼復位信號在輸入了一個超幀後重新裝入初始序列”100101010000000“。

1717596010781.png

仿真數據#

1717596346825.png

RS 編碼模塊#

1717660503082.png

使用 HDL Coder 中的模塊,由於時鐘速率為200MHz200 MHz,因此需要加入一個觸發模塊,保證 RS 編碼是按照碼元速率RBR_B進行編碼。

卷積交織#

1717678715013.png

同樣加入觸發模塊,保證交織的速度為碼元速率RBR_B

uint8 轉 binary 模塊#

1717679814804.png

首先對輸入的數據按位相與,取出每一位的數據後使用 Multiport Switch 逐位輸出,計數器的使能速率為碼元速率 $R_B$ 的 8 倍。

卷積編碼#

1717680106902.png

不進行删餘的話,編碼效率為12\frac{1}{2}。也可以進行删餘,可以得到23345678\frac{2}{3}、\frac{3}{4}、\frac{5}{6}、\frac{7}{8}的編碼效率。在一定帶寬內,編碼效率越大傳輸效率越大,同時糾錯能力越差。

Vivado 實現#

Vivado 的代碼大部分都由 HDL Coder 生成,或者由 Matlab 生成系數文件,再導入到 Vivado 的 IP 核中。

2024after4202407102025567.svg

1717682059758.png

DataSource_Scrambler#

直接生成 hdl 代碼的話,DataSource_Scrambler 模塊中的 sigSource 模塊在200MHz200 MHz的頻率下建立時間的裕量不滿足時序,因此在生成 HDL 之前進行如下配置:

2024after4202406062201977.png

在輸出端加入一級流水線後,綜合布線後時序即可通過。同時在這個模塊的輸出信號處全部加上一個 delay 模塊組成流水線。

擾碼模塊#

1717850077215.png

可以看到每輸入 8 個數據包後,擾碼內部的 D 觸發器的初值得到重置,同時反轉後的同步字0xb80xb8沒有被擾碼處理。

數據對齊#

在仿真過程中,發現同步字0xb80xb8和 RS 編碼的使能信號沒有對齊,因此添加如下模塊:

1717914876682.png

在將輸出的使能信號延後一個數據周期,即可保證信號的同步。

RS 編碼#

將 modelsim 的數據導入到 matlab 進行解碼,可以看到將 188 個數據包完整的解了出來。

1717915096882.png

升餘弦滾降濾波器#

Matlab 濾波器設計#

根據 DVB-S 標準的要求,升餘弦滾降系數為0.350.35,使用 Matlab 的 filterDesigner 工具設計濾波器系數。

1717726664610.png

在 FPGA 中要對濾波器系數進行定點化處理。

對系數進行 32 位量化後幅值響應如下:

1717726986681.png

對系數進行 16 位量化後幅值響應如下:

1721734678137.png

可以看出 16 位量化的幅值響應和 32 位量化的響應幾乎一樣,為了節省空間,因此使用 16 位量化。

量化結束後點擊目標→Xilinx 系數文件 生成 coe 文件。

1717727667745.png

Vivado Fir 濾波器設計#

選擇 Source 為 COE FIle

2024after4202406071040715.png

輸入的採樣頻率要和時鐘頻率相等,不進行過採樣。

2024after4202406071042659.png

在 Implementation 中將系數類型選擇為有符號數,位寬設置為1616

2024after4202406071044904.png

輸入的信號為正負 1,所以輸入的位寬為 2,第一位為符號位。輸出模式設置為全精度。

1717728524290.png

波形#

1717728686099.png

使用 XDMA 進行數據的輸入和輸出採集#

2024after4202407102121277.png

2024after4202407102121462.png

結構框圖如上。

工程的總體結構如上所示,數據通過 XDMA 的 M_AXIS_H2C 接口寫入數據。由於寫入數據的位寬為128bit128bit,工程中信號處理部分的輸入位寬為 8bit,因此加入 AXISDataWidthConverter 模塊將位寬從 16BYTE 轉為 1BYTE,並寫入 FIFO,使用 AXIGPIO 模塊讀取 FIFO 的 almost full 信號,如果 FIFO 被寫滿,almost full 被拉高,就停止寫入數據。讀取 DVB-S 生成的 QPSK 信號時,由於經過了升餘弦滾降濾波和調製,信號的位寬已經較大,為了降低複雜度選擇將調製信號高位補零至 128bit 後經 M_AXIS_C2H 接口輸出到 Host 主機。

調試過程見

link_to_page

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。