失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开

【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开

时间:2023-02-09 11:14:42

相关推荐

【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开

1)实验平台:正点原子新起点V2开发板

2)平台购买地址:/item.htm?id=609758951113

2)全套实验源码+手册+视频下载地址:/thread-300792-1-1.html

3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016

4)关注正点原子公众号,获取最新资料更新

第二十五章HDMI方块移动实验

在HDMI彩条显示实验中,我们成功地在显示器上显示出了静态的彩条图案。本章我们通过在屏幕上显示一个移动的小方块,来给大家演示如何使用HDMI接口显示动态图案。

本章包括以下几个部分:

232424.1简介

24.2实验任务

24.3硬件设计

24.4程序设计

24.5下载验证

25.1简介

我们在“HDMI彩条显示实验”中对HDMI视频传输标准作了详细的介绍,包括HDMI接口定义、行场同步时序、以及显示分辨率等。如果大家对这部分内容不是很熟悉的话,请参考“HDMI彩条显示实验”中的HDMI简介部分。

25.2实验任务

本章的实验任务是驱动新起点开发板上的HDMI接口,在显示器上显示一个不停移动的方块,要求方块移动到边界处时能够改变移动方向。显示分辨率为1280*720,刷新速率为60hz。

25.3硬件设计

HDMI接口部分的硬件设计原理及本实验中各端口信号的管脚分配与“HDMI彩条显示实验”完全相同,请参考“HDMI彩条显示实验”中的硬件设计部分。

25.4程序设计

图 24.4.1是根据本章实验任务画出的系统框图,本次实验的系统框图和“HDMI彩条显示实验”一致,如下图所示:

图 25.4.1 系统框图

本次实验和“HDMI彩条显示实验”相比,只是修改了视频显示模块,而其它模块完全一致,因此本章只介绍视频显示模块。在“HDMI彩条显示实验”中,我们利用视频驱动模块输出的像素点的横坐标,在视频显示模块中完成了彩条图案的绘制。而在本次实验中,为了完成方块的显示,需要同时使用像素点的横坐标和纵坐标来绘制方块所在的矩形区域,另外还需要知道矩形区域左上角的顶点坐标。由于视频显示的图像在行场同步信号的同步下不停的刷新,因此只要连续改变方块左上角顶点的坐标,并在新的坐标点处重新绘制方块,即可实现方块移动的效果。

