FPGA-VGA驱动Color Bar显示

学习VGA首先要了解VGA是什么:

VGA百度百科

(1)VGA接口协议VGA端子_维基百科 、VGA视频传输标准_百度

引脚1 RED 红色视频
引脚2 GREEN 绿色视频
引脚3 BLUE 蓝色视频
引脚4 ID2/RES 过去为屏幕ID比特2;自DDC2起保留
引脚5 GND 接地(水平同步)
引脚6 RED_RTN 红色接回
引脚7 GREEN_RTN 绿色接回
引脚8 BLUE_RTN 蓝色接回
引脚9 KEY/PWR 过去为key;现为 +5V DC
引脚10 GND 接地(垂直同步,DDC)
引脚11 ID0/RES 过去为屏幕ID比特0;自E-DDC起保留
引脚12 ID1/SDA 过去为屏幕ID比特1;自DDC2起为I²C数据
引脚13 HSync 水平同步
引脚14 VSync 垂直同步
引脚15 ID3/SCL 过去为屏幕ID比特3;自DDC2起为I²C时钟
图表中详叙了较新的15针VESA DDC2连接头。图标中的针脚编号是显卡常见的母接头;在公接头上的针脚相当于图例的左右镜像

 最主要的几根线:

驱动VGA显示的接口主要是下面三种信号:行同步信号(HSYNC),场同步信号(VSYNC)和三条色彩电压传输信号(R、G、B分别对应)色彩电压为0--0.7V其中同步是靠前面两个信号协助的。HSYNC和VSYNC传输关系相对是固定的,双方虽然没有约定时钟信号同步,但是通常会约定发送方有一个基本的时钟,VSYNC、HSYNC、和色彩信号都会按照这个时钟的节拍确定状态。

VGA扫描方式

显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一线,扫完一屏后再返回来扫描剩下的线,隔行扫描的显示器闪烁快速,可能会使使用者眼睛疲劳

通常我们说的像素是指的显示像素并非总像素因为有前后沿脉冲

VGA 工业标准显示模式要求:行同步、列同步都为负极性,即同步脉冲要求是负脉冲。

行、列同步时序

列同步时序

行同步时序

这里可能有的人会有疑问怎么计算VGA的时序?

这里我在别处看到了一个不错的文章大家可以参考理解:·vga时序计算

实例:VGA显示colorbar:

vga的top:

module top(ext_clk_25m,ext_rst_n,vga_r,vga_b,vga_g,vga_hsy,vga_vsy
    );
	input  ext_clk_25m;
	input  ext_rst_n;
	
	output vga_r;
	output vga_g;
	output vga_b;
	output vga_hsy;
	output vga_vsy;
	
	wire clk_50m;
	pll_countroller uut_pll_countroller
   (// Clock in ports
    .CLK_IN1(ext_clk_25m),      // IN
    // Clock out ports
    .CLK_OUT1(clk_50m),     // OUT
    // Status and control signals
    .RESET(~ext_rst_n),// IN
    .LOCKED(sys_rst_n)
	);      // OUT
	vga_countroller uut_vga_countroller(
	.clk(clk_50m),
	.rst_n(ext_rst_n),
	.vga_r(vga_r),
	.vga_g(vga_g),
	.vga_b(vga_b),
	.vga_hsy(vga_hsy),
	.vga_vsy(vga_vsy)
    );
endmodule

pll分频模块利用ip核进行实例化

vga控制模块:

