verilog HDL编程驱动VGA接口显示图像 代码全注释

关于VGA的编程接口可参考

https://blog.csdn.net/qq_39148922/article/details/85005271

本代码驱动屏幕显示红绿蓝三道条纹,具体的代码解释可参考注释

module vgaTest(
	clk,horSync,verSync,rForOut,gForOut,bForOut,reset
);
	input clk;//输入的系统时钟,50MHz
	input reset;//复位信号
	output horSync;//横向的同步脉冲信号
	output verSync;//纵向的同步脉冲信号
	output [2:0]rForOut;//输出的红色电平
	output [2:0]gForOut;//输出的绿色电平
	output [2:0]bForOut;//输出的蓝色电平
	
	//下面是输出信号的寄存器
	reg horSyncReg;//横向同步信号脉冲寄存器
	reg verSyncReg;//纵向同步信号脉冲寄存器
	reg [2:0]rReg;//红色寄存器
	reg [2:0]gReg;//绿色寄存器
	reg [2:0]bReg;//蓝色寄存器
	//让输出变量跟随寄存器
	assign horSync=horSyncReg;
	assign verSync=verSyncReg;
	assign rForOut=rReg;
	assign gForOut=gReg;
	assign bForOut=bReg;
	
	//下面是扫描周期每个阶段的截止时间点
	parameter horSyncTime=120;//横向同步脉冲时间点
	parameter horFrontTime=56+horSyncTime;//横向扫描的前肩时间点
	parameter horVisibleTime=800+horFrontTime;//横向扫描的可见时间点
	parameter horBackTime=64+horVisibleTime;//横向扫描的后肩时间点,即一个周期的结束点
	
	//因为纵向的变化都是在每一行结束的时候触发,所以下面用line表示时间
	parameter verSyncLine=6;//纵向扫描同步脉冲时间点
	parameter verFrontLine=37+verSyncLine;//纵向扫描前肩时间点
	parameter verVisibleLine=600+verFrontLine;//纵向扫描可见时间点
	parameter verBackLine=23+verVisibleLine;//纵向扫描后肩时间点,即一个纵向周期的结束点
	
	//下面是三个彩条的宽度
	parameter redHeight=200+verVisibleLine;//0~199为红色
	parameter greenHeight=200+redHeight;//200~399为绿色
	parameter blueHeight=200+greenHeight;//400~599为蓝色
	
	reg [11:0]horCount;//横向计数器
	reg [11:0]verCount;//纵向计数器
	always @ (posedge clk or negedge reset)
	begin
		if(~reset)//复位信号,对计数器清零
		begin
			horCount<=0;
			verCount<=0;
		end
		else//对时钟的响应
		begin
			if(horCount==horBackTime-1)//横向时钟计数到周期的结束时
			begin
				horCount<=0;//计数器置零
				
				//横向时钟计数满一次,纵向时钟才响应一次
				if(verCount==verBackLine-1)//判断纵向时钟是否计数潢
				begin
					verCount<=0;//清零
				end
				else
				begin
					verCount<=verCount+1;//计数+1
				end
			end
			else
			begin
				horCount<=horCount+1;//计数+1
			end
		end
	end
	
	//下面判断横向同步脉冲的产生时间
	//这里也可以直接用   horSyncReg=horCount>=horSyncTime;
	always @ (posedge clk)
	begin
		if(horCount<horSyncTime)
			horSyncReg<=0;//产生脉冲的时候为0
		else
		horSyncReg<=1;//平常为1
	end
	
	//下面判断纵向脉冲的产生时间
	always @ (posedge clk)
	begin
		if(verCount<verSyncLine)
			verSyncReg<=0;//产生脉冲的时候为0
		else
			verSyncReg<=1;//产生的脉冲为1
	end
	
	//下面维护颜色的变化过程
	always @ (posedge clk)
	begin
		if((horCount>=horFrontTime)&&(horCount<horVisibleTime)&&(verCount>=verFrontLine)&&(verCount<verVisibleLine))//同步脉冲时间和消隐时间不能显示
		begin
			if(verCount<redHeight)//红色
			begin
				rReg<=7;
				gReg<=0;
				bReg<=0;
			end
			else if(verCount<greenHeight)//绿色
			begin
				rReg<=0;
				gReg<=7;
				bReg<=0;
			end
			else if(verCount<blueHeight)//蓝色
			begin
				rReg<=0;
				gReg<=0;
				bReg<=7;
			end
		end
		else//非显示时间
		begin
			rReg<=0;
			gReg<=0;
			bReg<=0;
		end
	end
endmodule

猜你喜欢

转载自blog.csdn.net/qq_39148922/article/details/85010426