內容
1、將一幅圖片制成mif文件,初始化rom,圖片像素為 120 * 60
2、驅動VGA,將圖片顯示在屏幕上
1、VGA 時序
下面是我的筆記截圖,感覺更好理解。
2、640*480 60hz
VGA 為什么要選用 25Mhz 的時鍾進行驅動呢?
1s時間內顯示60幅圖像,每幅圖像的像素總數為 800 *525 (640*480是指的有效像素,800*525是包含了所有的,具體情況見下圖)
因此完成一幅圖像的時間為 1s/60 =16.6ms
完成一行需要 16.6ms / 525 =31.75us
完成一個像素 16.6ms / 800 = 40 ns
40ns對應的時鍾頻率為25Mhz.
從上面這副圖可以提取的信息如下,我們將它參數化
//行時序參數 `define H_FRONT 11'd16 //顯示前沿 `define H_SYNC 11'd96 //同步脈沖 `define H_BACK 11'd48 //顯示后沿 `define H_DISP 11'd640 //有效時間 `define H_TOTAL 11'd800 //總的 //場時序參數 `define V_FRONT 11'd10 `define V_SYNC 11'd2 `define V_BACK 11'd33 `define V_DISP 11'd480 `define V_TOTAL 11'd525
行時序參數的單位是像素,場時序參數的單位是一行,根據這一點,設計兩個計數器
//---------------------------------------------------------------------- //行時序設計 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin h_cnt <= 0; end else if(h_cnt == `H_TOTAL - 1'b1)begin h_cnt <= 0; end else h_cnt <= h_cnt + 1'b1 ; end assign hs=(h_cnt >= 0 && h_cnt < `H_SYNC )? 1'b0 : 1'b1 ; //---------------------------------------------------------------------- //場時序設計 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin v_cnt<=0; end else if(h_cnt == `H_TOTAL - 1'b1) begin if(v_cnt == `V_TOTAL - 1'b1) v_cnt <= 0; else v_cnt <= v_cnt + 1'b1; end end assign vs = (v_cnt >= 0 && v_cnt< `V_SYNC)? 1'b0 : 1'b1 ;
以上就完成了VGA的驅動,非常簡單。
本次設計的難點在於rom地址的設計,什么情況下改變地址的值。
首先設計像素左標,640*480個有效像素,第一行第一個坐標為(0,0),第二個為(0,1)以此論推,橫坐標為 x_pose ,縱坐標為 y_pose 。
至於為什么是 260 和 210太難解釋了,不過我會把所有工程打包,提供下載,大家可以參考分析。
assign address_1 =(area_1)? (x_pose-260)+120*(y_pose-210) : 1'b0 ;
結果:
程序代碼:鏈接:http://pan.baidu.com/s/1mi0eSNu 密碼:8g64
由於資源的限制,只能顯示很小的圖片,表示很不舒服,我一定要學會設計SDRAM,走向巔峰!!