module vga_countroller(clk,rst_n,vga_r,vga_g,vga_b,vga_hsy,vga_vsy
    );
	input  clk;
	input  rst_n;
	
	output vga_r;
	output vga_g;
	output vga_b;
	output reg vga_hsy;
	output reg vga_vsy;
	
	//VGA_Timing 800*600 &50MHZ &72Hz;
	parameter VGA_HTT=12'd1040-12'd1;//Hor Total Time(行帧长)
	parameter VGA_HST=12'd120;       //Hor Sync Time(同步脉冲)
	parameter VGA_HBP=12'd64;        //Hor Back Porch(后沿脉冲)
	parameter VGA_HVT=12'd800;       //Hor Valid Time(显示脉冲)
	parameter VGA_HFP=12'd56;        //Hor Front Porch(前沿脉冲)
	parameter VGA_VTT=12'd666-12'd1; //Hor Total Time(列帧长)
	parameter VGA_VST=12'd6;         //Hor Sync Time(同步脉冲)
	parameter VGA_VBP=12'd23;        //Hor Back Porch(后沿脉冲)
	parameter VGA_VVT=12'd600;       //Hor Valid Time(显示脉冲)
	parameter VGA_VFP=12'd37;        //Hor Front Porch(前沿脉冲)
	parameter VGA_CORBER=12'd100;    //8等分做colorbar显示
	//X和Y坐标计数器
	reg [11:0] xcnt;
	reg [11:0] ycnt;
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			xcnt<=12'd0;
		end
		else if(xcnt>=VGA_HTT)begin
			xcnt<=12'd0;
		end
		else begin
			xcnt<=xcnt+1'b1;
		end
	end
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			ycnt<=12'd0;
		end
		else if(xcnt==VGA_HTT)begin
			if(ycnt>=VGA_VTT)begin
				ycnt<=12'd0;
			end
			else begin
				ycnt<=ycnt+1'b1;
			end
		end
		else begin
			ycnt<=ycnt;
		end
	end
	//行信号生成
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			vga_hsy<=1'b0;
		end
		else if(xcnt<VGA_HST)begin
			vga_hsy<=1'b1;
		end
		else begin
			vga_hsy<=1'b0;
		end
	end
	//场信号生成
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			vga_vsy<=1'b0;
		end
		else if(ycnt<VGA_VST)begin
			vga_vsy<=1'b1;
		end
		else begin
		    vga_vsy<=1'b0;
		end
	end
	//显示有效区域标志信号生成
	reg vga_vaild;//显示区域内,该信号为高电平
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			vga_vaild<=1'b0;
		end
		else if(xcnt>=(VGA_HST+VGA_HBP)&&xcnt<(VGA_HST+VGA_HBP+VGA_HVT)&&
		ycnt>=(VGA_VST+VGA_VBP)&&ycnt<(VGA_VST+VGA_VBP+VGA_VVT))begin
			vga_vaild<=1'b1;
		end
		else begin
			vga_vaild<=1'b0;
		end
	end
	//产生颜色逻辑
	reg vga_rdb;
	reg vga_gdb;
	reg vga_bdb;
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			vga_rdb=1'b0;
			vga_gdb=1'b0;
			vga_bdb=1'b0;
		end
		else if(xcnt==(VGA_HST+VGA_HBP))begin//绿色边框
			vga_rdb=1'b0;
			vga_gdb=1'b1;
			vga_bdb=1'b0;
		end
		else if(xcnt==(VGA_HST+VGA_HBP+VGA_HVT-1'b1))begin//绿色边框
			vga_rdb=1'b0;
			vga_gdb=1'b1;
			vga_bdb=1'b0;
		end
		else if(ycnt==(VGA_VST+VGA_VBP))begin//绿色边框
			vga_rdb=1'b0;
			vga_gdb=1'b1;
			vga_bdb=1'b0;
		end
		else if(ycnt==(VGA_VST+VGA_HBP+VGA_VVT-4'd1))begin//绿色边框
			vga_rdb=1'b0;
			vga_gdb=1'b1;
			vga_bdb=1'b0;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER)begin//1个
			vga_rdb=1'b0;
			vga_gdb=1'b0;
			vga_bdb=1'b0;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER*4'd2)begin//2个
			vga_rdb=1'b0;
			vga_gdb=1'b0;
			vga_bdb=1'b1;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER*4'd3)begin//3个
			vga_rdb=1'b0;
			vga_gdb=1'b1;
			vga_bdb=1'b0;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER*4'd4)begin//4个
			vga_rdb=1'b0;
			vga_gdb=1'b1;
			vga_bdb=1'b1;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER*4'd5)begin//5个
			vga_rdb=1'b1;
			vga_gdb=1'b0;
			vga_bdb=1'b0;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER*4'd6)begin//6个
			vga_rdb=1'b1;
			vga_gdb=1'b0;
			vga_bdb=1'b1;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER*4'd7)begin//7个
			vga_rdb=1'b1;
			vga_gdb=1'b1;
			vga_bdb=1'b0;
		end
		else if(xcnt<=VGA_HST+VGA_HBP+VGA_CORBER*4'd8)begin//8个
			vga_rdb=1'b1;
			vga_gdb=1'b1;
			vga_bdb=1'b1;
		end
		else begin
			vga_rdb=1'b0;
			vga_gdb=1'b0;
			vga_bdb=1'b0;
		end
	end
	assign vga_r = vga_vaild ? vga_rdb :1'b0;
	assign vga_g = vga_vaild ? vga_gdb :1'b0;
	assign vga_b = vga_vaild ? vga_bdb :1'b0;
	             
endmodule

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/86478989
今日推荐