由于MAX+PLUSII的老式宏函數(shù)中只提供了作4、5、8位和16位并串變換的移位寄存器 ,而此處系統(tǒng)完成的是9位并串變換(8位數(shù)據(jù)位加1位包同步位),因此必須自己編寫tdf文件,而不能直接調用宏函數(shù)。具體的功能實現(xiàn)為:
選擇使用9個D觸發(fā)器,將它們相互連通組成9位的移位寄存器。一旦產(chǎn)生輸入FIFO的半滿信號(HF),模塊開始工作,將輸入FIFO中的9位并行數(shù)據(jù)讀入移位寄存器中,在CLK38的工作時鐘控制下,將9位數(shù)據(jù)順序串行移出產(chǎn)生S_DATA(TS流串行數(shù)據(jù))。并且,在模塊中還設置了一個4位計數(shù)器A。計數(shù)器A同樣在CLK38的工作時鐘控制下,整體模塊開始工作時開始同步計數(shù)。每計數(shù)到9時計數(shù)器清0,并輸出一個高電平信號。而在其他計數(shù)值時,該信號輸出為低電平。那么,產(chǎn)生的這個信號就是TS流的串行數(shù)據(jù)包同步信號(P_CLK)。而TS流串行數(shù)據(jù)的時鐘信號(S_CLK),很顯然就是CLK38。

此外,將CLK38時鐘進行8分頻作為輸入FIFO的讀時鐘信號(FIFO_R_CLK)。而輸入FIFO讀時鐘的控制信號(CLK_CONTROL),則由模塊中設置的另外一個計數(shù)器B來產(chǎn)生,確保輸入FIFO一次半滿后,F(xiàn)PGA只從其中讀取該FIFO最大容量之一半的數(shù)據(jù)。例如:在本系統(tǒng)中,輸入FIFO的最大容量為512個字節(jié)。那么,設置的計數(shù)器B就必須是一個9位計數(shù)器。計數(shù)器的計數(shù)時鐘為FIFO_R_CLK,從輸入FIFO半滿,F(xiàn)PGA啟動讀數(shù)時開始計數(shù)。每計數(shù)到256(輸入FIFO容量的一半)時計數(shù)器清0,并將輸入FIFO讀時鐘的控制信號(CLK_CONTROL)置為低電平,從而禁止再產(chǎn)生輸入FIFO讀時鐘信號。
3、PCR補償計數(shù)模塊
根據(jù)MPEGII標準,TS流中的PCR域共有42位有效碼字,由兩部分組成:一部分以系統(tǒng)參考時鐘的1/300(90KHZ)為單位,稱為program_clock_reference_base,33字段;另一部分稱為program_clock_reference_extension, 以系統(tǒng)參考時鐘(27MHz)為單位的9位字段。
因此,整個PCR補償計數(shù)模塊分為兩大部分:一部分是9位字段(E0~E8)的PCR域補償計數(shù)模塊,由一個8位計數(shù)器(調用宏函數(shù)8COUNT)和一個4位計數(shù)器(調用宏函數(shù)74161)組成。其中,8COUNT的計數(shù)時鐘為27MHz時鐘(由硬件電路中的27MHz晶振提供);而74161的計數(shù)時鐘則為8COUNT提供的最高位進位時鐘(由8COUNT中的最高位E7取反后得到);另一部分為33位字段(Q32~Q0)的PCR域補償計數(shù)模塊,由4個8位計數(shù)器(調用宏函數(shù)8COUNT)和一個4位計數(shù)器(調用宏函數(shù)74161)組成。其中,74161的計數(shù)時鐘為27MHz時鐘300分頻后得到的90KHZ時鐘,它只對33位字段中的位Q0進行補償計數(shù)。第一個8COUNT的計數(shù)時鐘為74161的Q0位的進位時鐘(由Q0取反后得到);而其他3個8COUNT的計數(shù)時鐘則分別為前一個8COUNT的進位時鐘(即分別由Q8,Q16,Q24取反后得到)。
4、復用系統(tǒng)FPGA邏輯設計中一些技巧

在該系統(tǒng)FPGA邏輯設計過程中,由于系統(tǒng)結構比較復雜,整個FPGA邏輯設計也比較大,所以在作邏輯設計時,一般應有一個整體的考慮。具體作設計時,應該采用層次化的結構設計。另外,還必須結合整個系統(tǒng)的特點,有意識的對FPGA中邏輯設計進行優(yōu)化和精簡。例如:檢測TS數(shù)據(jù)流的包同步字0X47,由于該同步頭字節(jié)并不是唯一的,中間可能有碼字也恰為其值。因此,一般情況下,F(xiàn)PGA搜索同步碼字的邏輯如下:首先找到第一個0X47,然后進行計數(shù),計到187字節(jié)后,再檢測是否為0X47,如果是,輸出包同步信號;接著每隔187檢測一次,如是0X47,則繼續(xù)輸出包同步信號,如不是,則從事開始搜索0X47。
而在該系統(tǒng)的設計中,并沒有采用這種方法,而是利用了I/O FIFO的9比特特性,F(xiàn)PGA直接搜索9位包同步字節(jié)0X147。另外,在PCR域補償計數(shù)的模塊中,也存在一個PCR域確認的問題。PCR域的長度為6個字節(jié)48位碼字(42位有效碼字加6位保留位),在FPGA已經(jīng)裝載PCR域的初值后,完全可以將PCR域中的6個字節(jié)改為預先設定好的協(xié)議碼字(當然,它們必須對于碼流而言是唯一的)。這樣,在TS碼流輸出端進行將補償計數(shù)后的PCR數(shù)值重新裝載進PCR域的工作時,F(xiàn)PGA不僅能夠很方便的識別出PCR域的具體位置,而且還可以從這些協(xié)議碼字中讀出較多的復用信息。
簡潔而有效的FPGA邏輯設計,可以使系統(tǒng)運行的穩(wěn)定性得到很大的改善。