activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...

1)实验平台:正点原子领航者ZYNQ开发板

2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761

3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html

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

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

http://weixin.qq.com/r/hEhUTLbEdesKrfIv9x2W (二维码自动识别)

第二十章SD卡读BMP图片HDMI显示实验
我们在“SD卡读BMP图片LCD显示实验”中,成功地将SD卡中的BMP图片读出,并将其显示在了LCD屏上。本章我们将学习如何SD卡中的BMP图片显示在HDMI显示器上。
本章包括以下几个部分:
2020.1简介
20.2实验任务
20.3硬件设计
20.4软件设计
20.5下载验证
20.1简介
在“SD卡读BMP图片LCD显示实验”的简介部分,我们详细介绍了BMP图片的数据格式;另外在《领航者FPGA开发指南》中的“HDMI彩条显示实验”一章,我们介绍了HDMI接口。如果大家对这两部分的内容不熟悉的话,可以参考相应的章节,此处就不再赘述了。
20.2实验任务
本章的实验任务是使用领航者ZYNQ开发板读取SD卡中存放的BMP格式图片,分辨率为1920*1080,并将其显示在HDMI显示器上。
20.3硬件设计
根据实验任务我们可以画出本次实验的系统框图,如下图所示:

a7f30b4a772be9f565b694cb6fe3b8d9.png

图 20.3.1 系统框图


图 5.3.1与“SD卡读BMP图片LCD显示实验”中的系统框图基本相同,只是将驱动LCD显示的rgb2lcd模块替换成了本次实验中的DVI Transmitter,用于驱动HDMI接口;另外还删除了用于读取LCD ID信息的AXI GPIO模块。因此本次实验的硬件设计部分在“SD卡读BMP图片LCD显示实验”的基础上稍作修改即可。
首先要删除《SD卡读BMP图片LCD显示实验》工程中的rgb to lcd和AXI GPIO两个模块,以及LCD相关的接口。如图 20.3.2所示,我们要删除图中橙色高亮的两个模块和3个接口:

088842925249f5686729c9ca7cdab087.png

图 20.3.2 删除LCD相关模块


接下来添加DVI Transmitter IP核。该IP核位于工程目录下的ip_repo文件夹中,名为“DVI_TX”。我们需要将其添加到工程的IP库中,添加IP核的方法请大家参考“自定义IP核-呼吸灯实验”。添加完成后,我们要在Block Design中连接DVI Transmitter模块的接口信号,并引出外部端口,具体的连接方式如图 20.3.3所示:

509fd23b2656a88e29732cc0aafc28c9.png

图 20.3.3 添加并连接DVI_Transmitter IP核


至此本次实验的硬件框图已经搭建好了。需要说明的是,本次实验的硬件框图是基于《SD卡读BMP图片LCD显示实验》搭建的,VDMA的AXI Stream格式数据流和Memory Map格式数据流的时钟频率设置的较低,为100Mhz,因此VDMA和DDR3的数据交互速率会受到限制,即支持的HDMI显示分辨率无法达到很高,实测最大能达到的分辨率为1280x800。
对于LCD屏的显示实验来说,达到1280x800的分辨率已经够用了,但是考虑到目前大多数的HDMI显示器支持1080P(1920x1080)的分辨率,我们需要对底层搭建的硬件环境做修改,才能支持1080P分辨率。考虑到本手册HDMI显示相关的例程不需要1080P分辨率,且大多数HDMI显示例程是基于LCD例程修改而来,如果每次都为了兼容1080P分辨率而修改底层硬件环境比较麻烦,因此本手册仅本章实验的底层硬件环境支持1080P分辨率,其它HDMI实验大家如果有1080P分辨率的显示需求,可以按照本章实验进行修改。
底层硬件修改的方法是将VDMA的AXI Stream格式数据流和Memory Map格式数据流的时钟频率改为150Mhz,而VDMA的配置端口不需要太高的频率,可以仍然保持100Mhz。
首先双击打开“ZYNQ7 Processing System”框图,点击“Clock Configuration”,在“PL Fabric Clocks”一栏下勾选FCLK_CLK1,时钟频率设置为150Mhz。设置完成后,点击“OK”按钮,如下图所示:

5eb3539423da4997ba3e4eb6dd1d777a.png

图 20.3.4 添加“FCLK_CLK1”时钟


