现在的位置: 首页 > 综合 > 正文

我坦白我交代我忏悔——史上最稳定的DIY VGA 模块

2012年05月14日 ⁄ 综合 ⁄ 共 2773字 ⁄ 字号 评论关闭

我坦白

我代价

我忏悔

发现有时候,写了比较实用而且完美的程序,老是自己藏起来,感觉太。。。。

还是发放吧,毕竟我也从网络上吸取了那么多有用的知识,取之于民,用之与民

希望对大家有所帮助

 

VGA驱动真的很简的。先来个简要的说明吧:

最好的网站:http://tinyvga.com/vga-timing

思路:  行显示--行消隐前肩--行消隐--行消隐后肩

     场显示--场消隐前肩--场消隐--场消隐后肩

接口:  改每个时期的Pxiel,以及输入时钟就可以随便在各种分辨率下调用,完全没问题,测试了n遍了

VGA_Data: 此处16位是因为我后级电路时通过模拟转换为VGA电平的,可以根据需要修改位数

X_pos,Y_pos: 实时像素坐标反馈,便于其他模块的控制

 

程序如下: 

/********************************************************************
* Module Name       :   VGA_Driver
* Author            :   Crazy Bingo
* Device            :   EP2C8Q208C8N
* Version           :   Quartus II 9.1
* Date              :   2010/11/20
* Description       :   Dispaly programs for the LCD
*********************************************************************/
/********************************************************************
* Revision Author   :
* Date              :
* Description       :
*********************************************************************/

module VGA_Driver
(  
    input           VGA_CLK,    // VGA像素时钟
    input           RST_n,      // 异步复位信号
   
    input   [15:0]  VGA_Data,
    output  [15:0]  VGA_RGB,    // 接收要显示的色彩
    output  reg     VGA_HS,     // VGA管脚 行同步
    output  reg     VGA_VS,     // VGA管脚 场同步
   
    output  [10:0]  X_pos,      // 像素横坐标位置
    output  [9:0]   Y_pos       // 像素纵坐标位置
); 
//定义VGA_1024_768_65M_60HZ显示协议标准
parameter   H_DISP      =   11'd1024;   // 显示时序
parameter   H_FRONT     =   11'd24;     // 显示前沿
parameter   H_SYNC      =   11'd136;    // 同步脉冲
parameter   H_BACK      =   11'd160;    // 显示后沿
parameter   H_TOTAL     =   11'd1344;   // 时序帧长

parameter   V_DISP      =   10'd768;    // 显示时序
parameter   V_FRONT     =   10'd3;      // 显示前沿
parameter   V_SYNC      =   10'd6;      // 同步脉冲
parameter   V_BACK      =   10'd29;     // 显示后沿
parameter   V_TOTAL     =   10'd806;    // 时序帧长

// 行同步信号发生器
reg [10:0] hcnt;
always @ (posedge VGA_CLK or negedge RST_n)
begin
    if (!RST_n)
        begin
        hcnt    <= 0;
        VGA_HS  <= 1;
        end
    else
    begin
        if (hcnt < H_TOTAL-1)
            hcnt <= hcnt+1'b1;
        else
            hcnt <= 0;
        ////////////////////////////////////////////////////   
        if( (hcnt >= H_DISP+H_FRONT) && (hcnt < H_DISP+H_FRONT+H_SYNC) )
            VGA_HS <= 0;        //同步要求为负脉冲(H_DISP*V_DISP)
        else
            VGA_HS <= 1;
    end
end

// 场同步信号发生器
reg [9:0] vcnt;
always @ (negedge VGA_HS or negedge RST_n)  //因为HS由1变为0,是下降沿
begin
    if (!RST_n)
        begin
        vcnt    <= 0;
        VGA_VS  <= 1;
        end
    else
    begin
        if (vcnt < V_TOTAL-1)
            vcnt <= vcnt+1'b1;
        else
            vcnt <= 0; 
        ////////////////////////////////////////////////////
        if( (vcnt >= V_DISP+V_FRONT) && (vcnt < V_DISP+V_FRONT+V_SYNC) )
            VGA_VS <= 0;        //同步要求为负脉冲(H_DISP*V_DISP)
        else
            VGA_VS <= 1;       
    end
end

/*定义H_DISP*V_DISP行列坐标*/
assign  X_pos = (hcnt < H_DISP) ? hcnt[9:0] : 10'd0;
assign  Y_pos = (vcnt < V_DISP) ? vcnt[9:0] : 10'd0;
assign  VGA_RGB = ((hcnt < H_DISP) && (vcnt < V_DISP)) ? VGA_Data : 16'd0;

endmodule

 

别问为什么,请多思考,中国的FPGA事业可能需要你。。。

抱歉!评论已关闭.