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