今天本来打算写一个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