VGA接口共有15针,分成3排,每排5个孔,是显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口。它传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号)。

  此前没有接触过VGA,因为单片机频率太低,不足以驱动VGA,而FPGA足以驱动VGA,今天小试牛刀,编写了一个矩形框,在液晶显示屏上显示!

//程序功能:背景红色, 小矩形为绿色, 矩形框为蓝色;

module vga
     (
      clk,
      rst_n,
      hsync,
      vsync,
      vga_r,
      vga_g,
      vga_b
       
     );

input  clk;        //时钟50MHZ;
input  rst_n;      //复位信号,低电平有效;
output hsync;      //列同步信号;
output vsync;      //行同步信号;
output vga_r;      //红色信号;
output vga_g;      //绿色信号;
output vga_b;      //蓝色信号;

reg [9:0]  x_cnt ;  //行计数;

always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
            x_cnt<=10'd0;
        else if(x_cnt==10'd665) 
           x_cnt<=10'd0;
        else if(y_cnt==1039)
          x_cnt<=x_cnt+1'b1;      
  end 
  
reg [10:0] y_cnt ;  //列计数;

always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
            y_cnt<=11'd0;
        else if(y_cnt==11'd1039) 
           y_cnt<=11'd0;
        else 
          y_cnt<=y_cnt+1'b1;      
  end 

wire valid  ;     //有效显示区标志;

assign  valid=((x_cnt>=10'd31)&&(x_cnt<10'd631)&&(y_cnt>=11'd187)&&(y_cnt<11'd987));

wire [9:0]  x_pos;   //有效显示区坐标;
wire [10:0]  y_pos; 

assign  x_pos=x_cnt-10'd31;
assign  y_pos=y_cnt-11'd187;

reg  hsync_r;

always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
          hsync_r<=1'b1;
        else if(y_cnt==10'd0)     //产生列同步信号;
          hsync_r<=1'b0;
        else if(y_cnt==10'd120) 
          hsync_r<=1'b1; 
        else
           hsync_r<=hsync_r;   
  end
  
assign  hsync=hsync_r; 

reg  vsync_r;
always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
          vsync_r<=1'b1;
        else if(x_cnt==11'd0)      //产生行同步信号;
          vsync_r<=1'b0;
        else if(x_cnt==11'd6) 
          vsync_r<=1'b1; 
        else
           vsync_r<=vsync_r;   
  end
   
assign  vsync=vsync_r; 
 
//显示一个矩形框

wire a,b,c,d;      //矩形框显示区域定位;

assign a=((x_pos>=160)&&(x_pos<=500))&&((y_pos>=240)&&(y_pos<=280));

assign b=((x_pos>=160)&&(x_pos<=500))&&((y_pos>=600)&&(y_pos<=620));

assign c=((x_pos>=160)&&(x_pos<=200))&&((y_pos>=280)&&(y_pos<=600));

assign d=((x_pos>=460)&&(x_pos<=500))&&((y_pos>=280)&&(y_pos<=600));

//显示一个小矩形

wire rec;

assign  rec=((x_pos>=300)&&(x_pos<=350)&&(y_pos>=400)&&(y_pos<=470));

//r,g,b 控制液晶颜色显示,背景红色, 小矩形为绿色, 矩形框为蓝色;

assign  vga_r=valid? ~(a|b|c|d):1'b0;

assign  vga_g=valid? rec:1'b0;

assign  vga_b=valid? (a|b|c|d):1'b0;

endmodule