dynamic

VGA驱动

0
阅读(3207)

转载:http://blog.chinaaet.com/detail/14284.html

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

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

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

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

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

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

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

 

程序如下: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/********************************************************************
* 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-1'b1) && (hcnt < H_DISP+H_FRONT+H_SYNC-1'b1) )
            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-1'b1) && (vcnt < V_DISP+V_FRONT+V_SYNC-1'b1) )
            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