找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6461|回復: 1
收起左側

VGA顯示640*480真彩色圖像時FPGA存儲資源不夠用怎么辦

[復制鏈接]
ID:91350 發(fā)表于 2015-11-1 15:50 | 顯示全部樓層 |閱讀模式

本次試驗采用的器件是Cyclone IV E EP4CE15F17C8,其存儲資源有516096個比特。一般情況下,如果我們要用純邏輯在VGA顯示器上顯示一幅640*480真彩色圖像時需要存儲資源為640*480*24=7372800比特,是本次試驗所用器件的存儲資源的14多倍。很明顯,存儲資源遠遠不夠用,怎么辦?很多人想到的用FPGA顯示圖像的解決辦法一般要么顯示640*480二值圖像(307200比特,剛好夠用),要么搭建一個嵌入式系統(tǒng),然后由嵌入式軟件傳送圖像數(shù)據(jù)給FPGA進行VGA顯示。而本次試驗將給出FPGA純邏輯顯示640*480彩色圖像,存儲資源不夠用,怎么辦?當然是先縮小圖像存放于只讀存儲器ROM中,再放大顯示。雖然這樣做顯示出來的圖像有點粗糙,但達到在存儲資源不夠的情況顯示640*480彩色圖像的目的。那么,圖像該縮小到多大?嗯。。。為了避免顯示畸形,應該在橫向和縱向縮放相同的比率。經(jīng)過計算,橫向和縱向各縮小4倍,即由分辨率640*480到160*120。這可以用畫圖實現(xiàn),如圖1所示。然后將圖片另存為bmp文件。

5100000011-6358152480404500003559978.bmp

圖1 圖像分辨率設置

此時,需要FPGA存儲資源為160*120*24=460800比特,剛好夠用。于是乎,生成mif文件,如圖2所示。

5100000011-6358152550630500001945201.bmp

圖2 生成mif文件

接著,在工程中調用ROM并加載剛剛生成的mif文件,如圖3和圖4所示。

5100000011-6358152564556500009419560.bmp

圖3 設置ROM的數(shù)據(jù)位寬和深度

5100000011-6358152569678500009531755.bmp

圖4 加載mif文件

當工程全部搭建好后,編譯綜合,結果出現(xiàn)錯誤,如圖5所示。根據(jù)錯誤提示,本工程占用的存儲資源過多,需要60塊M9K,而該系列FPGA只有56塊M9K,從而不夠用。

5100000011-6358152628922800009377629.bmp

圖5 編譯綜合報錯

那怎么辦呢?繼續(xù)縮小圖片?NO,再縮小,顯示出來的圖像還能看嗎?我們應該從其他方面著手,讓24位圖像變?yōu)?6位圖像,16位圖像數(shù)據(jù)可以顯示65536中顏色,人眼是很難分辨出來的,故該方案可以真彩色圖像的效果。mif文件生成如圖6所示,選擇RGB565(其實該軟件生成的是BGR565的圖像數(shù)據(jù))。

5100000011-6358152699013900006909907.bmp

圖6 生成RGB565mif文件

重新將mif文件加載到ROM中,如圖7和圖8所示。

5100000011-6358152738189400009718072.bmp

圖7 設置ROM數(shù)據(jù)位寬和深度

5100000011-6358152742459100009660832.bmp

圖8 加載mif文件

其中在代碼實現(xiàn)圖像放大的方法是:由于圖像橫向和縱向都縮小了4倍,640*480與160*120的圖像數(shù)據(jù)映射關系為640*480的每行四個像素點對應160*120的一個像素點,640*480的每四行對應160*120的一行。代碼如程序清單1所示。

程序清單1

//---------------------------------------------
//  lcd xpos & ypos   
wire [10:0] rom_xpos = lcd_request ? lcd_xpos : 11'd0;  
wire [10:0] rom_ypos = lcd_request ? lcd_ypos : 11'd0;  
//---------------------------------------------
//  address of ROM
wire    [14:0]      addr;
assign  addr = rom_xpos[10:2] + rom_ypos[10:2] * 11'd160;

還要將RGB565轉換成RGB888進行顯示,可對RGB565的地位補零,如程序清單2所示。

程序清單2

//---------------------------------------------
//  lcd data output
assign  lcd_rgb = (lcd_en == 1'b1) ? {lcd_data[4:0],3'b0,lcd_data[10:5],2'b0,lcd_data[15:11],3'b0} : 24'h000000;

工程搭建完成后,綜合編譯,所消耗資源如圖9所示。

5100000011-6358152821571300005063169.bmp

圖9 工程消耗的資源情況

最后,將生成的sof文件下載到FPGA中,可在顯示器中看到如圖10所示的效果。

5100000011-6358152839460400004465200.jpg

圖10 效果圖1

再給出另一張效果圖,如圖11所示。

5100000011-6358152859645100003641467.jpg

圖11 效果圖2



回復

使用道具 舉報

ID:214006 發(fā)表于 2017-6-30 16:01 | 顯示全部樓層
好高大上   充分利用資源   換個更大點的存儲空間更好
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表