Motion JPEG視頻壓縮IP核的設計與實(shí)現
這種用并行加法來(lái)實(shí)現了一個(gè)簡(jiǎn)單的陣列乘法,在不使用嵌入式乘法單元的條件下,是一種實(shí)現固定系數乘法的合理選擇。在后來(lái)的驗證中也證明, 除了在計算過(guò)程比嵌入式乘法單元多兩個(gè)時(shí)鐘周期,電路面積有所增加以外,其計算精度和運行速度都基本與嵌入式乘法單元相同。運算過(guò)程中比使用嵌入式乘法單元多出的多兩個(gè)時(shí)鐘周期也會(huì )因為整個(gè)二維離散余弦變換是全流水結構而只增加了流水線(xiàn)的鋪滿(mǎn)時(shí)間,流水線(xiàn)一旦鋪滿(mǎn)后,這個(gè)兩個(gè)時(shí)鐘周期的延遲對運算延遲的影響將不再存在。
本文引用地址:http://dyxdggzs.com/article/84771.htm階段3:消耗3個(gè)時(shí)鐘周期,完成11位有符號數的加減法操作,結果仍為11位有符號數。結果仍為11位有符號數而不是12位有符號數的原因在第一級一維離散余弦變換模塊的階段3中已說(shuō)明。
階段4:消耗3個(gè)時(shí)鐘周期完成11位有符號數的加減運算,結果為12位有符號數,也是二維離散余弦變換的最終結果。
2.1.4并行全流水結構的二維離散余弦變換模塊
在不考慮二維離散余弦變換中輸入數據的串行轉為并行,輸出數據的并行轉為串行的條件下。即假設二維離散余弦變換模塊的前一級模塊可以在每一個(gè)時(shí)鐘周期內為其提供64位數據,二維離散余弦變換模塊的后一級模塊可以在每一個(gè)時(shí)鐘周期內接受其產(chǎn)生的96位數據。這時(shí)本文提出的并行全流水線(xiàn)結構的二維離散余弦變換模塊只需要43個(gè)時(shí)鐘周期就可以完成一個(gè)8×8矩陣的二維離散余弦變換。
圖6及圖7是該模塊在ModelSim仿真軟件中的時(shí)序仿真結果,仿真的時(shí)鐘頻率設定為100Mhz,43個(gè)時(shí)鐘周期完成一次8×8二維離散余弦變換。
相同數據在Matlab中二維離散余弦變換結果見(jiàn)圖8。
二者差值的分析:本文提出的二維離散余弦變換模塊在對小數乘法結果的處理上采取了截尾方式,沒(méi)有保留小數參加后續的運算。這與Matlab中64位的浮點(diǎn)運算的運算結果相比在變換系數中的直流系數上和第1個(gè)交流系數上相差的數值為8,其它系數可以認為是近似相同的。
對小數乘法結果的處理采取截尾方式的原因有兩點(diǎn):
1:保留小數位數過(guò)多會(huì )導致在后續的計算中輸入數據位數過(guò)長(cháng),特別是對于全8路并行結構更易產(chǎn)生數據偏移或時(shí)鐘偏移,同時(shí)也會(huì )降低模塊的運行頻率。
2:考慮到后續的量化模塊,采用標準的量化表時(shí)直流系數的量化步長(cháng)為16是差值8的2倍,而且量化過(guò)程中有對量化結果四舍五入的處理。所以差值8會(huì )在量化過(guò)程中基本被消除。這一點(diǎn)在后面的實(shí)際圖像測試中得到了映證,壓縮后的圖像在視覺(jué)上與原始圖像一致。
2.2量化模塊
量化過(guò)程就是每個(gè)離散余弦變換系數除以各自的量化步長(cháng)并對結果取整的過(guò)程。取整采用的是四舍五入的方式。
為了方便在FPGA中實(shí)現,離散余弦變換系數除以各自的量化步長(cháng)改為乘以量化步長(cháng)的倒數,量化步長(cháng)的倒數使用二進(jìn)制小數表示,選取長(cháng)度為12位。乘法器用 EP2C35中兩個(gè)嵌入式乘法單元并聯(lián)實(shí)現。因為離散余弦變換系數的長(cháng)度為12位有符號的數,所以乘操作后得到的24位結果,保留高12位,低12位舍去。具體電路在算法結構上分為3個(gè)階段,由5階的流水線(xiàn)組成,完成整個(gè)量化操作耗時(shí)5個(gè)時(shí)鐘周期。
2.3 ZigZag掃描模塊
經(jīng)過(guò)量化處理后的離散余弦變換系數的高頻分量大部分為零。經(jīng)過(guò)ZigZag掃描后,一個(gè)二維的8×8離散余弦變換系數矩陣變?yōu)橐粋€(gè)一維含64個(gè)元素的序列,頻率分量按從低到高排列,一維序列的高頻部分會(huì )出現大量的連續零元素。產(chǎn)生這種一維序列的目的是為了使用熵編碼中游程編碼,進(jìn)一步提高壓縮效率。
從電路功能的角度上看,ZigZag掃描模塊的作用就是把按列順序輸入的量化后的離散余弦變換系數以ZigZag掃描的順序輸出。處理時(shí)以一個(gè)8×8的離散余弦變換系數矩陣為一個(gè)處理單元,在接收一個(gè)以列順序輸入的8×8的離散余弦變換系數矩陣的同時(shí),把前一個(gè)已經(jīng)接收完畢的8×8的離散余弦變換系數矩陣以ZigZag掃描的順序輸出。一個(gè)擁有128個(gè)存儲單元,每個(gè)存儲單元長(cháng)度為9位的雙口RAM可以完成上述功能。RAM的128個(gè)存儲單元在使用上分為兩個(gè)操作區,每個(gè)操作區64個(gè)存儲單元,一個(gè)操作區用于接收以列順序輸入的8×8的離散余弦變換系數矩陣,同時(shí)另一個(gè)操作區以ZigZag掃描的順序輸出前一個(gè)已經(jīng)接收完畢的8×8的離散余弦變換系數矩陣。兩個(gè)操作區輪換交替,形成一種乒乓操作模式。在這里使用乒乓操作是為了保持整個(gè)IP核的整體全流水線(xiàn)設計。
乒乓操作是一種常用于數據流控制的處理技巧。其特點(diǎn)是相互配合切換多個(gè)存儲單元并完成數據的處理,把處理后的數據沒(méi)有停頓的運送到下一個(gè)處理模塊。把一個(gè)乒乓操作模塊當作一個(gè)整體,從其兩端看數據,輸入數據和輸出數據都是連續不斷的,沒(méi)有任何停頓,因此非常適合流水線(xiàn)結構。圖11是ZigZag掃描模塊在 ModelSim仿真軟件中的時(shí)序仿真結果,仿真的時(shí)鐘頻率設定為100Mhz。輸入數據是一個(gè)8×8的二維矩陣。按列掃描順序輸入 的如下矩陣:
評論