摘要:TS流是數(shù)字電視信號傳輸?shù)闹饕绞?,由于其采用的是廣播方式且信道中存在著許多干擾,因此是不可靠傳輸。為了保證數(shù)據(jù)的正確性,一般需要進行信道編碼。在發(fā)送端,TS流中通常采用的信道編碼方式是CRC校驗;在接收端進行譯碼。由于TS流數(shù)據(jù)量非常大,通常的軟件譯碼方法不能滿足要求。設計了一個基于FPGA的CRC譯碼器,速度快,并且具有很強的實時性。
關鍵詞:FPGA;TS流;CRC校驗;譯碼器
0 引言
隨著我國數(shù)字電視發(fā)展的越來越快,集成度越來越高,數(shù)據(jù)傳輸?shù)恼_性也變得越來越重要。而TS流作為數(shù)字電視傳輸?shù)闹饕绞?,其信號的正確性將直接影響到電視畫面的質(zhì)量以及各種數(shù)字電視業(yè)務的發(fā)展,如互聯(lián)網(wǎng)等。為了保證傳輸?shù)目煽啃裕鸵獙?shù)據(jù)加上CRC校驗碼,接收的時候?qū)ζ溥M行譯碼。當前的譯碼大多是在微處理器上用軟件來實現(xiàn)的,這樣的軟件譯碼方式速度比較慢,無法滿足高速大容量的的數(shù)字電視信道的要求。本文設計了一個基于FPGA的CRC譯碼器,通過查找表法進行譯碼,能夠達到很高的速度,具有很強的實時性。
1 TS流的結構
傳送流(Transport Stream,TS流),它是根據(jù)ITU-T Rec.H.222.0 | ISO/IEC 13818-2和ISO/IEC13818-3協(xié)議而定義的一種數(shù)據(jù)流,其目的是為了在有可能發(fā)生嚴重錯誤的情況下進行一道或多道程序編碼數(shù)據(jù)的傳送和存儲。傳送流由一道或多道節(jié)目組成,每道節(jié)目由一個或多個原始流和一些其他流復合在一起,包括視頻流、音頻流、節(jié)目特殊信息流(PSI)和其他數(shù)據(jù)包。TS流是數(shù)字電視信號的主要傳輸形式,TS流由許多的TS包組成,每個TS包的長度為188 B,它由包頭、自適應區(qū)、數(shù)據(jù)區(qū)三個部分組成,其中,每個TS包的有效信息占184 B,字節(jié)后面是4 B的CRC校驗碼。其結構如圖1所示。
2 系統(tǒng)總體設計
本系統(tǒng)采用了Altera公司的低成本低功耗的CycloneⅣ系列的EP4CE6E22C8N芯片,此芯片具有6 272個LE,還有270 KB的內(nèi)部存儲器,非常適合用來做CRC校驗。本系統(tǒng)采用了Verilog語言在FPGA上實現(xiàn)了UART的收發(fā)和CRC校驗的功能。
TS包的數(shù)據(jù)由串口發(fā)送至FPGA,在FPGA內(nèi)進行CRC校驗,當一個section的數(shù)據(jù)校驗完之后,又由UART發(fā)送出去??傮w框圖如圖2所示。
3 UART設計
UART的程序采用了自頂向下的分模塊設計方法,其功能模塊主要分為波特率產(chǎn)生模塊、起始位檢測模塊、發(fā)送模塊和接收模塊四部分。各個模塊分別編寫好并且仿真通過之后,再在頂層對其進行例化,使各個模塊能夠連接起來。
3.1 波特率產(chǎn)生模塊
設計采用的波特率為9 600 b/s,幀格式為1 b起始位,8 b數(shù)據(jù)位,無奇偶校驗位,1 b停止位。波特率的產(chǎn)生主要是使用累加的方法,當累加到一定值的時候,就給clk_bps一個時鐘的高電平,從而產(chǎn)生波特率。產(chǎn)生波特率的部分代碼如下:
波特率產(chǎn)生的RTL視圖如圖3所示。
3.2 起始位檢測模塊
起始位是UART傳輸數(shù)據(jù)的開始,因此起始位檢測的好壞至關重要,本設計采用了邊沿檢測技術來檢測起始位,當起始位的那個下降沿到來的時候,H2L_sig端口就會產(chǎn)生一個時鐘周期的高電平,為下面的接收做好準備,起始位檢測的部分代碼如下:
起始位的RTL視圖如圖4所示。
3.3 發(fā)送模塊
發(fā)送模塊主要功能就是將FIFO里8 b的數(shù)據(jù)按9 600 b/s波特率一位一位地發(fā)送出去,最后再加上停止位,其RTL視圖如圖5所示。
3.4 接收模塊
接收模塊的主要功能就是檢測到起始位后再在每個數(shù)據(jù)的中央位置進行采樣,接收完一幀數(shù)據(jù)后就放到接收FIFO里供CRC校驗模塊使用,其RTL視圖如圖6所示。
4 CRC校驗
CRC校驗有兩種方法:一種是按位來計算的,一種是按字節(jié)來計算的。按位來計算的占用FPGA邏輯資源比較少,但是相對來說速度會比較慢,不能適應高速的TS流的要求。按字節(jié)來運算的速度快,但是占用FPGA的邏輯資源多。綜合考慮后,這里使用按字節(jié)的算法。
本設計的CRC算法采用直驅(qū)動表法,由于一個字節(jié)只有8 b,與生成項進行異或后最多有256個結果,先將256個待查表的值生成MIF文件,放入由FPGA的IP核生成的ROM里,然后用查表法可以達到很快的運算速度,具有很強的實時性。其具體算法如下:
crc_reg<=crctab[crc_reg[31:24]^buffer[7:0]&8'hff]^{crc_reg[23:0],8'h0};
圖7是用model sire對CRC進行仿真的結果使用的是PSI表里的一個section的數(shù)據(jù),可以看到,校驗到最后的時候,crc_reg的值變?yōu)榱?,說明數(shù)據(jù)是正確的。
只要在接收FIFO里有數(shù)據(jù),CRC模塊就會將讀取數(shù)據(jù)進行CRC校驗。而每個PSI表里都有一個section_length是記錄在這個表里面從該字節(jié)之后有多個字節(jié)是有效數(shù)據(jù)的。所以,要將這個數(shù)據(jù)提取出來再加上3就得到了整個表的長度。在CRC校驗的時候,也要設置一個計數(shù)器,用于記錄處理多少個數(shù)據(jù),并與section_length比較。若這兩個數(shù)相同,則判斷CRC寄存器里的值;若為0,則說明這個數(shù)據(jù)段是正確的,通過串口發(fā)0x00給上位機;若CRC寄存器不為0,則說明這個數(shù)據(jù)斷是錯誤的,F(xiàn)PGA發(fā)送0x01給上位機。
CRC校驗處理的流程圖如圖8所示。
5 結論
本系統(tǒng)經(jīng)過實際驗證具有很高的準確性和實時性,并且在上位機和FPGA上都進行了校驗,可以驗證是否數(shù)據(jù)在串口傳輸?shù)倪^程發(fā)生了錯誤,其FPGA部分可以當作一個獨立的模塊加入到其他系統(tǒng)中,具有很強的實時性。