修改完成后,可以发现“ZYNQ7 Processing System”框图多了一个FCLK_CLK1端口。接下来删除FCLK_CLK0连线,首先选中FCLK_CLK0的连线使其高亮,然后按下键盘的“Delete”进行删除,如图 20.3.5和图 20.3.6所示:

928e069bf7c5c039b433077d8b741a2f.png

图 20.3.5 选中FCLK_CLK0连线

bce23b4e6ca644bb2145fd1565ef858a.png

图 20.3.6 删除FCLK_CLK0连线


然后删除框图中的AXI Interconnect IP核(ps7_0_axi_periph)、AXI SmartConnect IP核(axi_smc)和Processor System Reset IP核(rst_ps7_0_100M),框图删除后,如下图所示。

b54be9dc97a5ea4a1ed91bb72a7d345c.png

图 20.3.7 删除IP核


接下来连接FCLK_CLK1的时钟,如下图所示。

06fcf6e270547312243483b7119bb9ad.png


然后点击“Run Connnection Automation”,下面列出了会自动连接的模块及其接口,勾选“All Automation”,然后点击“OK”按钮。
此时系统会自动生成 AXI Interconnect 和 AXI Smartconnect。AXI Interconnect(ps7_0_axi_periph)用于桥接ZYNQ处理器M_AXI_GP0总线和外部低速外设的AXI_LITE总线;AXI Smartconnect(axi_smc)用于连接ZYNQ处理器的HP0接口和VDMA的M_AXI_MM2S总线。另外系统也自动生成了两个 reset模块(rst_ps7_0_100M和rst_ps7_0_150M),用于复位总线上的外设。
整体系统架构图如下:

0f614131f04874c12069de2c3230364e.png

图 20.3.8 整体系统架构连接图


block design修改完成后保存,然后重新Generate Output Products和“Create HDL Wrapper”。接下来我们还要修改约束文件,为HDMI接口分配引脚。打开工程中名为“system_wrapper.xdc”的约束文件,并将原先LCD相关的约束语句删除,替换成以下内容:
set_property -dict {PACKAGE_PIN G17 IOSTANDARD LVCMOS33} [get_ports tmds_oen_0]
set_property PACKAGE_PIN L16 [get_ports {TMDS_0_tmds_data_p[2]}]
set_property PACKAGE_PIN M14 [get_ports {TMDS_0_tmds_data_p[1]}]
set_property PACKAGE_PIN K19 [get_ports {TMDS_0_tmds_data_p[0]}]
set_property PACKAGE_PIN L14 [get_ports TMDS_0_tmds_clk_p]
保存约束文件,然后选择“Generate Bitstream”重新生成BIT文件。
20.4软件设计
本次实验的软件工程与“SD卡读BMP图片LCD显示实验”略有不同,如下图所示:

21801d7e046e1b87b64e4ccbe92b70b0.png

图 20.4.1 软件工程


