vga显示图像动态移动
一、实验内容
实现vga显示中心200x200的方块动态移动。
二、系统框图
分辨率保持为640x480保持不变,200x200方块在屏幕上移动,总共有5个状态,将3个状态列出,绘制如下框图。
state1:200x200的方块在显示屏上正常移动。
state2:200x200的方块到达显示屏的底部,下一步开始从下往上移动。
state3:200x200的方块到达显示屏的右部,下一步开始从右往左移动。
三、设计分析
简单来说,就是200x200的方块移动到显示屏的边缘时变换方向,可以设计如下的时序。
用两个寄存器作为上下、左右方向控制的变量,初始状态,200x200的方块是从左往右,从上往下移动的,碰到显示器的边沿后,方向改变。200x200的方块替换为相应的显示图像,就可以实现类似屏幕保护程序的功能。
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代表的是偏移量,且只有在一帧显示完毕之后,才会有图像的移动。
代码量很少,关键在于设计的思想。
五、实际波形仿真
仿真就不必了,直接上结果。
结果如下。
![image-20210108214307232](https://gitee.com/sinply/image/raw/master/imgs/20210108214657.png)
六、总结与讨论*
1.涉及到优先级的问题,方块的显示为最高优先级,其余靠边站。
2.每一帧图像显示完毕后,才进行图像的偏移,且水平和垂直方向同步变化。