目录
一.实验要求
使用启明星开发板上的 HDMI 接口在显示器上显示一个不停移动的方块,要求方块
移动到边界处时能够改变移动方向。显示分辨率为 1280*720,刷新速率为 60hz。
二.方块移动原理
如下图所示,需要在宽为1280,长为720的显示屏上显示方块。蓝色部分为边界框,四条边界框的宽度都为40,方块的四个边长也为40.图中的四个角的黑色坐标是方块移动的边界值(不可到达),四个角的红色坐标是方块能移动到的边界值(可到达)。
以下是为了方便分析画了四个临界值,实际上方块是从斜着移动的。从左至右从上至下,或者从右向左,从下至上。
1.方块移动的起始位置 ,以下出现的方块坐标均指方块左上角坐标点(x,y)。
2.当方块移动到该位置时,即x=1201时,y=41时,方块需改变移动方向,
3.当方块移动到该位置时,即x=41,y=641时,方块需改变移动方向。
4.当方块移动到该位置时,即x=1201,y=641时,方块需改变移动方向。
综上所述,41<=X<=1201,41<=Y<=641。只要任一坐标上过以上边界值就需要改变移动方向。
为了方便后面代码的理解,设方块左上角的坐标为(block_x,block_y),方块边长为BLOCK_W,边框(蓝色部分)宽度为SIDE_W。显示屏的宽为H_DISP,显示屏的长为V_DISP。故方块坐标范围为SIDE_W+1<=block_x<=H_DISP-SIDE_W-BLOCK_W+1,
SIDE_W+1<=block_y<=V_DISP-SIDE_W-BLOCK_W+1.
三.代码解读
因为其余模块与上一节实验hdmi显示彩条实验完全一致,这一实验只需要改变video_display即可。其余保持不变。
3.1方块移动时钟
因为不能用系统时钟进行移动,这里f=75Mhz,则一个周期的时间为1/75=13.3333ns,若要使用该时钟驱动方块移动,则人的肉眼看不出来方块的移动轨迹。故这里需要指定方块移动时钟,ms级别的能被人类肉眼捕捉到,本实验设定10ms,故需要一个计数器来进行时钟分频。10ms/13.3333ns=750000,故计数器的最大值就为750000.
3.2方块移动方向
这里设定方块的位置为(block_x,block_y),也就是方块左上角的坐标。h_direct,v_direct为方块移动方向,h_direct=1,v_direct=1,代表方块从左至右,从上至下移动;h_direct=0,v_direct=0,代表方块从右至左,从下至上移动。
默认方块的移动方向是从左至右,从上至下。
当方框移动到左边界时,改变移动方向为从左至右;
当方块移动到右边界时,改变移动方向为从右至左;
当方块移动到上边界时,改变移动方向为从上至下;
当方块移动到下边界时,改变移动方向为从下至上。
3.3方块坐标更改
刚开始坐标位于左上角处,当方块移动时钟来临,即move_en为1时,
移动方向为从左至右时,x坐标+1;
移动方向为从右至左时,x坐标-1;
移动方向为从上至下时,y坐标+1;
移动方向为从下至上时,y坐标-1;
3.4显示屏不同位置像素值赋值
无需解释
四.波形仿真
4.1方块移动方向
黄色线对齐处block_x=41,代表黑色移动方块已经触碰到左边界值,故需要改变水平移动方向向右,即h_direct=0跳变至1,仿真符合设计。
4.2方块坐标更改
如下图所示,当h_direct=1时代表自左向右移动,block_x应该递增加1;
v_direct=1(黄线后)时代表自上向下移动,block_y应该递增1;
4.3像素赋值
当pixel_xpos<41时代表是边界条,应为蓝色,故赋值为0000ff,之后背景色为白色,故赋值为ffffff
当pixel_xpos= 114之后,即pixel_xpos>=block_x后,表示该位置是方块,应该为黑色,故赋值为000000。