【ZYNQ实验】第一篇、ZYNQ驱动HDMI显示图片

目录

第一部分、实验说明

1、点名过来看

2、实验说明

2.1、涉及到的知识

2.2、使用的硬件

3、测试效果

3.1、实验一效果

3.2、实验二效果

4、写在前面

5、参考文献

第二部分、硬件搭建

第三部分、实现方法

1、实验一

1.1、实验一原理图

1.2、MATLAB图片转换代码

1.2、C代码

1.3、vivado工程链接 

2、实验二

2.1、实验二原理图

2.2、C代码

2.3、vivado工程链接 

第四部分、总结


第一部分、实验说明

1、点名过来看

        之前写过一篇VGA接口驱动的博客【FPGA入门】第七篇、FPGA实现VGA接口驱动

,然后有位道友在下面评论这个问题。然后我就研究了一下HDMI,现在研究明白了,请这位道友记得过来学习。🤪🤪🤪

2、实验说明

        本次实验有两个

        实验一、无需SD卡,将小数据量的图片通过HDMI显示在显示器上;

        实验二、借助SD卡,通过读取SD卡内部的BMP图片数据(图片分辨率1920*1080),再借助HDMI将图片显示在显示器上。

2.1、涉及到的知识

(1)、HDMI发送模块的设计原理参考博客:

【ZYNQ入门】第四篇、HDMI发送端的构成原理-CSDN博客

(2)、ZYNQ内部AXI HP高速接口的读时序以及使用方法,参考博客:

【ZYNQ入门】第五篇、AXI HP口读写数据原理-CSDN博客

(3)、ZYNQ使用SD卡实现读取文本数据和BMP图片数据的原理参考博客:

【ZYNQ入门】第六篇、ZYNQ驱动SD卡读取TXT文本和BMP图片-CSDN博客

(4)、跨时钟域数据传输的问题、ZYNQ内部数据缓存一致性原理

一起写在了第五篇博客的第一节【ZYNQ入门】第五篇、AXI HP口读写数据原理-CSDN博客

(6)、MATLAB读取24bit真彩图像方式。直接参考本篇博客第三节。

2.2、使用的硬件

(1)、FPGA开发板: ZYNQ-7020 ,详细型号:xc7z020clg400-1;

(2)、vivado版本:2018.2;

(3)、HDMI接口显示器分辨率:1920*1080@60Hz;

3、测试效果

3.1、实验一效果

        这里选了三张分辨率为1000*1000的鲲图,然后三张循环播放,循环间隔3s,实际效果如下

        (写博客视频居中的办法:新建一个1*1居中的表格,把视频放入这个表格。)

HDMI显示小数据量图片

3.2、实验二效果

        这里选了三张科迈罗汽车的照片,每张照片的分辨率都为1920*1080的高清图片。首先将照片存入到SD卡中,然后让FPGA去读取SD卡内的图片数据,每个1s显示一张照片,循环显示三张科迈罗的高清图片。

HDMI显示大数据量图片

4、写在前面

        再次申明一下,首先,我写博客是为了记录自己的学习过程,同时巩固记忆,因此内容中肯定有差错,还望见谅。

        其次,很多老铁看我文章都是为了救急一些课程程设计或者毕业设计,这些我觉得挺好的,但是你不要连博客都不看,直接下载源码,然后出了问题,直接私信我:“博主,我把你的工程编译好之后,烧录了,没有反应,你知道是什么问题吗?”。我感觉你像个铁憨憨🤭🤭🤭。

        正常情况下我提供的都是思路,不是结果!不是结果!不是结果!所以我希望家人们要多花点时间调试,想获取结果得弄懂,没弄懂,出了结果你也不知道为什么。我更希望大家问我的问题是:“为什么这里要这么搞?”这种问题我一定会回复,但是你问我:“你的结果为什么出不来?”,我一般不会回复的。

        最后,我认为调试是一个漫长的过程,只有静下心来慢慢搞,实现了才会有成就感。特别是借助别人的代码基础实现自己想要的功能,这真的会有很多的成就感呢!共勉!

