Motion JPEG視頻壓縮IP核的設計與實現(xiàn)
這種用并行加法來實現(xiàn)了一個簡單的陣列乘法,在不使用嵌入式乘法單元的條件下,是一種實現(xiàn)固定系數(shù)乘法的合理選擇。在后來的驗證中也證明, 除了在計算過程比嵌入式乘法單元多兩個時鐘周期,電路面積有所增加以外,其計算精度和運行速度都基本與嵌入式乘法單元相同。運算過程中比使用嵌入式乘法單元多出的多兩個時鐘周期也會因為整個二維離散余弦變換是全流水結構而只增加了流水線的鋪滿時間,流水線一旦鋪滿后,這個兩個時鐘周期的延遲對運算延遲的影響將不再存在。
本文引用地址:http://2s4d.com/article/84771.htm階段3:消耗3個時鐘周期,完成11位有符號數(shù)的加減法操作,結果仍為11位有符號數(shù)。結果仍為11位有符號數(shù)而不是12位有符號數(shù)的原因在第一級一維離散余弦變換模塊的階段3中已說明。
階段4:消耗3個時鐘周期完成11位有符號數(shù)的加減運算,結果為12位有符號數(shù),也是二維離散余弦變換的最終結果。
2.1.4并行全流水結構的二維離散余弦變換模塊
在不考慮二維離散余弦變換中輸入數(shù)據(jù)的串行轉為并行,輸出數(shù)據(jù)的并行轉為串行的條件下。即假設二維離散余弦變換模塊的前一級模塊可以在每一個時鐘周期內(nèi)為其提供64位數(shù)據(jù),二維離散余弦變換模塊的后一級模塊可以在每一個時鐘周期內(nèi)接受其產(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的二維矩陣。按列掃描順序輸入 的如下矩陣:
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論