1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-301505-1-1.html 4)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 5)关注正点原子公众号,获取最新资料更新
在HDMI彩条显示实验中,我们成功地在显示器上显示出了静态的彩条图案。本章我们通过在屏幕上显示一个移动的小方块,来给大家演示如何使用HDMI接口显示动态图案。 本章包括以下几个部分: 22.1 HDMI简介 22.2 实验任务 22.3 硬件设计 22.4 程序设计 22.5 下载验证 22.1 HDMI简介 我们在“HDMI彩条显示实验”中对HDMI视频传输标准作了详细的介绍,包括HDMI接口定义、行场同步时序、以及显示分辨率等。如果大家对这部分内容不是很熟悉的话,请参考“HDMI彩条显示实验”中的HDMI简介部分。 22.2 实验任务 本章的实验任务是使用领航者开发板上的HDMI接口在显示器上显示一个不停移动的方块,要求方块移动到边界处时能够改变移动方向。显示分辨率为1280720,刷新速率为60hz。 22.3 硬件设计 HDMI接口部分的硬件设计原理及本实验中各端口信号的管脚分配与“HDMI彩条显示实验”完全相同,请参考“HDMI彩条显示实验”中的硬件设计部分。 22.4 程序设计 图 7.5.13.1是根据本章实验任务画出的系统框图。其中,时钟生成IP核(clk_wiz_0)生成1280720分辨率所需的像素时钟74.25MHz、以及TMDS编码驱动IP核所需的像素时钟的5倍频率即74.25 * 5 = 371.25MHz。RGB驱动模块(rgb_driver)负责产生RGB时序,并输出来自RGB显示模块(rgb_display)的RGB数据。RGB数据被送入TMDS编码驱动IP核(rgb2dvi_0)并最后输出到HDMI接口。
图 7.5.13.1 HDMI方块移动实验系统框图 在“HDMI彩条显示实验”中,我们利用RGB驱动模块输出的像素点的横坐标,在RGB显示模块中完成了彩条图案的绘制。而在本次实验中,为了完成方块的显示,需要同时使用像素点的横坐标和纵坐标来绘制方块所在的矩形区域,另外还需要知道矩形区域左上角的顶点坐标。由于RGB显示的图像在行场同步信号的同步下不停的刷新,因此只要连续改变方块左上角顶点的坐标,并在新的坐标点处重新绘制方块,即可实现方块移动的效果。 各模块端口及信号连接如图 7.5.13.2所示:
图 7.5.13.2 顶层模块原理图 图 7.5.13.2中的顶层模块(hdmi_block_move_top)、时钟分频IP核(clk_wiz_0)、TMDS编码驱动IP核(rgb2dvi_0)以及RGB驱动模块(rgb_display)均与“HDMI彩条显示实验”完全相同,只对RGB显示模块(RGB_display)作了修改。因此,这里我们重点讲解RGB显示模块,其他部分大家可以参考“HDMI彩条显示实验”。 RGB显示模块的代码如下:
1 module rgb_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 //通过对像素时钟计数,实现时钟分频
36 always @(posedge pixel_clk ) begin
37 if (!sys_rst_n)
38 div_cnt
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?