图 20.4.1左侧红色方框中的文件夹名为“display_ctrl_hdmi”,它在前面实验中“display_ctrl”的基础上删除了GPIO相关的函数及变量。在本次实验中删除了AXI GPIO模块,因此要删除这些函数和变量,否则会报错。
本次实验的代码如下所示:

  1. 1 #include <stdio.h>
  2. 2 #include <stdlib.h>
  3. 3 #include <string.h>
  4. 4 #include "xil_types.h"
  5. 5 #include "xil_cache.h"
  6. 6 #include "xparameters.h"
  7. 7 #include "xaxivdma.h"
  8. 8 #include "xaxivdma_i.h"
  9. 9 #include "display_ctrl_hdmi/display_ctrl.h"
  10. 10 #include "vdma_api/vdma_api.h"
  11. 11 #include "ff.h"
  12. 12
  13. 13 //宏定义
  14. 14 #define BYTES_PIXEL 3 //像素字节数,RGB888占3个字节
  15. 15 #define DYNCLK_BASEADDR XPAR_AXI_DYNCLK_0_BASEADDR //动态时钟基地址
  16. 16 #define VDMA_ID XPAR_AXIVDMA_0_DEVICE_ID //VDMA器件ID
  17. 17 #define DISP_VTC_ID XPAR_VTC_0_DEVICE_ID //VTC器件ID
  18. 18
  19. 19 //函数声明
  20. 20 void load_sd_bmp(u8 *frame);
  21. 21
  22. 22 //全局变量
  23. 23 XAxiVdma vdma;
  24. 24 DisplayCtrl dispCtrl;
  25. 25 VideoMode vd_mode;
  26. 26 //frame buffer的起始地址
  27. 27 unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR + 0x1000000);
  28. 28 unsigned int lcd_id=0; //LCD ID
  29. 29
  30. 30 int main(void)
  31. 31 {
  32. 32 xil_printf("HDMI Display 1920*1080 rn");
  33. 33
  34. 34 //设置video参数,分辨率:1920*1080
  35. 35 vd_mode = VMODE_1920x1080;
  36. 36
  37. 37 //配置VDMA
  38. 38 run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
  39. 39 frame_buffer_addr,0, 0,ONLY_READ);
  40. 40
  41. 41 //初始化Display controller
  42. 42 DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
  43. 43 //设置VideoMode
  44. 44 DisplaySetMode(&dispCtrl, &vd_mode);
  45. 45 DisplayStart(&dispCtrl);
  46. 46
  47. 47 //读取SD卡图片并显示
  48. 48 load_sd_bmp((u8*)frame_buffer_addr);
  49. 49
  50. 50 return 0;
  51. 51 }
  52. 52
  53. 53 //从SD卡中读取BMP图片
  54. 54 void load_sd_bmp(u8 *frame)
  55. 55 {
  56. 56 static FATFS fatfs;
  57. 57 FIL fil;
  58. 58 u8 bmp_head[54];
  59. 59 UINT *bmp_width,*bmp_height,*bmp_size;
  60. 60 UINT br;
  61. 61 int i;
  62. 62
  63. 63 //挂载文件系统
  64. 64 f_mount(&fatfs,"",1);
  65. 65
  66. 66 //打开文件
  67. 67 f_open(&fil,"fengjing.bmp",FA_READ);
  68. 68
  69. 69 //移动文件读写指针到文件开头
  70. 70 f_lseek(&fil,0);
  71. 71
  72. 72 //读取BMP文件头
  73. 73 f_read(&fil,bmp_head,54,&br);
  74. 74 xil_printf("fengjing.bmp head: nr");
  75. 75 for(i=0;i<54;i++)
  76. 76 xil_printf(" %x",bmp_head);
  77. 77
  78. 78 //打印BMP图片分辨率和大小
  79. 79 bmp_width = (UINT *)(bmp_head + 0x12);
  80. 80 bmp_height = (UINT *)(bmp_head + 0x16);
  81. 81 bmp_size = (UINT *)(bmp_head + 0x22);
  82. 82 xil_printf("n width = %d, height = %d, size = %d bytes nr",
  83. 83 *bmp_width,*bmp_height,*bmp_size);
  84. 84
  85. 85 //读出图片,写入DDR
  86. 86 for(i=*bmp_height-1;i>=0;i--){
  87. 87 f_read(&fil,frame+i*(*bmp_width)*3,(*bmp_width)*3,&br);
  88. 88 }
  89. 89
  90. 90 //关闭文件
  91. 91 f_close(&fil);
  92. 92
  93. 93 Xil_DCacheFlush(); //刷新Cache,数据更新至DDR3中
  94. 94 xil_printf("show bmpnr");
  95. 95 }


可以看出,本次实验的程序与“SD卡读BMP图片LCD显示实验”非常相似,只是删除了读取LCD ID相关的内容。有关这部分代码的详细介绍请大家参考“SD卡读BMP图片LCD显示实验”,此处不再赘述。需要注意的是,本次实验在SD卡中放置的图片分辨率为1920*1080,因此在程序的第35行,视频参数设置成VMODE_1920x1080。
20.5下载验证
首先我们将下载器与领航者底板上的JTAG接口连接,下载器另外一端与电脑连接。然后使用Mini USB连接线将开发板左侧的USB_UART接口与电脑连接,用于串口通信。
我们在工程目录下新建了一个名为“风景图片”的文件夹,把其中名为“fengjing.bmp”的图片拷贝到SD卡的根目录下,然后将SD卡插入领航者底板背面的卡槽中。另外还需要使用HDMI连接线将HDMI显示器连接到领航者底板上的HDMI接口。最后连接开发板的电源,并打开电源开关。
在SDK软件下方的SDK Terminal窗口中点击右上角的加号来设置并连接串口。然后下载本次实验硬件设计过程中所生成的BIT文件,来对PL进行配置。最后下载软件程序,下载完成后,在下方的SDK Terminal中可以看到应用程序打印的信息,如下图所示:

