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