今天本来打算写一个256色彩程序在电脑液晶显示屏上显示的,可结果我发现我的FPGA开发板上VGA接口的RGB只有三位,没办法,只能显示八种色彩,那就将就一下,显示八种颜色吧!其实,和VGA接口(一)中的程序差不多哦,只是,多了几个坐标区间而已,大家学习VGA接口,只要把它的坐标区间弄清楚,我想驱动简单的VGA接口程序,应该没什么问题的,因为,我也是一名FPGA初学者,对VGA了解的不是很深,所以,在这里献丑了!接下来看代码吧。

  

//程序功能:在屏幕上显示八条不同颜色的矩形条;

module vga
     (
      clk,
      rst_n,
      hsync,
      vsync,
      vga_rgb
       
     );

input         clk;        //时钟50MHZ;
input         rst_n;      //复位信号,低电平有效;
output        hsync;      //列同步信号;
output        vsync;      //行同步信号;
output[2:0]   vga_rgb;

parameter   BLACK  =3'b000;         //黑色;
parameter   BLUE   =3'b001;         //蓝色; 
parameter   GREEN  =3'b010;         //绿色;
parameter   CYAN   =3'b011;         //青色;
parameter   RED    =3'b100;         //红色;
parameter   PURPLLE=3'b101;         //紫色;
parameter   YELLOW =3'b110;         //黄色;
parameter   WHITE  =3'b111;         //白色;
     

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; 

reg [2:0] vga_rgb_r;
always @ (posedge clk or negedge rst_n)
  begin
        if(!rst_n)
           vga_rgb_r<=3'bzzz;
        else if (valid) 
          begin
               if ((x_pos>=0)&&(x_pos<=600)&&(y_pos>=0)&&(y_pos<=100))
                   vga_rgb_r<=BLACK;
               else if((x_pos>=0)&&(x_pos<=600)&&(y_pos>100)&&(y_pos<=200))
                    vga_rgb_r<=BLUE;
               else if ((x_pos>=0)&&(x_pos<=600)&&(y_pos>200)&&(y_pos<=300))
                    vga_rgb_r<=GREEN;
               else if ((x_pos>=0)&&(x_pos<=600)&&(y_pos>300)&&(y_pos<=400))
                    vga_rgb_r<=CYAN;
               else if ((x_pos>=0)&&(x_pos<=600)&&(y_pos>400)&&(y_pos<=500))
                    vga_rgb_r<=RED;
               else if ((x_pos>=0)&&(x_pos<=600)&&(y_pos>500)&&(y_pos<=600))
                    vga_rgb_r<=PURPLLE; 
              else if ((x_pos>=0)&&(x_pos<=600)&&(y_pos>600)&&(y_pos<=700))
                    vga_rgb_r<=YELLOW;       
              else if ((x_pos>=0)&&(x_pos<=600)&&(y_pos>700)&&(y_pos<=800))
                    vga_rgb_r<=WHITE;       
                    
          end  
  end 
assign  vga_rgb=vga_rgb_r;


endmodule