ROM+VGA 圖片顯示


內容

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,走向巔峰!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM