15.基础实验(4)vga显示图像动态移动

vga显示图像动态移动

一、实验内容

实现vga显示中心200x200的方块动态移动。

二、系统框图

分辨率保持为640x480保持不变,200x200方块在屏幕上移动,总共有5个状态,将3个状态列出,绘制如下框图。

15.基础实验(4)vga显示图像动态移动_第1张图片

state1:200x200的方块在显示屏上正常移动。

state2:200x200的方块到达显示屏的底部,下一步开始从下往上移动。

state3:200x200的方块到达显示屏的右部,下一步开始从右往左移动。

三、设计分析

简单来说,就是200x200的方块移动到显示屏的边缘时变换方向,可以设计如下的时序。

用两个寄存器作为上下、左右方向控制的变量,初始状态,200x200的方块是从左往右,从上往下移动的,碰到显示器的边沿后,方向改变。200x200的方块替换为相应的显示图像,就可以实现类似屏幕保护程序的功能。

15.基础实验(4)vga显示图像动态移动_第2张图片

x和y为显示偏移量,设置为每一帧数据改变显示的方向,当显示图像触碰到显示屏的边沿位置时,改变显示的方向。

四、实验步骤

根据设计的时序图,编写实现的代码。

//h_add_flag
always @(posedge clk) 
begin
	if (rst == 1'b1) 
		h_add_flag <= 1'b0;
	else if (x == 'd1)	//state change  
		h_add_flag <= 1'b0;
	else if (x == H_ADDR_TIME - H_BASIC - 'd1)	//state change 
		h_add_flag <= 1'b1;
end

//v_add_flag
always @(posedge clk) 
begin
	if (rst == 1'b1) 
		v_add_flag <= 1'b0;
	else if (y == 'd1)	//state change  
		v_add_flag <= 1'b0;
	else if (y == V_ADDR_TIME - V_BASIC - 'd1)	//state change 
		v_add_flag <= 1'b1;
end

//x
always @(posedge clk) 
begin
	if (rst == 1'b1) 
		x <= 'd0;
	else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && h_add_flag == 1'b0)
		x <= x + 'd1;	
	else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && h_add_flag == 1'b1)
		x <= x - 'd1;
end

//y
always @(posedge clk) 
begin
	if (rst == 1'b1) 
		y <= 'd0;
	else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && v_add_flag == 1'b0)
		y <= y + 'd1;	
	else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1) && v_add_flag == 1'b1)
		y <= y - 'd1;
end

//rgb
always @(posedge clk) 
begin
	if (rst == 1'b1) 
		rgb <= 'd0;
	else if (h_valid == 1'b1 && v_valid == 1'b1)
	begin
		if (h_valid_cnt >= x && h_valid_cnt < x+'d200 && v_valid_cnt >= y && v_valid_cnt < y+'d200)	
			rgb <= 3'b111;
		else if (v_valid_cnt < 'd120)
			rgb <= 3'b100;
		else if (v_valid_cnt < 'd240)
			rgb <= 3'b010;
		else if (v_valid_cnt < 'd360) 
			rgb <= 3'b001;
		else 
			rgb <= 3'b101;
	end
	else
		rgb <= 'd0;
end

x,y代表的是偏移量,且只有在一帧显示完毕之后,才会有图像的移动。

代码量很少,关键在于设计的思想。

五、实际波形仿真

仿真就不必了,直接上结果。

结果如下。

六、总结与讨论*

1.涉及到优先级的问题,方块的显示为最高优先级,其余靠边站。

2.每一帧图像显示完毕后,才进行图像的偏移,且水平和垂直方向同步变化。

你可能感兴趣的:(FPGA基础实验,fpga,verilog,svga)