f2ea1d7509f75d14c22b1f39378a515f.png

图 20.5.1 串口打印信息


图 20.5.1中打印出了BMP文件的文件头和信息头等信息,同时从数据中计算出BMP图片的宽度为1920,高度为1080,与我们存入SD卡中的BMP图片一致。
同时HDMI显示器上显示存入SD卡中的示例图片,如图 20.5.2所示,说明本次实验在领航者ZYNQ开发板上面下载验证成功。

90d7752530c072c9e1aa5f22a4846b0e.png

图 20.5.2 下载验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net Redis缓存优化提高加载速度和服务器性能(一)

距离上次服务器将图片转义至oss服务器提交加载速度已经有一段时日了 对于图片转移至oss服务器优化前后的结果可以查看我之前编写的文章点击查看 如今随着商户数的增多&#xff0c;数据的增多&#xff0c;服务器的性能再一次达到了顶峰&#xff0c;并且由于是点餐系统的缘故订…

火星人谚语系列之六:一次真实应用

总目录&#xff1a;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff0c;之八这是2011年7月的一次QQ群对话记录&#xff0c;做了匿名化处理&#xff0c;并重新调整了顺序&#xff0c;以便于阅读。对话的开始&am…

ubuntu 启动图形界面命令_Windows 10 远程连接 Ubuntu 18.04 Server图形界面

目录 0. 环境信息和说明Ubuntu 18.04上安装xrdp远程ubuntu-desktop桌面服务Ubuntu 18.04上安装xrdp远程Xfce桌面服务Ubuntu 18.04上安装vnc远程Xfce桌面服务0.环境信息和说明-----------Ubuntu版本# cat /etc/os-releaseNAME"Ubuntu"VERSION"18.04.3 LTS (Bioni…

动态条形图(RunBargraph)用于数据展示

最近公司项目需要做各种图标展示&#xff0c;用了Echarts的条形图和柱状图&#xff0c;但是老板还是觉得不够生动&#xff0c;看来时候祭出大招了 由此衍生在空余时间写下了此篇博客&#xff0c;首先还是看效果图: 注意&#xff0c;此图中数据并非真实数据&#xff0c;只是为…

网页实现凭证金额分割线_一位整理过5000个网页书签的大神分享:实用的书签管理方案...

我们在日常使用使用搜索引擎的过程中&#xff0c;会逐渐累积各式各样丰富的网站。而当我们保存的书签过多的时候&#xff0c;如果没有一套实用的管理方案&#xff0c;就会造成书签混乱&#xff0c;加大我们搜索的难度。所以&#xff0c;下面跟大家分享一套实用的书签管理方案&a…

【Python基础】11_Python中的字符串

1.字符串的定义 可以使用""双引号&#xff0c;也可以使用单引号定义字符串&#xff0c;一般使用双引号定义。 2.字符串的操作 判断类型&#xff1a; 查找和替换 大小写切换&#xff1a; 文本对齐 注&#xff1a;string.center(weight,str) 以str填充对齐&#xff0c;…

C# 淘宝商品微信返利助手开发-(一)返利助手原理

系列教程一目录&#xff1a;返利助手原理 系列教程二目录&#xff1a;返利助手开放文档以及帐号申请地址 系列教程三目录&#xff1a;返利助手开发&#xff08;1&#xff09;API介绍 系列教程四目录&#xff1a;返利助手开发&#xff08;2&#xff09;淘宝分享的内容如何只取…

c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了

我有相当长的一段时间(数月)没有更新文章了。并不是我放弃了写技术文章&#xff0c;而是因为这段时间&#xff0c;我把精力主要放在了图像智能算法的学习上了。去年12月时&#xff0c;我对图像智能算法还懵懵懂懂&#xff0c;做着 Linux 嵌入式应用程序开发&#xff0c;现在我已…

Burp破解安装(1.7和2.0)

依赖 由于Brup是使用java语言开发的&#xff0c;因此我们需要本地有jdk8的环境&#xff0c;教程自己百度或者<a href"https://www.runoob.com/java/java-environment-setup.html">https://www.runoob.com/java/java-environment-setup.html</a>&#xff…

C# ASP.NET MVC 微信和支付宝H5支付开发及Demo

微信和支付宝H5支付 最近开发任务遇到了一个要在手机浏览器里面调起微信和支付宝去支付的开发需求&#xff0c;以前都是做的扫码支付或者JSAPI都是在软件内部支付的&#xff0c;没遇到过在自己浏览器内唤醒微信或者支付宝的支付这种开发在开发的过程中遇到了许多问题和坑点这里…

