1)实验平台:正点原子新起点V2开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套实验源码+手册+视频下载地址:http://www.openedv.com/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 define
21  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;                                   //方块移动使能信号,频率为100hz
29
30  //*****************************************************
31  //**                    main code
32  //*****************************************************
33  assign move_en = (div_cnt == 22'd742500) ? 1'b1 : 1'b0;
34
35  //通过对vga驱动时钟计数,实现时钟分频
36  always @(posedge pixel_clk ) begin
37      if (!sys_rst_n)
38          div_cnt <= 22'd0;
39      else begin
40          if(div_cnt < 22'd742500)
41              div_cnt <= div_cnt + 1'b1;
42          else
43              div_cnt <= 22'd0;                   //计数达10ms后清零
44      end
45  end
46
47  //当方块移动到边界时,改变移动方向
48  always @(posedge pixel_clk ) begin
49      if (!sys_rst_n) begin
50          h_direct <= 1'b1;                       //方块初始水平向右移动
51          v_direct <= 1'b1;                       //方块初始竖直向下移动
52      end
53      else begin
54          if(block_x == SIDE_W - 1'b1)            //到达左边界时,水平向右
55              h_direct <= 1'b1;
56          else                                    //到达右边界时,水平向左
57          if(block_x == H_DISP - SIDE_W - BLOCK_W)
58              h_direct <= 1'b0;
59          else
60              h_direct <= h_direct;
61
62          if(block_y == SIDE_W - 1'b1)            //到达上边界时,竖直向下
63              v_direct <= 1'b1;
64          else                                    //到达下边界时,竖直向上
65          if(block_y == V_DISP - SIDE_W - BLOCK_W)
66              v_direct <= 1'b0;
67          else
68              v_direct <= v_direct;
69      end
70  end
71
72  //根据方块移动方向,改变其纵横坐标
73  always @(posedge pixel_clk ) begin
74      if (!sys_rst_n) begin
75          block_x <= SIDE_W;                     //方块初始位置横坐标
76          block_y <= SIDE_W;                     //方块初始位置纵坐标
77      end
78      else if(move_en) begin
79          if(h_direct)
80              block_x <= block_x + 1'b1;          //方块向右移动
81          else
82              block_x <= block_x - 1'b1;          //方块向左移动
83
84          if(v_direct)
85              block_y <= block_y + 1'b1;          //方块向下移动
86          else
87              block_y <= block_y - 1'b1;          //方块向上移动
88      end
89      else begin
90          block_x <= block_x;
91          block_y <= block_y;
92      end
93  end
94
95  //给不同的区域绘制不同的颜色
96  always @(posedge pixel_clk ) begin
97      if (!sys_rst_n)
98          pixel_data <= BLACK;
99      else begin
100         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         else
104         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         else
108             pixel_data <= WHITE;                //绘制背景为白色
109     end
110 end
111
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相关推荐

  1. 【正点原子FPGA连载】 第二十二章 HDMI方块移动实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  2. 【正点原子FPGA连载】第二十四章HDMI彩条显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 【正点原子FPGA连载】 第十七章 HDMI彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  4. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

  5. 【正点原子FPGA连载】 第二十九章TFT LCD画板实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  6. 【正点原子FPGA连载】第三十五章高速AD/DA实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  7. 【正点原子MP157连载】第二十六章 DS18B20数字温度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  8. 【正点原子STM32连载】 第四十五章 FLASH模拟EEPROM实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    第四十五章 FLASH模拟EEPROM实验 STM32本身没有自带EEPROM,但是STM32具有IAP(在应用编程)功能,所以我们可以把它的FLASH当成EEPROM来使用.本章,我们将利用STM3 ...

  9. 【正点原子STM32连载】 第二十六章 USMART调试组件实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

最新文章

  1. 【MySQL】MySQL开发注意事项与SQL性能优化步骤
  2. 010_Redis的发布和订阅
  3. 操作系统:基于页面置换算法的缓存原理详解(上)
  4. pythonpip使用方法_Python: pip常见的使用方法
  5. sqlmap简单中文说明
  6. [Swift A] - Using Swift with Cocoa and Objective-C--Mix and Match
  7. 引力波应该称为空间波
  8. python 成语库_README.md · 天宇之游/一个python的TK猜成语游戏 - Gitee.com
  9. 记一次FileZillaServer提权
  10. 佳能打印机IP1880,打印提示墨盒收集器已满的解决方法
  11. python制作时间,如何利用python制作时间戳转换工具详解
  12. MySQL中的文本处理函数整理,收藏速查
  13. Ubuntu16.04系统nvidia显卡上图形界面及OpenGL环境搭建心得
  14. CPU、GPU、TPU、NPU等到底是什么
  15. 《Microduino实战》——1.1 什么是开源
  16. Linux如何卸载slurm,在Ubuntu 16.04桌面上安装/模拟SLURM:slurmd无法启动
  17. RPC or noRPC,这是个问题
  18. 算法之“鱼龙混杂”-3
  19. 游戏/应用出海本地化策略 | 韩国市场篇
  20. pygame安装成功了但却无法导入求大神解

热门文章

  1. Map的几种循环方法!!
  2. YOLOv7:无需预训练模型的最新最实时的目标检测框架
  3. 一个JavaSE的金牌榜小项目,启蒙+提高【重点:Tomcat 8.5 +mysql 5.7+jdk1.8】
  4. python app自动签到_Python实现自动签到(一)
  5. 系统重装之VS+Sql2012+IIS安装总结
  6. static 静态全局变量和静态局部变量的特性
  7. FIPS202:AVX2 版本的 C/C++ 实现
  8. GMV单场破百万,我在抖音电商找到了生意新增量
  9. VS Code 设置代码自动保存
  10. Real-time voxel based 3D semantic mapping with a hand held RGB-D camera