[X]关闭

鉴于大家都玩VGA,我也玩玩哦

文档创建者:贾文洋
浏览次数:6548
最后更新:2015-12-25

VGA最重要的信号是:RED、GREEN、BLUE及HSYNC和VSYNC,其中前面三种是数据信号,后面两种是控制信号,数据信号的传输是靠控制信号来进行同步控制的,下面介绍行和场控制信号如何对数据信号进行同步的。
一个完整行的扫描周期由a、b、c、d四部分组成,其中H_SYNC(a)为行同步阶段,对行扫描地址进行复位;H_BACK(b)为行消隐后肩,是扫描地址转移后的准备期;H_DISP(c)为行显示阶段,此阶段像素数据为有效;H_FRONT(d)为行消隐前肩,为扫描地址转移的准备期;H_TOTAL(e)为完成一次行扫描的总时间。扫描时候,先进行行同步,然后才进行数据的传输,其时序如下图。
VGA行扫描时序图

场扫描与行扫描时序类似,场扫描周期由n个行扫描周期组成,并且一次场扫描周期有其自身的时序规律,完成一定行数的行扫描后,进行一次场同步
该行数与VGA分辨率有关,如下图为VGA场扫描时序图。
VGA行扫描时序图
VGA显示分辨率与刷新频率是紧密联系的,是VGA时序标准,下表为VGA常用分辨率和刷新频率及场行时序之间的关系。
VGA常见显示模式时序表

  
显示模式
时钟
  
