本次試驗(yàn)采用的器件是Cyclone IV E EP4CE15F17C8,其存儲(chǔ)資源有516096個(gè)比特。一般情況下,如果我們要用純邏輯在VGA顯示器上顯示一幅640*480真彩色圖像時(shí)需要存儲(chǔ)資源為640*480*24=7372800比特,是本次試驗(yàn)所用器件的存儲(chǔ)資源的14多倍。很明顯,存儲(chǔ)資源遠(yuǎn)遠(yuǎn)不夠用,怎么辦?很多人想到的用FPGA顯示圖像的解決辦法一般要么顯示640*480二值圖像(307200比特,剛好夠用),要么搭建一個(gè)嵌入式系統(tǒng),然后由嵌入式軟件傳送圖像數(shù)據(jù)給FPGA進(jìn)行VGA顯示。而本次試驗(yàn)將給出FPGA純邏輯顯示640*480彩色圖像,存儲(chǔ)資源不夠用,怎么辦?當(dāng)然是先縮小圖像存放于只讀存儲(chǔ)器ROM中,再放大顯示。雖然這樣做顯示出來的圖像有點(diǎn)粗糙,但達(dá)到在存儲(chǔ)資源不夠的情況顯示640*480彩色圖像的目的。那么,圖像該縮小到多大?嗯。。。為了避免顯示畸形,應(yīng)該在橫向和縱向縮放相同的比率。經(jīng)過計(jì)算,橫向和縱向各縮小4倍,即由分辨率640*480到160*120。這可以用畫圖實(shí)現(xiàn),如圖1所示。然后將圖片另存為bmp文件。
圖1 圖像分辨率設(shè)置
此時(shí),需要FPGA存儲(chǔ)資源為160*120*24=460800比特,剛好夠用。于是乎,生成mif文件,如圖2所示。
圖2 生成mif文件
接著,在工程中調(diào)用ROM并加載剛剛生成的mif文件,如圖3和圖4所示。
圖3 設(shè)置ROM的數(shù)據(jù)位寬和深度
圖4 加載mif文件
當(dāng)工程全部搭建好后,編譯綜合,結(jié)果出現(xiàn)錯(cuò)誤,如圖5所示。根據(jù)錯(cuò)誤提示,本工程占用的存儲(chǔ)資源過多,需要60塊M9K,而該系列FPGA只有56塊M9K,從而不夠用。
圖5 編譯綜合報(bào)錯(cuò)
那怎么辦呢?繼續(xù)縮小圖片?NO,再縮小,顯示出來的圖像還能看嗎?我們應(yīng)該從其他方面著手,讓24位圖像變?yōu)?6位圖像,16位圖像數(shù)據(jù)可以顯示65536中顏色,人眼是很難分辨出來的,故該方案可以真彩色圖像的效果。mif文件生成如圖6所示,選擇RGB565(其實(shí)該軟件生成的是BGR565的圖像數(shù)據(jù))。
圖6 生成RGB565mif文件
重新將mif文件加載到ROM中,如圖7和圖8所示。
圖7 設(shè)置ROM數(shù)據(jù)位寬和深度
圖8 加載mif文件
其中在代碼實(shí)現(xiàn)圖像放大的方法是:由于圖像橫向和縱向都縮小了4倍,640*480與160*120的圖像數(shù)據(jù)映射關(guān)系為640*480的每行四個(gè)像素點(diǎn)對(duì)應(yīng)160*120的一個(gè)像素點(diǎn),640*480的每四行對(duì)應(yīng)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轉(zhuǎn)換成RGB888進(jìn)行顯示,可對(duì)RGB565的地位補(bǔ)零,如程序清單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所示。
圖9 工程消耗的資源情況
最后,將生成的sof文件下載到FPGA中,可在顯示器中看到如圖10所示的效果。
圖10 效果圖1
再給出另一張效果圖,如圖11所示。
圖11 效果圖2