5、参考文献

        米联客_XILINX ZYNQ裸机篇2019版

        正点原子_领航者ZYNQSDK开发指南

        V3学院FPGA视频课程 

第二部分、硬件搭建

        整个系统的连接如下,主要是两个模块,一个hdmi数据发送模块,一个AXI HP接口读模块。

        两个实验的硬件都是一样的,不需要修改。

第三部分、实现方法

 1、实验一

        第一个实验,可用于小数据量的图片显示。前期通过MATLAB将图片转换为RGB888格式的真彩数据;然后,将数据放入一个数组;最后再将数组内的数据写入DDR。

        缺点:MATLAB生成的数据复制到SDK内部时,SDK软件非常的卡顿,因为数据量太大了。所以小数据量的照片可以用这种办法,如果分辨率接近1920*1080的图片,想用这种方法,那么SDK软件应该会直接卡住动都动不了。 

1.1、实验一原理图

        如下图为实验1的原理图。

        这里的的ZYNQ一般是CPU0,我通过定义数组的方式来存储小数据量的图片。而这个数组它最终还是映射还是DDR3上面(只不过这是cpu0的私有ram,只能cpu0访问),其地址范围可以通过lscript.ld来修改。按道理来说如果数组真的很大,那么是会引起栈溢出的。

1.2、MATLAB图片转换代码

        下面这段代码主要是将彩色图片的三通道数据转化为24位的整型数据,其中最高八位为R通道数据,中间八位为G通道数据,低八位为B通道数据。格式为RGB888

        转换好的数据以txt文本的方式保存在MATLAB对应的脚本文件夹下,打开文本,复制数据到提前建立好的数组内部就可以了。

%********************************************************************%
% 程序说明:将三维彩色图片处理成RGB888的格式(R在高八位)
%********************************************************************%   
clc;
clear all;
rgbimage=imread('test.jpg/test.bmp');%读取rgb图像,支持多格式图片
[ROW,COL,D]=size(rgbimage);  %图片行,列,维度% RGB通道分离
R=rgbimage(:,:,1);           %提取图片中的红色分量
G=rgbimage(:,:,2);           %提取图片中的绿色分量
B=rgbimage(:,:,3);           %提取图片中的蓝色分量%存储图片数据(需要强制类型转换为32位,防止溢出)imgdata=uint32(zeros(1,ROW*COL));%定义一个初值为0的数组,用来存储转换后的图片数据%转化为RGB888格式
for r=1:ROWfor c=1:COLimgdata((r-1)*COL+c) = bitshift(uint32(R(r,c)),16) + bitshift(uint32(G(r,c)),8)+ uint32(B(r,c));%移位之前需要对R,G,B的数据类型进行转换,防止溢出end
end
%打开或生成txt文件,将格式转换完成的数据写入txt文件
fidc=fopen('picture.txt','w+');
%直接输出数组格式的数据{};
for i=1:ROW*COLif(i == 1)fprintf(fidc,'{ %d ',imgdata(i));elseif(i == ROW*COL)fprintf(fidc,',%d };',imgdata(i));  elsefprintf(fidc,',%d ',imgdata(i));%给了空格end
endfclose(fidc);

1.2、C代码

        图片数据存储在picture.h文件中,这里应该只用关闭Dcache就可以,关于缓存一致性问题,可参考这篇文章的第一部分内容《【ZYNQ入门】第五篇、AXI HP口读写数据原理-CSDN博客》。

        其它没有什么细节要注意了。

