引言
隨著多媒體技術及通信技術的快速發(fā)展,在嵌入式平臺上實現(xiàn)連續(xù)圖像壓縮的需求已變得日益廣泛。常用的系統(tǒng)結構是獨立處理器配和專用圖像壓縮芯片或者是只用一個高主頻的數(shù)字信號處理器完成主要功能。但隨著大規(guī)模集成電路技術的發(fā)展及市場對產(chǎn)品低成本的要求不斷提高,一種新的在嵌入式平臺上實現(xiàn)連續(xù)圖像壓縮的系統(tǒng)結構正逐步成為上述兩種系統(tǒng)結構的替代者。這種新的結構就是Altera公司提出的基于Avalon總線的SOPC結構。SOPC結構可以把處理器,圖像壓縮IP核,通訊單元及控制單元集成到一塊FPGA芯片上。較之以往的結構,不但極大地節(jié)約了系統(tǒng)資源和成本,更是減少了系統(tǒng)的復雜度。尤其是可以用硬件電路實現(xiàn)軟件處理極為耗時的運算功能,使得在低主頻,低功耗的嵌入式平臺上實現(xiàn)連續(xù)圖像實時壓縮變?yōu)榭赡?。連續(xù)圖像壓縮IP核也成為整個SOPC系統(tǒng)的一個關鍵部件?,F(xiàn)有的MPEG系列,H26X系列IP核對FPGA的芯片資源及性能要求極高,難以滿足系統(tǒng)對低成本,低功耗的要求。所以設計一個適合低成本,低功耗的FPGA芯片的視頻壓縮IP核變得極為重要。這即要求壓縮算法的復雜度不能太高,又要求有適當?shù)膲嚎s效果,Motion JPEG算法恰好滿足上述要求。
1.Motion JPEG壓縮算法簡介
Motion JPEG是一種基于靜態(tài)圖像JPEG壓縮標準的動態(tài)圖像壓縮標準,壓縮時將連續(xù)圖像的每一個幀視為一幅靜止圖像進行壓縮,從而可以生成序列化運動圖像。壓縮時不對幀間的時間冗余進行壓縮,雖然降低了壓縮比,但也同時降低了復雜度,易于硬件電路實現(xiàn)。Motion JPEG標準所根據(jù)的算法是基于離散余弦變換和熵編碼,關鍵技術有二維離散余弦變換、量化、差分編碼、霍夫曼編碼和游程編碼等。單幀的處理過程如下圖所示。
2.IP核的結構設計
2.1二維離散余弦變換模塊
二維離散余弦變換是由一維離散余弦變換衍生而來的,所以可以用兩個級聯(lián)的一維離散余弦變換實現(xiàn)。實現(xiàn)時要注意第一級一維離散余弦變換模塊產(chǎn)生的結果不能直接作為第二級一維離散余弦變換模塊的輸入量,而是等到第一級一維離散余弦變換模塊產(chǎn)生的結果形成一個8×8的矩陣后,對這個8×8的矩陣做轉置處理,再把轉置后得到的矩陣按行掃描的順序輸出,這時輸出的數(shù)據(jù)才能作為第二級一維離散余弦變換模塊的輸入量。
二維離散余弦變換模塊處理的對象是8×8的像素矩陣,來自其前一級模塊預處理模塊。預處理模塊一個時鐘周期只能輸出一個數(shù)據(jù),為了滿足二維離散余弦變換模塊中第一級一維離散余弦變換模塊一次運算需要8個輸入數(shù)據(jù)的要求,利用一個串行轉并行模塊,把每個時鐘周期內預處理模塊輸出的一個數(shù)據(jù)緩存起來,當數(shù)據(jù)湊滿8個后再一次傳給二維離散余弦變換模塊。
二維離散余弦變換模塊輸出的數(shù)據(jù)是8×8的二維離散余弦系數(shù)矩陣,傳遞給其后一級模塊量化模塊。量化模塊一個時鐘周期只能接收一個數(shù)據(jù),為了滿足二維離散余弦變換模塊中第二級一維離散余弦變換模塊一次運算產(chǎn)生8個輸出數(shù)據(jù)的條件,使用一個并行轉串行模塊,把每隔8個時鐘周期二維離散余弦變換模塊輸出一次的8個數(shù)據(jù)緩存起來,在等待下一次二維離散余弦變換模塊輸出數(shù)據(jù)的8個時鐘周期的等待隔內,把數(shù)據(jù)串行傳給量化模塊。
2.1.1第一級一維離散余弦變換模塊
根據(jù)一維離散余弦變換的定義和cos函數(shù)的互補對稱性,參考Weiping Li提出的Skew Circular Convolution的概念,能夠使一維離散余弦變換達到非常精簡的硬件架構。但是考慮到處理的對像是連續(xù)幀這個條件,速度就成為主要因素,因此沒有完全依照其提出的方法,而是適當?shù)脑黾与娐访娣e來夠造新的11階全流水線結構,從而獲得最大的運算速度。處理過程可劃分為4個階段。
階段1:消耗3個時鐘周期,完成8位有符號數(shù)的加減運算,結果為9位有符號數(shù)。
階段2:消耗2個時鐘周期,完成9位有符號數(shù)的固定系數(shù)乘法,因為乘的系數(shù)是小數(shù),所以要把小數(shù)轉換為二進制表示。
階段2中的乘法操作是用EP2C35芯片中的28個嵌入式乘法單元實現(xiàn)的。EP2C35芯片中共有70個嵌入式乘法單元,一個嵌入式乘法單元可以實現(xiàn)兩個9位數(shù)的乘法,兩個嵌入式乘法單元并聯(lián)可以實現(xiàn)兩個大于9位小于18位數(shù)的乘法。根據(jù)這一特性,假如在階段1中實現(xiàn)乘法會因輸入量是8位而浪費了一個嵌入式乘法單元的全部能力,假如在階段3或階段4中實現(xiàn)乘法又會因輸入量或系數(shù)中每個元素的長度大于9位而耗用兩個嵌入式乘法單元去完成一個乘法操作,又很不經(jīng)濟。所以在階段2中實現(xiàn)乘法操作是最為合理的,階段2的輸入量為9位,恰好耗用一個個嵌入式乘法單元。這也同時要求乘法中的固定系數(shù)的位數(shù)為9位,位數(shù)的過多或過少都不能充分利用芯片上的硬件資源。
階段3:消耗3個時鐘周期完成9位有符號數(shù)的加減運算,結果為9位有符號數(shù)。一般的9位有符號數(shù)的加減的結果應該用10位有符號數(shù)來表示,因為進位操作或借位操作導致結果的位數(shù)從9位增長到10位。但是階段3的輸入序列是由9位有符號數(shù)乘以固定系數(shù)得到的,且固定系數(shù)的值都小于0.5,所以序列之間的加減操作不會引起進位操作或借位操作,9位有符號數(shù)足夠表示加減操作的結果序列。
階段4:消耗3個時鐘周期完成9位有符號數(shù)的加減運算,結果為10位有符號數(shù),也是第一級一維離散余弦變換的最終結果。
2.1.2并行矩陣轉置模塊
常用的8×8矩陣轉置的方法是,先把64個矩陣元素按行掃描的順序一個個串行輸入到一個RAM(64個存儲空間)中,然后按轉置后的矩陣的行掃描順序把RAM中64個矩陣元素逐次輸出。這種方法最少需要128時鐘周期才能完成一個8×8矩陣的轉置??煞Q其為串行矩陣轉置。串行矩陣轉置一次接收一個輸入數(shù)據(jù)與一維離散余弦變換一次產(chǎn)生8個輸入數(shù)據(jù)在傳輸速率上不匹配,第一級一維離散余弦變換模塊需要在串行矩陣轉置工作期間等待,當串行矩陣轉置完成后再產(chǎn)生新的一維離散余弦變換系數(shù)并傳遞給串行矩陣轉置模塊。這也是二維離散余弦變換難以設計為全并行的原因。
本文提出了一種新的矩陣轉置方法,稱為其并行矩陣轉置。用8個RAM(每個RAM有8個存儲空間)代替一個RAM(有64個存儲空間),再增加兩個8通道的旋轉多路器,同時配合對8個RAM的變址讀操作。一次輸入原始矩陣的一列,20個周期后完成一個8×8矩陣的轉置。比串行矩陣轉置節(jié)省至少100個時鐘周期。
并行矩陣轉置模塊的寫操作:每個時鐘周期變換一次RAM_BANK的接入順序,每個RAM_BANK每次寫入地址隨時鐘周期而順序遞增從,0增加到7,每次增加1。
并行矩陣轉置模塊的讀操作:每個時鐘周期變換一次RAM_BANK的輸出順序,每個RAM_BANK每次讀出地址隨時鐘周期而變化,且同一時鐘周期內不同的RAM_BANK有不同的讀出地址。
在實際設計時,通過接入旋轉多路器實現(xiàn)每個時鐘周期改變第一級一維離散余弦變換輸出端與RAM_BANK的接入順序,通過輸出旋轉多路器實現(xiàn)每個時鐘周期改變一次RAM_BANK與第二級一維離散余弦變換輸入端的接入順序。這兩個旋轉多路器,都是以8個時鐘周期為1個旋轉周期,在1個旋轉周期內實現(xiàn)8個通道的旋轉接通。每個RAM_BANK的讀寫地址都依靠同一個地址產(chǎn)生器產(chǎn)生,在一個時鐘周期內所有RAM_BANK的寫地址相同,讀地址不同。
在設計具體的硬件電路時,一個RAM_BANK就是一個雙端口RAM,為提高工作效率,每個RAM_BANK實際含有32個存儲單元而不是理論上的8個存儲單元。這樣一個RAM_BANK就可以分為4個區(qū)塊,每個區(qū)塊8個存儲單元,在寫入一個區(qū)塊的同時可以讀出前一個已經(jīng)寫入數(shù)據(jù)的區(qū)塊,形成一種乒乓緩沖的結構,用電路面積換取運行效率。整個矩陣轉置模塊是一個13階的流水線結構,每階流水耗用一個時鐘周期。
圖5是并行矩陣轉置模塊在ModelSim仿真軟件中的時序仿真結果,仿真的時鐘頻率設定為100Mhz。從輸入數(shù)據(jù)到開始得到結果,中間間隔了13個時鐘周期。
2.1.3第二級一維離散余弦變換模塊
第二級一維離散余弦變換模塊在計算結構上與第一級一維離散余弦變換模塊一樣也分為4個階段,完成一次運算耗用13個時鐘周期,每個時鐘周期完成一個流水線操作,實際的電路結構是13階的流水線結構。
階段1:消耗3個時鐘周期,完成10位有符號數(shù)的加減運算,結果為11位有符號數(shù)。
階段2:消耗4個時鐘周期,完成11位有符號數(shù)的固定系數(shù)乘法。
這個階段與第一級一維離散余弦變換模塊的有所不同,沒有使用嵌入式乘法單元,因為完成一個11位有符號數(shù)的固定系數(shù)乘法需要2個嵌入式乘法單元并聯(lián),完成整個階段28個乘法操作需要56個嵌入式乘法單元,這占整個芯片嵌入式乘法單元的80%。一個模塊過多的耗用嵌入式乘法單元會造成Cyclone II芯片在布局布線時跨越區(qū)域過大,從而導致布線延時過大。
第二級一維離散余弦變換模塊在這個階段中采用Altera的Mega function中的PARALLEL_ADD模塊實現(xiàn)固定系數(shù)乘法操作。PARALLEL_ADD模塊可以在4個時鐘周期內完成8個16位有符號數(shù)的加法操作。11位有符號數(shù)的乘法轉化為8個以內的11位有符號數(shù)的加法。固定系數(shù)都小于0.5,所以PARALLEL_ADD模塊的結果可取11位。上述方法可理解為用并行加法來實現(xiàn)了一個簡單的陣列乘法器。
這種用并行加法來實現(xiàn)了一個簡單的陣列乘法,在不使用嵌入式乘法單元的條件下,是一種實現(xiàn)固定系數(shù)乘法的合理選擇。在后來的驗證中也證明,除了在計算過程比嵌入式乘法單元多兩個時鐘周期,電路面積有所增加以外,其計算精度和運行速度都基本與嵌入式乘法單元相同。運算過程中比使用嵌入式乘法單元多出的多兩個時鐘周期也會因為整個二維離散余弦變換是全流水結構而只增加了流水線的鋪滿時間,流水線一旦鋪滿后,這個兩個時鐘周期的延遲對運算延遲的影響將不再存在。
階段3:消耗3個時鐘周期,完成11位有符號數(shù)的加減法操作,結果仍為11位有符號數(shù)。結果仍為11位有符號數(shù)而不是12位有符號數(shù)的原因在第一級一維離散余弦變換模塊的階段3中已說明。
階段4:消耗3個時鐘周期完成11位有符號數(shù)的加減運算,結果為12位有符號數(shù),也是二維離散余弦變換的最終結果。
2.1.4并行全流水結構的二維離散余弦變換模塊
在不考慮二維離散余弦變換中輸入數(shù)據(jù)的串行轉為并行,輸出數(shù)據(jù)的并行轉為串行的條件下。即假設二維離散余弦變換模塊的前一級模塊可以在每一個時鐘周期內為其提供64位數(shù)據(jù),二維離散余弦變換模塊的后一級模塊可以在每一個時鐘周期內接受其產(chǎn)生的96位數(shù)據(jù)。這時本文提出的并行全流水線結構的二維離散余弦變換模塊只需要43個時鐘周期就可以完成一個8×8矩陣的二維離散余弦變換。
圖6及圖7是該模塊在ModelSim仿真軟件中的時序仿真結果,仿真的時鐘頻率設定為100Mhz,43個時鐘周期完成一次8×8二維離散余弦變換。
相同數(shù)據(jù)在Matlab中二維離散余弦變換結果見圖8。
二者差值的分析:本文提出的二維離散余弦變換模塊在對小數(shù)乘法結果的處理上采取了截尾方式,沒有保留小數(shù)參加后續(xù)的運算。這與Matlab中64位的浮點運算的運算結果相比在變換系數(shù)中的直流系數(shù)上和第1個交流系數(shù)上相差的數(shù)值為8,其它系數(shù)可以認為是近似相同的。
對小數(shù)乘法結果的處理采取截尾方式的原因有兩點:
1:保留小數(shù)位數(shù)過多會導致在后續(xù)的計算中輸入數(shù)據(jù)位數(shù)過長,特別是對于全8路并行結構更易產(chǎn)生數(shù)據(jù)偏移或時鐘偏移,同時也會降低模塊的運行頻率。
2:考慮到后續(xù)的量化模塊,采用標準的量化表時直流系數(shù)的量化步長為16是差值8的2倍,而且量化過程中有對量化結果四舍五入的處理。所以差值8會在量化過程中基本被消除。這一點在后面的實際圖像測試中得到了映證,壓縮后的圖像在視覺上與原始圖像一致。
2.2量化模塊
量化過程就是每個離散余弦變換系數(shù)除以各自的量化步長并對結果取整的過程。取整采用的是四舍五入的方式。
為了方便在FPGA中實現(xiàn),離散余弦變換系數(shù)除以各自的量化步長改為乘以量化步長的倒數(shù),量化步長的倒數(shù)使用二進制小數(shù)表示,選取長度為12位。乘法器用EP2C35中兩個嵌入式乘法單元并聯(lián)實現(xiàn)。因為離散余弦變換系數(shù)的長度為12位有符號的數(shù),所以乘操作后得到的24位結果,保留高12位,低12位舍去。具體電路在算法結構上分為3個階段,由5階的流水線組成,完成整個量化操作耗時5個時鐘周期。
2.3 ZigZag掃描模塊
經(jīng)過量化處理后的離散余弦變換系數(shù)的高頻分量大部分為零。經(jīng)過ZigZag掃描后,一個二維的8×8離散余弦變換系數(shù)矩陣變?yōu)橐粋€一維含64個元素的序列,頻率分量按從低到高排列,一維序列的高頻部分會出現(xiàn)大量的連續(xù)零元素。產(chǎn)生這種一維序列的目的是為了使用熵編碼中游程編碼,進一步提高壓縮效率。
從電路功能的角度上看,ZigZag掃描模塊的作用就是把按列順序輸入的量化后的離散余弦變換系數(shù)以ZigZag掃描的順序輸出。處理時以一個8×8的離散余弦變換系數(shù)矩陣為一個處理單元,在接收一個以列順序輸入的8×8的離散余弦變換系數(shù)矩陣的同時,把前一個已經(jīng)接收完畢的8×8的離散余弦變換系數(shù)矩陣以ZigZag掃描的順序輸出。一個擁有128個存儲單元,每個存儲單元長度為9位的雙口RAM可以完成上述功能。RAM的128個存儲單元在使用上分為兩個操作區(qū),每個操作區(qū)64個存儲單元,一個操作區(qū)用于接收以列順序輸入的8×8的離散余弦變換系數(shù)矩陣,同時另一個操作區(qū)以ZigZag掃描的順序輸出前一個已經(jīng)接收完畢的8×8的離散余弦變換系數(shù)矩陣。兩個操作區(qū)輪換交替,形成一種乒乓操作模式。在這里使用乒乓操作是為了保持整個IP核的整體全流水線設計。
乒乓操作是一種常用于數(shù)據(jù)流控制的處理技巧。其特點是相互配合切換多個存儲單元并完成數(shù)據(jù)的處理,把處理后的數(shù)據(jù)沒有停頓的運送到下一個處理模塊。把一個乒乓操作模塊當作一個整體,從其兩端看數(shù)據(jù),輸入數(shù)據(jù)和輸出數(shù)據(jù)都是連續(xù)不斷的,沒有任何停頓,因此非常適合流水線結構。圖11是ZigZag掃描模塊在ModelSim仿真軟件中的時序仿真結果,仿真的時鐘頻率設定為100Mhz。輸入數(shù)據(jù)是一個8×8的二維矩陣。按列掃描順序輸入的如下矩陣:
0 |
1 |
5 |
6 |
14 |
15 |
27 |
28 |
2 |
4 |
7 |
13 |
16 |
26 |
29 |
42 |
3 |
8 |
12 |
17 |
25 |
30 |
41 |
43 |
9 |
11 |
18 |
24 |
31 |
40 |
44 |
53 |
10 |
19 |
23 |
32 |
39 |
45 |
52 |
54 |
20 |
22 |
33 |
38 |
46 |
51 |
55 |
60 |
21 |
34 |
37 |
47 |
50 |
56 |
59 |
61 |
35 |
36 |
48 |
49 |
57 |
58 |
62 |
63 |
2.4熵編碼模塊
熵編碼與前面介紹的量化都是數(shù)據(jù)壓縮的手段,但二者有所不同,熵編碼利用信號的統(tǒng)計特征來降低位率,理論上不會丟失信息,量化會丟失信息。實現(xiàn)熵編碼有多種方式,本文根據(jù)ISO/IEC10918協(xié)議,使用了游程編碼和霍夫曼編碼兩種方式。游程編碼的原理是把沿一定方向排列的等大小量化值的離散余弦變換系數(shù)作為連續(xù)的整體,用特定碼字替代這種連續(xù)的整體就會達到數(shù)據(jù)量減少的效果?;舴蚵幋a是一種變長編碼,將多次出現(xiàn)的代碼用較短的碼字代表,很少出現(xiàn)的代碼用較長的碼字代表。產(chǎn)生哈夫曼編碼要求掃描兩遍原始數(shù)據(jù),第一遍掃描是為了在原始數(shù)據(jù)中精確地統(tǒng)計每個值出現(xiàn)的頻率,第二遍利用構造的哈夫曼樹得到編碼,兩次掃描耗時巨大,因此數(shù)據(jù)壓縮難以滿足實時性要求。ISO/IEC10918協(xié)議中在對大量8位精度圖像的平均統(tǒng)計基礎上,給出了4個合適大多數(shù)應用的個哈夫曼碼表。在實現(xiàn)硬件電路時把哈夫曼碼表存儲在片上ROM中,使用時直接查找。因為離散余弦變換中直流系數(shù)和交流系數(shù)分別使用不同的碼表,且直流系數(shù)不需要進行游程編碼,所以直流系數(shù)和交流系數(shù)使用不同的模塊來處理。
2.4.1直流系數(shù)處理模塊
直流系數(shù)是8×8矩陣內64個像素均值的度量,是包含了整個圖像能量的重要部分。利用相鄰的8×8矩陣的直流系數(shù)具有很強的相關性,對直流系數(shù)使用差分壓縮編碼。前一個8×8矩陣的直流系數(shù)作為當前矩陣的直流系數(shù)的預測值,求出現(xiàn)實值和預測值之間的差值后,再對差值做霍夫曼編碼。在硬件實現(xiàn)時,直流系數(shù)只有一個值,所以不需要做游程編碼,對其處理的第一步就是求得其與預測值之間的差值。根據(jù)差值的大小和正負查找存儲在片上ROM的標準霍夫曼碼表,得出前綴代碼和前綴代碼長度,同時根據(jù)ISO/IEC10918協(xié)議中提出的尾碼產(chǎn)生方式得到對應的尾碼代碼及尾碼代碼長度。上述處理完成之后再經(jīng)過合并前綴代碼與尾碼代碼為霍夫曼代碼,則直流系數(shù)的熵編碼完成,之后等待被變長編碼模塊封裝。具體的實現(xiàn)電路由4階流水線組成,直流系數(shù)的熵編碼處理過程耗時4個時鐘周期。
2.4.2交流系數(shù)處理模塊
交流系數(shù)首先要現(xiàn)經(jīng)過游程編碼處理。在游程編碼中非零交流系數(shù)前的零交流系數(shù)的個數(shù)是游程長度,前綴代碼及尾碼代碼的含義與直流系數(shù)中的一致,只不過在交流系數(shù)處理中游程長度和前綴代碼重新組合為一個新的查找索引來查找新的前綴代碼。ISO/IEC10918協(xié)議中給出的交流系數(shù)標準霍夫曼碼表里有兩個特殊的代碼。一個特殊代碼ZRL,ZRL代表游程編碼中游程長度大于16,如果游程長度大于32,48,56,分別用1個ZRL,2個ZRL,3個ZRL表示,盈余的游程長度加入下一個游程長度計算中。ZRL代碼只有前綴代碼,沒有尾碼代碼。為了方便實現(xiàn),直接把ZRL的尾碼代碼長度設為零,起到屏蔽尾碼的作用。另一個特殊代碼EOB,EOB代表最后一個零行程中只有零元素直接代表當前矩陣的游程編碼已經(jīng)掃描結束,若當前矩陣的最后一個交流系數(shù)是非零數(shù)的則以正常結束一個游程長度的計數(shù)作為當前矩陣游程編碼的結束。同ZRL類似,EOB也沒有尾碼代碼,所以使用同樣的處理手段。具體的實現(xiàn)電路由4階流水線組成,交流系數(shù)的熵編碼處理耗時4個時鐘周期。
2.4.3交織模塊和冗余ZRL消除模塊
交織模塊的作用是把前綴代碼和尾碼代碼合并為一個霍夫曼代碼,合并后的代碼易于進行下一階段的變長編碼操作,變長編碼操作過程需要的移位位數(shù)由前綴代碼長度加上尾碼代碼長度做和得到,這個求和過程也在交織模塊中實現(xiàn)。該模塊具體實現(xiàn)電路由2階流水線組成。
冗余ZRL消除模塊不是ISO/IEC10918協(xié)議的一部分,但它源于標準協(xié)議里對EOB的定義。從EOB之前直到最近一個的非零交流系數(shù)出現(xiàn),中間產(chǎn)生的ZRL都是可以消除的?;谌魉€結構的電路設計一般很難滿足這一要求,原因是全流水線結構的電路每級產(chǎn)生的結果都會直接傳遞給下一級,不對結果作保留。唯一的方法就是構造一個同步FIFO來緩存前幾個時鐘周期內產(chǎn)生的結果,根據(jù)之前輸入的數(shù)據(jù)量和當前輸入的數(shù)據(jù)量是否滿足ZRL的冗余條件而選擇性的對FIFO輸出的結果做屏蔽。屏蔽的手段就是把FIFO輸出數(shù)據(jù)的對應的霍夫曼代碼長度清零。這樣在下一步的變長編碼中會因ZRL的霍夫曼代碼長度為零而消除冗余的ZRL。
2.4.4變長編碼模塊
變長編碼的作用是把交織編碼輸出的含有不等長有效位的霍夫曼碼字,提取其中的有效位并將其組合為一個連續(xù)的32位碼流。
編碼原理是把交織編碼輸出的含有不等長有效位的霍夫曼碼字向右位,移動的位數(shù)是前一個霍夫曼碼字的代碼長度。移位完成后的當前霍夫曼碼字與提供移動的位數(shù)的前一個霍夫曼碼字做或運算,同時累加兩個霍夫曼碼字的代碼長度。累加和大于24時表明變長編碼的第一步完成。第二步是檢查前一步產(chǎn)生的24位封裝結果中是否有FF字節(jié),若有則直接在FF字節(jié)后面添加00字節(jié)。并不是所有的24位封裝結果都需要在FF字節(jié)后面添加00字節(jié),所以在第二步處理中還有移位處理。移位處理采用的方法與第一步移位處理的方法相同的,把24位封裝結果和添加00字節(jié)后的32位封裝結果,統(tǒng)一封裝為32位結果輸出。這個32位數(shù)據(jù)也是整個IP核輸出的最終壓縮結果。
3.基于SOPC結構的實際驗證系統(tǒng)
經(jīng)驗證,Motion JPEG IP核可以實時處理由NTSC制式攝像頭采集經(jīng)ADV7181處理后輸出的CCIR656標準數(shù)據(jù),完成對連續(xù)視頻幀的實時壓縮。
驗證系統(tǒng)結構如圖15所示,lineswitcher模塊把CCIR656標準數(shù)據(jù)的亮度分量以跳址寫入的方式通過Multi-Port SDRAM Controller模塊寫入到SDRAM中,亮度分量數(shù)據(jù)從隔行掃描變?yōu)橹鹦写尜A。Multi-Port SDRAM Controller模塊是一個工業(yè)級的SDRAM控制器,可以將一個SDRAM數(shù)據(jù)端口仿真成四個虛擬的數(shù)據(jù)端口(兩個寫端口+兩個讀端口)。SDRAM在存儲空間使用上劃分為4個區(qū)塊,在lineswitcher模塊寫入一個區(qū)塊的同時,Motion JPEG IP核讀出前一個已寫入亮度分量的區(qū)塊。Motion JPEG IP核輸出端是一個Avalon總線上的具有流控制屬性從端口。DMA控制器與Motion JPEG IP核以流控制的方式進行數(shù)據(jù)傳輸,并把數(shù)據(jù)轉移到SRAM中。整個過程無需NIOSII處理器干預,只須等DMA控制器寫滿SRAM后以中斷的方式通知NIOSII處理器以使其掛起Motion JPEG IP核,防止存入SRAM中數(shù)據(jù)被覆蓋。最后使用DE2_Control_Panel傳輸SRAM中壓縮后的數(shù)據(jù)到PC中,便可看到采集后圖像經(jīng)壓縮后的效果。NIOSII處理器的作用是初始化DMA控制器和通過I2C總線設置ADV7181。
考慮到芯片上的資源,驗證時只對ADV7181輸出的亮度分量進行壓縮,舍棄了色差分量。雖然沒有了色差分量,但是仍然可以得到清晰直觀的驗證效果。
4.結論
本設計主要有以下幾個特點。
1:以全流水線結構來實現(xiàn)Motion JPEG視頻壓縮IP核。
雖然流水線技術已經(jīng)是一種眾所周知的技術,但是現(xiàn)有的Motion JPEG視頻壓縮IP核仍未實現(xiàn)全部流水線結構,一般多以狀態(tài)控制模塊為核心來協(xié)調各個子模塊。這就導致系統(tǒng)中最慢的子模塊在處理數(shù)據(jù)時,其它子模塊只能等待,對數(shù)據(jù)塊訪問的效率低下。同時由于數(shù)據(jù)塊的被多個子模塊所使用而又需要復雜的仲裁機制。本文提出的全流水線結構把整個處理過程分解為198個小操作,每個時鐘周期內由一階流水線完成一個小操作。當整個流水線鋪滿之后,整個數(shù)據(jù)處理過程中沒有等待延遲,沒有仲裁協(xié)議,大幅提高了系統(tǒng)的運行效率并降低了系統(tǒng)的復雜度。
2:并行矩陣轉置結構的提出及基于并行矩陣轉置的并行二維離散余弦變換結構。
并行矩陣轉置結構較之以往的串行矩陣轉置在處理8×8矩陣上至少節(jié)省了100個時鐘周期。二維離散余弦變換在采用了并行矩陣轉置之后,也實現(xiàn)了全部并行處理,43個時鐘周期完成了一次二維離散余弦變換,效率提高顯著。
3:因采用全流水線結構而取得的較高的運行頻率。
本文設計的Motion JPEG視頻壓縮IP核在Quartus II 6.0中進行靜態(tài)時序分析,得到的最高運行頻率是150Mhz。
現(xiàn)有IP核與本文設計的IP核的運行頻率比較
實際驗證時不僅對處理CCIR656標準數(shù)據(jù)的能力給予驗證,同時也為100Mhz的運行頻率進行了驗證,結果證明IP核可以在100Mhz的運行頻率下正常工作。驗證方法是把7幀952×568的亮度分量文件存入SDRAM中作為原始數(shù)據(jù),整個驗證系統(tǒng)以100Mhz頻率運行,經(jīng)過0.05秒完成7幀的壓縮,幀率可達147 frame/s。壓縮后圖像的大小為原來亮度圖像的十分之一。
4:可以在低成本,低功耗,高密度的CycloneII系列FPGA芯片上運行,通過Avalon總線與NIOSII處理器構成SOPC系統(tǒng),為將來實際產(chǎn)品的設計搭建了一個良好的平臺。
參考文獻
【1】Weiping Li, A New Algorithm to Compute the DCT and its Inverse, IEEE TRANSATIONS ON SIGNAL, PROCESSING, VOL. 39. NO. 6, JUNE 1991
【2】Shaw-MinLei, Ming-TingSun, An Entropy Coding System for Digital HDTV Applications, IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY, VOL. 1, NO.1, MARCH 1991
【3】ISO/IEC International Standard 10918-1. June 1992
【4】Altera Corporation. Quartus II Version 7.2 Handbook. October 2007
【5】Altera Corporation. Nios II Processor Reference Handbook. October 2007
【6】Altera Corporation. Nios II Software Developer's Handbook. October 2007
【7】Altera Corporation. Avalon Streaming Interface Specification. September 2007
【8】張志剛. FPGA與SOPC設計教程-DE2實踐. 西安: 西安電子科技大學出版社, 2007年4月.
【9】吳繼華,王誠. AlteraFPGA/CPLD設計(高級篇). 北京: 人民郵電出版社,2005年7月
【10】簡弘倫.精通VerilogHDL IC設計核心技術實例詳解.北京:電子工業(yè)出版社, 2005年10月.