视频显示模块代码如下:1 module video_display(2 input pixel_clk,//驱动时钟3 input sys_rst_n,//复位信号4 5 input[10:0] pixel_xpos,//像素点横坐标6 input[10:0] pixel_ypos,//像素点纵坐标 7 output reg [23:0] pixel_data//像素点数据8 ); 9 10 //parameter define 11 parameter H_DISP = 11'd1280; //分辨率--行12 parameter V_DISP = 11'd720; //分辨率--列13 14 localparam SIDE_W = 11'd40;//屏幕边框宽度15 localparam BLOCK_W = 11'd40;//方块宽度16 localparam BLUE = 24'b00000000_00000000_11111111; //屏幕边框颜色 蓝色17 localparam WHITE = 24'b11111111_11111111_11111111; //背景颜色 白色18 localparam BLACK = 24'b00000000_00000000_00000000; //方块颜色 黑色19 20 //reg define21 reg [10:0] block_x = SIDE_W ; //方块左上角横坐标22 reg [10:0] block_y = SIDE_W ; //方块左上角纵坐标23 reg [21:0] div_cnt; //时钟分频计数器24 reg h_direct; //方块水平移动方向,1:右移,0:左移25 reg v_direct; //方块竖直移动方向,1:向下,0:向上26 27 //wire define 28 wire move_en;//方块移动使能信号,频率为100hz29 30 //*****************************************************31 //**main code32 //*****************************************************33 assign move_en = (div_cnt == 22'd742500) ? 1'b1 : 1'b0;34 35 //通过对vga驱动时钟计数,实现时钟分频36 always @(posedge pixel_clk ) begin 37if (!sys_rst_n)38div_cnt <= 22'd0;39else begin40if(div_cnt < 22'd742500) 41 div_cnt <= div_cnt + 1'b1;42else43 div_cnt <= 22'd0; //计数达10ms后清零44end45 end46 47 //当方块移动到边界时,改变移动方向48 always @(posedge pixel_clk ) begin 49if (!sys_rst_n) begin50h_direct <= 1'b1; //方块初始水平向右移动51v_direct <= 1'b1; //方块初始竖直向下移动52end53else begin54if(block_x == SIDE_W - 1'b1) //到达左边界时,水平向右55 h_direct <= 1'b1;56else//到达右边界时,水平向左57if(block_x == H_DISP - SIDE_W - BLOCK_W)58 h_direct <= 1'b0;59else60 h_direct <= h_direct;61 62if(block_y == SIDE_W - 1'b1) //到达上边界时,竖直向下63 v_direct <= 1'b1;64else//到达下边界时,竖直向上65if(block_y == V_DISP - SIDE_W - BLOCK_W)66 v_direct <= 1'b0;67else68 v_direct <= v_direct;69end70 end71 72 //根据方块移动方向,改变其纵横坐标73 always @(posedge pixel_clk ) begin 74if (!sys_rst_n) begin75block_x <= SIDE_W; //方块初始位置横坐标76block_y <= SIDE_W; //方块初始位置纵坐标77end78else if(move_en) begin79if(h_direct) 80 block_x <= block_x + 1'b1;//方块向右移动81else82 block_x <= block_x - 1'b1;//方块向左移动83 84if(v_direct) 85 block_y <= block_y + 1'b1;//方块向下移动86else87 block_y <= block_y - 1'b1;//方块向上移动88end89else begin90block_x <= block_x;91block_y <= block_y;92end93 end94 95 //给不同的区域绘制不同的颜色96 always @(posedge pixel_clk ) begin 97if (!sys_rst_n) 98pixel_data <= BLACK;99else begin100 if( (pixel_xpos < SIDE_W) || (pixel_xpos >= H_DISP - SIDE_W)101 || (pixel_ypos < SIDE_W) || (pixel_ypos >= V_DISP - SIDE_W))102 pixel_data <= BLUE; //绘制屏幕边框为蓝色103 else104 if( (pixel_xpos >= block_x) && (pixel_xpos < block_x + BLOCK_W)105 && (pixel_ypos >= block_y) && (pixel_ypos < block_y + BLOCK_W))106 pixel_data <= BLACK;//绘制方块为黑色107 else108 pixel_data <= WHITE;//绘制背景为白色109end110 end111 112 endmodule

代码中14至18行声明了一系列的参数,方便大家修改边框尺寸、方块大小、以及各部分的颜色等。其中边框尺寸和方块宽度均以像素点为单位。当方块的宽度确定时,如果我们知道方块左上方顶点的坐标,就能轻而易举的画出整个方块区域。因此,我们将方块的移动简化为其左上角顶点的移动。

由于像素时钟相对于方块移动速度而言过快,我们通过计数器对时钟计数,得到一个频率为100hz的脉冲信号move_en,用它作为使能信号来控制方块的移动(33~45行)。方块的移动方向分为水平方向h_direct和竖直方向v_direct,由代码的47至70行可知,当方块移动到上下边框时,竖直移动方向改变;当方块移动到左右边框时,水平移动方向改变。代码72至93行根据方块的移动方向,在使能信号move_en到来时改变其左上角顶点的纵横坐标值。当move_en的频率为100hz时,方块每秒钟在水平和竖直方向上分别移动100个像素点的距离,也可以通过调整move_en的频率,来加快或减慢方块移动的速度。

代码第95至110行根据RGB驱动模块输出的纵横坐标判断当前像素点所在的区域,对不同区域中的像素点赋以不同的颜色值,从而实现边框、方块以及背景颜色的绘制。

25.5下载验证

首先我们将下载器与开发板上的JTAG接口连接,下载器另外一端与电脑连接。然后使用HDMI连接线将HDMI显示器连接到新起点上的HDMI接口。最后连接开发板的电源,并打开电源开关,如下图所示:

图 25.5.1 新起点开发板连接示意图

然后我们将本次实验生成的SOF文件下载至开发板中,下载完成后观察显示器显示的图案如下图所示,图中的黑色方块能够不停的移动,且碰撞到蓝色边框时能改变移动方向,说明HDMI方块移动程序下载验证成功。

图 25.5.2 HDMI方块移动效果图

【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

如果觉得《【正点原子FPGA连载】第二十五章HDMI方块移动实验 -摘自【正点原子】新起点之FPGA开》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。