/** main.c**  Created on: 2023年12月30日*      Author: dpt*/#include "xparameters.h"
#include "xgpiops.h"
#include "xil_cache.h"//需要关闭cache
#include "sleep.h"
#include "xil_printf.h"
#include "picture.h"//pic data#define GPIO_DEV_ID XPAR_PS7_GPIO_0_DEVICE_ID
#define RST 54
//图像大小,MATLAB的ROW和COL相反
#define ROW 1000
#define COL 1000static XGpioPs GpioPs;
static XGpioPs_Config * GpioCnfPtr;int initGpio();
void wirte_color_band(u32 *srcAddr,u8 count);int main()
{u32 *srcAddr = 0x2000000;u8 count = 0;//disable cacheXil_DCacheDisable();//关闭dcache,直接往ddr写
//	Xil_ICacheDisable();initGpio();XGpioPs_WritePin(&GpioPs,RST,0x00); //RST SET 0XGpioPs_WritePin(&GpioPs,RST,0x01);//RST SET 1XGpioPs_WritePin(&GpioPs,RST,0x00); //RST SET 0while(1){wirte_color_band(srcAddr,count++);sleep(3);if(count > 2) count = 0;}return 0;
}//initial gpio func
int initGpio(){int status;GpioCnfPtr = XGpioPs_LookupConfig(GPIO_DEV_ID);status = XGpioPs_CfgInitialize(&GpioPs,GpioCnfPtr,GpioCnfPtr->BaseAddr);if(status != XST_SUCCESS){return	status;}XGpioPs_SetDirectionPin(&GpioPs,RST,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,RST,0x01);return	status;
}//往DDR里面写入一个彩条
void wirte_color_band(u32 *srcAddr,u8 count)
{int k=0;int row_str = 960 - (ROW>>1);int row_end = 960 + (ROW>>1);int col_str = 540 - (COL>>1);int col_end = 540 + (COL>>1);for(int j = 0;j<1080;j++){for(int i = 0;i<1920;i++){if(i>=row_str && i<row_end && j>=col_str && j<col_end){if(count == 0){*srcAddr = ikun1[k++];}else if(count == 1){*srcAddr = ikun2[k++];}else if(count == 2){*srcAddr = ikun3[k++];}}else{*srcAddr = 0xffffff;//white}srcAddr ++;}}
}

 1.3、vivado工程链接 

        关于实验1的完整vivao工程链接如下:实验1工程及参考文件

        下载需要积分没有积分的老铁留下在评论底下留下邮箱也可以🤪😁😉

2、实验二

2.1、实验二原理图

        相较于实验一,就多了SD卡模块。ZYNQ先去SD卡读取图片数据,然后再写入到DDR,再让AXI去DDR读取数据,再借助hdmi显示。

2.2、C代码

/** sd_card.c**  Created on: 2023年12月17日*      Author: dpt*/
#include "xparameters.h"
#include "xgpiops.h"
#include "xil_cache.h"//需要关闭cache
#include "sleep.h"
#include "xsdps.h"
#include "xil_printf.h"
#include "ff.h"
#include "sd_card.h"#define GPIO_DEV_ID XPAR_PS7_GPIO_0_DEVICE_ID
#define frame_buffer_addr  0x2000000         //frame buffer的起始地址#define RST 54static XGpioPs GpioPs;
static XGpioPs_Config * GpioCnfPtr;int initGpio();int main()
{u8 cnt = 0;Xil_DCacheDisable();	//disable cache
//	Xil_ICacheDisable();initGpio();init_sd_card();XGpioPs_WritePin(&GpioPs,RST,0x00); //CMOS_RST SET 0XGpioPs_WritePin(&GpioPs,RST,0x01);//CMOS_RST SET 1XGpioPs_WritePin(&GpioPs,RST,0x00); //CMOS_RST SET 0while(1){load_sd_bmp((u8 *)frame_buffer_addr,cnt++);//读取图片数据,并且写入到DDR当中if(cnt > 2) cnt = 0;sleep(1);}return 0;
}//initial gpio func
int initGpio(){int status;GpioCnfPtr = XGpioPs_LookupConfig(GPIO_DEV_ID);status = XGpioPs_CfgInitialize(&GpioPs,GpioCnfPtr,GpioCnfPtr->BaseAddr);if(status != XST_SUCCESS){return	status;}XGpioPs_SetDirectionPin(&GpioPs,RST,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,RST,0x01);return	status;
}

2.3、vivado工程链接 

         关于实验2的完整vivao工程链接如下:实验2的工程和参考文件

        下载需要积分和上面一样没有积分的老铁留下在评论底下留下邮箱即可😇😇😇      

第四部分、总结

        这两个实验其实差别不大,主要的核心还是HDMI发送端的结构AXI HP接口驱动。其他的都比较好理解。

        我的工程代码仅供参考,最后,希望我的笔记对你的调试有帮助!🤓🤓🤓

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

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

相关文章

Rosalind 039 Expected Number of Restriction Sites

这个问题结合了分子生物学中的限制性酶&#xff08;restriction enzymes&#xff09;的概念和概率统计学的应用。 生物背景&#xff1a; 限制性酶&#xff1a;细菌使用这些酶来切割病毒DNA的双链&#xff0c;从而使病毒失去功能。这些酶在病毒DNA上切割的位置被称为限制位点。…

适合 C++ 新手学习的开源项目——在 GitHub 学编程

作者&#xff1a;HelloGitHub-小鱼干 俗话说&#xff1a;万事开头难&#xff0c;学习编程也是一样。在 HelloGitHub 的群里&#xff0c;经常遇到有小伙伴询问编程语言如何入门方面的问题&#xff0c;如&#xff1a; 我要学习某一门编程语言&#xff0c;有什么开源项目可以推荐…

nginx下upstream模块详解

目录 一&#xff1a;介绍 二&#xff1a;特性介绍 一&#xff1a;介绍 Nginx的upstream模块用于定义后端服务器组&#xff0c;以及与这些服务器进行通信的方式。它是Nginx负载均衡功能的核心部分&#xff0c;允许将请求转发到多个后端服务器&#xff0c;并平衡负载。 在upst…

RA8900CE汽车用c总线接口实时时钟模块

汽车用c总线接口实时时钟模块内置调频32.768 kHz晶体单元和DTCXO&#xff0c;高稳定性和电源切换。 接口类型我 2C-Bus接口(400kHz)界面电压范围2.5V ~ 5.5V温度补偿电压范围2.0V至5.5V计时电压范围1.6V ~ 5.5V可选时钟输出(32.768 kHz, 1024 Hz, 1 Hz)各种功能齐全的日历、报…

如何配置Zabbix告警邮件通知并基于GPT提供解决方案?

一、概述 时间来到2023年末&#xff0c;距离Open AI发布GPT-3.5&#xff0c;首次向公众推出ChatGPT已经整整过去了一年。如今&#xff0c;以ChatGPT为代表的人工智能模型已然被应用众多领域&#xff0c;当然也包括IT运维。在IT运维中&#xff0c;通过对接运维监控平台&#xff…

windows机器上安装mysql

0、mysql下载地址 1、参考文章 2、把Data数据目录迁移到其他盘 2.0 首先停止mysql&#xff08;任务管理器-详细信息-随便找个进程右击进入转入服务&#xff0c;找到MySQL服务&#xff0c;点击停止&#xff09; 2.1 windows的 mysql默认的data目录在C:\ProgramData\MySQL\MySQ…

深度神经网络中的混合精度训练

Mixed-Precision Training of Deep Neural Networks | NVIDIA Technical Blog 目录 混合精度成功训练的技术 FP32 累加 损失缩放 loss scaling FP32 Master Copy of Weights 混合精度训练迭代过程 AMP混合精度训练介绍 FP16和FP32的区别 FP16的优势 FP16的问题 解决P…

多线程基础入门【Linux之旅】——上篇【线程控制,线程互斥,线程安全】

目录 前文 回望页表 一&#xff0c;什么是线程 二&#xff0c;使用 pthread_create &#xff08;线程创建&#xff09; 三&#xff0c;线程控制 1 &#xff0c;线程共享进程数据&#xff0c;但也拥有自己的一部分数据: 2&#xff0c; 线程 VS 进程优点 3&#xff0c;…

在前端利用Broadcast Channel实现浏览器跨 Tab 窗口通信的方法

Broadcast Channel 在前端&#xff0c;我们经常会用postMessage来实现页面间的通信&#xff0c;但这种方式更像是点对点的通信。对于一些需要广播&#xff08;让所有页面知道&#xff09;的消息&#xff0c;用postMessage不是非常自然。Broadcast Channel 就是用来弥补这个缺陷…

DVenom:一款功能强大的Shellcode加密封装和加载工具

关于DVenom DVenom是一款功能强大的Shellcode加密封装和加载工具&#xff0c;该工具专为红队研究人员设计&#xff0c;可以帮助红队成员通过对Shellcode执行加密封装和加载实现反病毒产品的安全检测绕过。 功能介绍 1、支持绕过某些热门反病毒产品&#xff1b; 2、提供了多种…

vue中的$nextTick的作用及使用场景

文章目录 一、$nextTick的作用二、特点和用途三、使用场景&#xff1a;1、在 Vue 组件内部使用&#xff1a;2、在普通 JavaScript 代码中使用&#xff1a; 三、注意事项 一、$nextTick的作用 $nextTick() 是 Vue 提供的一个异步方法&#xff0c;用于在 DOM 更新之后执行回调函…

【React系列】react-router

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识react-router 1.2. 前端路由原理 前端路由是如何做到URL和内容进行映射呢&#xff1f;监听URL的改变。 UR…

新视野英语课本复盘1

the triumpth of years of hard work 多年的辛勤付出的胜利 get by on very little sleep 靠很少的睡眠勉强维持生活或工作 pursue new passions 追求新的热爱之事 reap the benefits of this opportunity 收获这个机会带来的益处 you will not only emerge as a more broadly …

目标检测YOLO实战应用案例100讲-基于红外图像处理的无人机光伏组件故障检测(续)

目录 3.2 自适应温度阈值故障检测算法设计 3.3 基于拟合灰度曲线的故障检测方案设计

自动生成表结构screw

采用的组件 screw 操作流程&#xff1a; 1、新建springboot 项目 2、引入相关的依赖 <!-- screw核心 --><dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0.4</version><…

数据库知识汇总之NoSQL

目录 数据库常见分类关系型数据库NoSQL数据库NoSQL数据库5大类型NoSQL数据库在 大数据时代的优势 数据库常见分类 数据库可以根据不同的标准进行分类&#xff0c;以下是一些常见的数据库分类方式&#xff1a; 关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;这是最常…

SwiftUI之深入解析如何使用visualEffect视图修饰符

一、visualEffect 简介 在 WWDC 23 中&#xff0c;SwiftUI 引入了一个名为 visualEffect 的新视图修饰符&#xff0c;此修饰符允许通过访问特定视图的布局信息来附加一组可动画化的视觉效果。那么&#xff0c;如何在 SwiftUI 中使用新的 visualEffect 视图修饰符呢&#xff1f…

超简单|配图详细| 双系统Ubuntu22.04 系统磁盘扩容

文章目录 1. 打开磁盘工具2. 格式化空闲分区3. 挂载该分区4. 数据迁移与备份5. 卸载原分区6. 挂载新的/home分区7. 重启系统8. 删除原来的数据8.1 直接格式化分区8.2 没有单独的/home分区1. 查看设备名2. 重新挂载该分区3. 删除原始分区/home目录中的内容4. 卸载原分区5. 重启 …

关于无人机上层控制的PID算法的思考

一、前言 背景介绍&#xff1a;PID虽然出现了很多年&#xff0c;但是目前工业界还是把PID作为主流的控制算法&#xff08;尽管学术界有很多非常时尚的控制算法&#xff0c;包括鲁邦控制&#xff0c;神经网络控制等等&#xff09;&#xff0c;PID的算法在于其不需要对系统进行复…

使用 PHP-FFMpeg 操作视频/音频文件

做音频合成的时候找到的一个php操作ffmpeg 的类库。GitHub地址&#xff1a;https://github.com/PHP-FFMpeg/PHP-FFMpeg/。本文的例子大部分都是上面的 在使用之前请安装好 FFMpeg 。如何安装&#xff1f;请看 FFmpeg 安装教程。 使用composer快速安装 > composer require …