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