(MHZ)
行时序(像素数)
帧时序(行数)
a
b
c
d
e
o
p
q
r
s
640x480@60
25.175
96
48
640
16
800
2
33
480
10
525
640x480@75
31.5
64
120
640
16
840
3
16
480
1
500
800x600@60
40.0
128
88
800
40
1056
4
23
600
1
628
800x600@75
49.5
80
160
800
16
1056
3
21
600
1
625
1024x768@60
65
136
160
1024
24
1344
6
29
768
3
806
1024x768@75
78.8
176
176
1024
16
1312
3
28
768
1
800
1280x1024@60
108.0
112
248
1280
48
1688
3
38
1024
1
1066
1280x800@60
83.46
136
200
1280
64
1680
3
24
800
1
828
1440x900@60
106.47
152
232
1440
80
1904
3
28
900
1
932
根据前面VGA显示模式时序表,我们进行代码编写,这里我们以800*600为例,60hz,40M。代码如下:
  `timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2015/12/22 21:55:24
// Design Name:
// Module Name: vga
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////


module vga(
       input     wire          SYS_XRST    ,   
       input     wire          SYS_CLK     ,
       output    wire  [3:0]   VGA_R       ,
       output    wire  [3:0]   VGA_G       ,
       output    wire  [3:0]   VGA_B       ,
       output    wire          HS          ,   
       output    wire          VS         
);                                         
       parameter  P_H_WHOLE = 12'd1055     ;
       parameter  P_V_WHOLE = 12'd627      ;   
                                          
       reg     [3:0]          r_VGA_R      ;
       reg     [3:0]          r_VGA_G      ;
       reg     [3:0]          r_VGA_B      ;
       reg                    r_HS         ;  
       reg                    r_VS         ;
       reg     [11:0]         r_HS_COUNT   ;
       reg     [11:0]         r_VS_COUNT   ;
       reg                    r_HS_OFF     ;
       reg                    r_VS_OFF     ;
       reg      [3:0]         r_R_OFF      ;
       reg      [3:0]         r_G_OFF      ;
       reg      [3:0]         r_B_OFF      ;
       reg      [11:0]        r_VGA_COLOR  ;
       reg                    r_HS_EN      ;
       reg                    r_VS_EN      ;
       wire                   SYS_CLK40M   ;
//=========================================
//                VGA Display   
//=========================================
  // Horizontal count
      always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
          if(SYS_XRST == 1'b0) begin
              r_HS_COUNT <= {12{1'b0}};
           end else begin
                            if(r_HS_COUNT == P_H_WHOLE) begin
                        r_HS_COUNT <= {12{1'b0}};
                 end else begin
                         r_HS_COUNT <= r_HS_COUNT+1'b1;
                     end   
                end
           end   
           
  //Horizontal sync
       always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
           if(SYS_XRST == 1'b0) begin     
               r_HS <= 1'b1;
           end else begin
                    if(r_HS_COUNT == 12'd39) begin
                          r_HS <= 1'b0;
                       end else begin
                           if(r_HS_COUNT == 12'd167)begin
                              r_HS <= 1'b1;
                    end         
               end
          end
       end   
      
      always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
             if(SYS_XRST == 1'b0) begin
                         r_HS_EN <= 1'b0;
                   end else begin
                           if(r_HS_COUNT == 12'd255) begin
                      r_HS_EN <= 1'b1;
                 end else begin
                       if(r_HS_COUNT == 12'd1055) begin
                              r_HS_EN <= 1'b0;
                     end       
             end                         
          end
      end           
                                      
  // Vertical count
      always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
           if(SYS_XRST == 1'b0) begin
                  r_VS_COUNT <= {12{1'b0}};
            end else begin
                if(r_HS_COUNT == P_H_WHOLE) begin
                       if(r_VS_COUNT == P_V_WHOLE) begin
                       r_VS_COUNT <= {12{1'b0}};
                   end else begin
                       r_VS_COUNT <= r_VS_COUNT+1'b1;
                   end   
                end
             end  
          end                  
            
  //Vertical sync                             
    always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
          if(SYS_XRST == 1'b0) begin     
              r_VS <= 1'b1;
           end else begin
               if(r_HS_COUNT == P_H_WHOLE)  begin           
                  if(r_VS_COUNT == 12'd0)   begin
                            r_VS <= 1'b0;
                         end else  
                     if(r_VS_COUNT == 12'd4) begin
                              r_VS <= 1'b1;
                     end
                end
           end     
     end  
     
    always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
          if(SYS_XRST == 1'b0) begin
                     r_VS_EN <= 1'b0;
           end else begin
                     if(r_HS_COUNT == P_H_WHOLE) begin
                            if(r_VS_COUNT == 12'd27) begin
                     r_VS_EN <= 1'b1;
                  end  else   
                           if(r_VS_COUNT == 12'd627) begin
                                  r_VS_EN <= 1'b0;
                          end                        
                end
             end
         end  
     
/*========================================================================+/
||                                                                        ||
||                           // Color Signals                             ||
||                                                                        ||
/+========================================================================*/            
      
    always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
          if(SYS_XRST == 1'b0) begin     
            {r_VGA_R,r_VGA_G,r_VGA_B} <= 12'd0;
            end else begin
                    if(r_VS_EN == 1'b1 && r_HS_EN == 1'b1) begin
                  if(r_HS_COUNT == 12'd256) begin
                          r_VGA_R <= {4{1'b1}};
                    r_VGA_G <= {4{1'b0}};
                    r_VGA_B <= {4{1'b0}};             
                  end else if(r_HS_COUNT == 12'd456) begin
                            r_VGA_R <= {4{1'b0}};
                            r_VGA_G <= {4{1'b1}};
                            r_VGA_B <= {4{1'b0}};       
                       end else if(r_HS_COUNT == 12'd657) begin
                              r_VGA_R <= {4{1'b0}};
                              r_VGA_G <= {4{1'b0}};
                              r_VGA_B <= {4{1'b1}};       
                        end else if(r_HS_COUNT == 12'd858) begin          
                              r_VGA_R <= {4{1'b1}};
                              r_VGA_G <= {4{1'b1}};
                              r_VGA_B <= {4{1'b1}};
                                  end                
                     end
                end     
           end      
            
  //add register to increase stability
    always @(posedge SYS_CLK40M or negedge SYS_XRST) begin
       if(SYS_XRST == 1'b0) begin
                  r_HS_OFF  <= 1'd1;
               r_VS_OFF  <= 1'd1;
               r_R_OFF   <= 4'd0;
               r_G_OFF   <= 4'd0;
                r_B_OFF   <= 4'd0;
       end else begin
                  r_HS_OFF         <= r_HS;
           r_VS_OFF  <= r_VS;   
           r_R_OFF   <= r_VGA_R;
           r_G_OFF   <= r_VGA_G;
           r_B_OFF   <= r_VGA_B;
        end
    end
     clk_wiz_0 PLL
     (
     // Clock in ports
      .clk_in1(SYS_CLK),      // input clk_in1
      // Clock out ports
         .clk_out1( SYS_CLK40M ));    // output clk_out1
  // Output Ports              
  assign   HS      = r_HS_OFF ;
  assign   VS      = r_VS_OFF ;
  assign   VGA_R   = r_R_OFF  ;
  assign   VGA_G   = r_G_OFF  ;
  assign   VGA_B   = r_B_OFF  ;

endmodule
















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 2

uisrc

发表于 2015-12-24 11:18:59 | 显示全部楼层

继续加油,把VGA驱动做成通用
越努力越幸运!加油!

mine_2000

发表于 2015-12-25 18:32:54 | 显示全部楼层

楼主有1024*600@60Hz800*480@60Hz的时序吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则