2D-DCT的FPGA實(shí)現
由于FPGA中硬件乘法器資源有限,直接應用乘法會(huì )消耗大量的資源。本方案中使用分布式算法[4]來(lái)實(shí)現乘法,它是一種適合FPGA的乘加運算,與傳統算法實(shí)現乘加運算的區別在于,執行部分積運算的先后順序不一樣。分布式算法在實(shí)現乘加功能時(shí),首先將各輸入數據的每一對應位產(chǎn)生的部分積預先進(jìn)行相加,形成相應的部分積,然后再對各個(gè)部分積累加形成最終結果;而傳統算法是所有乘積已經(jīng)產(chǎn)生之后再相加完成乘加運算的。與傳統算法相比,分布式算法可極大地減少硬件電路的規模,提高電路的執行速度。分布式乘法器結構如圖5所示。

其中Cn為常系數。這種乘法器不僅能夠有效地減少硬件資源,而且在增加輸出端口時(shí)能夠減小數據傳輸所帶來(lái)的延遲和布局布線(xiàn)面積[5]. 2.3行列轉換模塊本文使用同步動(dòng)態(tài)隨機存儲器(SDRAM)來(lái)存儲第一次1D-DCT的中間結果及數據的行列轉換。由于SDRAM與系統時(shí)鐘同步,因此避免了不必要的等待周期,減少了數據存儲時(shí)間。SDRAM的核心結構由多個(gè)內存單元組成,這些內存單元又分成由行和列組成的二維陣列。2D-DCT變換首先是對8×8數據塊的每一行數據進(jìn)行1D-DCT變換,然后將結果放入SDRAM中,每一行的結果就占SDRAM中的一行內存。SDRAM通過(guò)采用地址線(xiàn)行列復用技術(shù)讀取其儲存的內容,訪(fǎng)問(wèn)這些內存時(shí),在地址線(xiàn)上依次給出行地址和列地址[6],讀出SDRAM中的每一列數據,再重新送入1D-DCT模塊中進(jìn)行1D-DCT變換,這樣就完成了整個(gè)2D-DCT的變換。
3仿真結果
整個(gè)設計采用Verilog HDL語(yǔ)言進(jìn)行編程,使用Xilinx公司的Spartan3E系列FPGA(XC3S500E)實(shí)現,時(shí)鐘晶振為50 MHz,SDRAM容量為512 MB,位寬為16 bit,同步時(shí)鐘能達到100 MHz.使用的編程軟件是ISE,仿真軟件是ModelSim.圖6是用ModelSim仿真軟件仿真出來(lái)的2D-DCT的仿真結果及執行結果。其中,din是8 bit數據輸入端口,dout是經(jīng)變換后12 bit數據輸出端口。由執行結果可以看出,從輸入端口輸入的64個(gè)數據在經(jīng)過(guò)2D-DCT變換后,所得到的結果與期望值一致。

本文提出了分布式算法和行列分解法相結合的方案來(lái)實(shí)現2D-DCT,該方案不僅能夠減少硬件資源的使用,提高資源的利用率,并能提高運算速度,能夠滿(mǎn)足數字圖像和視頻壓縮的實(shí)時(shí)性要求。在查找表中所使用的值取的精度不夠高,所以存在一定的誤差,但這種誤差不會(huì )引起人眼視覺(jué)上的差別,是允許存在的。因此,該方案可作為用FPGA來(lái)進(jìn)行數字圖像和視頻壓縮中的一部分。
評論