天天看點

FPGA實作24位彩圖VGA顯示

大緻流程:通過MATLAB提取圖像RGB資料分别存入三個.mif檔案。然後通過quartus調3個ip核 ROM,分别存三個.mif檔案資料。最後通過VGA協定顯示出來。 首先講解MATLAB如何讀取圖檔: A=imread('C:\Users\Administrator\Desktop\flower.bmp')%讀取圖像,通過畫圖工具修改合适分辨率和格式 fide=fopen('rgb.mif','wt');%按文本寫打開,沒有自動建立 for i=1:222                         %按  位址:資料; 格式存資料到.MIF檔案中(295×222分辨率) for j=1:295 z2(i,j)=(i+443)*295+j; end end for i=1:222 for j=1:295 fprintf(fide,'%x\t:\t%x;\n',z2(i,j),A(i,j,3)); %按  位址:資料; 格式存資料到.MIF檔案中 end end [r c d]=size(A);%r和c為分辨率d表示次元(3維:R,G,B) red =A; red(:,:,1)=A(:,:,1);%擷取紅色分量 red(:,:,2)=zeros(r,c); red(:,:,3)=zeros(r,c); red=uint8(red); subplot(1,4,1) imshow(red) fide=fopen('Red.mif','wt'); for i=1:222 for j=1:295 z(i,j)=(i-1)*295+j; end end for i=1:222 for j=1:295 fprintf(fide,'%x\t:\t%x;\n',z(i,j),red(i,j,1));%将紅色分量存入 'Red.mif'檔案中 end end fprintf(fide,'end;'); green=A; green(:,:,1)=zeros(r,c); green(:,:,2)=A(:,:,2);% 擷取綠色分量 green(:,:,3)=zeros(r,c); green=uint8(green); subplot(1,4,2) imshow(green) fide=fopen('Green.mif','wt'); for i=1:222 for j=1:295 fprintf(fide,'%x\t:\t%x;\n',z(i,j),green(i,j,2)); %将綠色分量存入 'Red.mif'檔案中 end end fprintf(fide,'end;'); blue=A blue(:,:,1)=zeros(r,c); blue(:,:,2)=zeros(r,c); blue(:,:,3)=A(:,:,3); % 擷取藍色分量 blue=uint8(blue); subplot(1,4,3) imshow(blue) fide=fopen('Blue.mif','wt'); for i=1:222 for j=1:295 fprintf(fide,'%x\t:\t%x;\n',z(i,j),blue(i,j,3)); %将藍色分量存入 'Red.mif'檔案中 end end fprintf(fide,'end;'); fclose(fide); RGB圖像顯示:

FPGA實作24位彩圖VGA顯示

圖1 接下來打開QUARTUS軟體,調ROM 初始化三分量的.mif檔案。modesim調試ROM

FPGA實作24位彩圖VGA顯示

圖2 可以看到資料總是會比位址資料慢一拍出來,原因是初始化rom時在輸出與了下CLK時鐘。這會使3個ROM輸出資料更加穩定。 調試ok後加入VGA顯示控制。

FPGA實作24位彩圖VGA顯示

圖3   咱們可以看到start_flag信号,它的作用:由于圖檔顯示的分辨率是295*222的,比較小,是以在VGA800*600分辨率隻占據一部分位置。故需要設定好開始顯示的位置範圍。當VGA從左上角逐行掃描到右下角時,一旦達到預先設定好的顯示範圍則start_flag由0-》1,而前面的ROM子產品收到start為1信号後位址随VGA時鐘上升沿累加,對應的ROM位址内資料輸出到VGA控制子產品,平時( start_flag=0)vga_r/g/b端口輸出為0, start_flag=1時正常輸出資料。 這邊貼出本次用的DE2-115的VGA顯示硬體電路

FPGA實作24位彩圖VGA顯示

圖4 輸出RGB各為8位。

最後給出闆級調試(signal tap2的波形)

FPGA實作24位彩圖VGA顯示

圖5 可以看到資料比位址完了兩個時鐘周期,這是因為初始化ROM中的時鐘在前後各打了一拍。

FPGA實作24位彩圖VGA顯示

圖6

最後給出實際在顯示器上的結果圖:

FPGA實作24位彩圖VGA顯示

實驗感悟: 實驗中少不了各種奇葩小問題的出現,其中就有一個,浪費了半天的時間:當将 vga_r/g/b端口全置為0時,按照正常RGB混合原理應該是黑色,但是我的顯示器卻顯示墨綠色,我通過網上線上配色工具發現它是在R和B分量為0而G置于0~255之間的一個量,然後我modelsim仿真和闆級調試都顯示我沒有将該G分量所處的管腳拉高的情況,後面發現是顯示器的問題,換了一台就好了,這個結果讓我很崩潰,因為中途我也是換過一次,可能是心急沒有發現問題,後面又換了一次才發現問題的。是以,這告訴我們,遇到問題要冷靜分析,科研也必将是在一個個BUG中走出來的一條康莊大道。希望以後能在這方面的問題上有所覺悟和提升能力。