2D-DCT的FPGA實現(xiàn)
由于FPGA中硬件乘法器資源有限,直接應用乘法會消耗大量的資源。本方案中使用分布式算法[4]來實現(xiàn)乘法,它是一種適合FPGA的乘加運算,與傳統(tǒng)算法實現(xiàn)乘加運算的區(qū)別在于,執(zhí)行部分積運算的先后順序不一樣。分布式算法在實現(xiàn)乘加功能時,首先將各輸入數(shù)據(jù)的每一對應位產生的部分積預先進行相加,形成相應的部分積,然后再對各個部分積累加形成最終結果;而傳統(tǒng)算法是所有乘積已經產生之后再相加完成乘加運算的。與傳統(tǒng)算法相比,分布式算法可極大地減少硬件電路的規(guī)模,提高電路的執(zhí)行速度。分布式乘法器結構如圖5所示。
其中Cn為常系數(shù)。這種乘法器不僅能夠有效地減少硬件資源,而且在增加輸出端口時能夠減小數(shù)據(jù)傳輸所帶來的延遲和布局布線面積[5]. 2.3行列轉換模塊本文使用同步動態(tài)隨機存儲器(SDRAM)來存儲第一次1D-DCT的中間結果及數(shù)據(jù)的行列轉換。由于SDRAM與系統(tǒng)時鐘同步,因此避免了不必要的等待周期,減少了數(shù)據(jù)存儲時間。SDRAM的核心結構由多個內存單元組成,這些內存單元又分成由行和列組成的二維陣列。2D-DCT變換首先是對8×8數(shù)據(jù)塊的每一行數(shù)據(jù)進行1D-DCT變換,然后將結果放入SDRAM中,每一行的結果就占SDRAM中的一行內存。SDRAM通過采用地址線行列復用技術讀取其儲存的內容,訪問這些內存時,在地址線上依次給出行地址和列地址[6],讀出SDRAM中的每一列數(shù)據(jù),再重新送入1D-DCT模塊中進行1D-DCT變換,這樣就完成了整個2D-DCT的變換。
3仿真結果
整個設計采用Verilog HDL語言進行編程,使用Xilinx公司的Spartan3E系列FPGA(XC3S500E)實現(xiàn),時鐘晶振為50 MHz,SDRAM容量為512 MB,位寬為16 bit,同步時鐘能達到100 MHz.使用的編程軟件是ISE,仿真軟件是ModelSim.圖6是用ModelSim仿真軟件仿真出來的2D-DCT的仿真結果及執(zhí)行結果。其中,din是8 bit數(shù)據(jù)輸入端口,dout是經變換后12 bit數(shù)據(jù)輸出端口。由執(zhí)行結果可以看出,從輸入端口輸入的64個數(shù)據(jù)在經過2D-DCT變換后,所得到的結果與期望值一致。
本文提出了分布式算法和行列分解法相結合的方案來實現(xiàn)2D-DCT,該方案不僅能夠減少硬件資源的使用,提高資源的利用率,并能提高運算速度,能夠滿足數(shù)字圖像和視頻壓縮的實時性要求。在查找表中所使用的值取的精度不夠高,所以存在一定的誤差,但這種誤差不會引起人眼視覺上的差別,是允許存在的。因此,該方案可作為用FPGA來進行數(shù)字圖像和視頻壓縮中的一部分。
評論