dbnetlib sqlserver不存在或拒绝访问_SQL Server数据库损坏和修复

常见错误解读823错误错误信息是&#xff1a;“在文件%ls中、偏移量为%#016I64x的位置执行%S_MSG期间&#xff0c;操作系统已经向SQL Server返回了错误%ls。”“The operating systemreturned error %ls to SQL Server during a %S_MSGat offset %#016I64x in file %ls.”例如&a…

C# ASP.NET MVC 阿里云短信验证码Demo

相信大家在开发过程中又很多使用到验证码验证的功能&#xff0c;今天将验证码的验证整理一下写了一个Demo 通过本篇后你能学习到: 阿里云短信服务Drapper连接SQL Server进行增改操作JS前端倒计时 完成后效果如下: (一)首先我们要使用短信我们先注册短信服务所需的内容 1.首先…

mybatis generator生成example_[Springboot系列] SpringBoot与Mybatis结合

本文作者&#xff1a;cuifuanMybatis 是一个持久层ORM框架&#xff0c;负责Java与数据库数据交互&#xff0c;也可以简易理解为中介&#xff0c;相对于它&#xff0c;还有个中介是hibernate,不过在mybatis中sql语句的灵活性&#xff0c;可优化性比较强&#xff0c;这也是现在大…

在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署...

目前&#xff0c;较为成熟的技术是采用laravelS组件&#xff0c;注意和laravel 区别laravelS多了一个大写的S&#xff0c;由于laravelS默认监听5200端口&#xff0c;所以laravel项目要做一些调整 例如&#xff1a; 静态文件引入的方式-----从静态资源服务器加载我们熟悉的js和c…

Linux上Oracle 11g安装步骤图解(超详细图文教程)附带导入数据和新建数据库教程

首先本文采用Docker方式快速在Linux上安装 目录 1.安装Docker容器 (1)登陆服务器&#xff0c;输入命令安装Docker容器 (2)安装完成后运行下列代码如果弹出Docker版本则表示安装成功 (3)启动Docker并设置跟随系统开机启动 (4)由于国内系统拉取国外镜像缓慢所以我们在开始安…

python中import sys_python import sys出错怎么办

当在pycharm中输入如下代码时&#xff1a;import sys 一、问题&#xff1a; sys下出现红色波浪线&#xff0c;按CtrlF1显示的信息为&#xff1a;no module named sys。 二、原因&#xff1a; 在装Python解释器时&#xff0c;我为了图方便装的是 Python 3.7.0a4 的embeddable版本…

Windows phone7 软件发布:理财计算器(包括wp7房贷计算器,wp7个税计算器,wp7存款利息计算器)...

前一段时间&#xff0c;需要经常用到贷款计算器的功能&#xff0c;这样有利于我们做出更好的决策。但是我们只能通过银行的工作人员的计算器来计算&#xff0c;给我带来了极大的不便和损失&#xff0c;由此便萌生了开发一个Windows phone7版的贷款计算器的功能。 此计算器目前的…

eclipse debug怎么用_利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)

maven搭建安装过程挺简单的&#xff0c;去apache下载apache-maven的zip包&#xff0c;解压到一个目录下&#xff0c;如下图接下来配置windows环境&#xff0c;右击我的电脑--》属性--》高级系统设置--》环境变量--》系统变量--》新建&#xff0c;如下图就是你解压的maven的home…

【转载】ARM芯片介绍

ARM芯片介绍 作者&#xff1a;nbnb001 原文网址&#xff1a;http://bbs.imp3.net/thread-894970-1-1.html 一、ARM9系列 较小的核心面积带来较低的成本&#xff0c;相对比较省电&#xff0c;但难以冲击更高的频率&#xff0c;总体效能有限。 1. 威盛WM8505/WM8505 主频&#xf…

action请求是什么意思_凭什么说大疆Osmo Action可以干掉 GoPro hero7?

国内影像器材相关厂商中&#xff0c;大疆的研发实力显然处在第一阵营中的领军位置。这样评价它&#xff0c;不光是因为大疆这些年推出的产品在成像品质上都极为优秀&#xff0c;更是因为在爱好者眼中&#xff0c;这是一家“发起疯来连自家产品都打压”的技术疯子。和别人竞争&a…