【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,一经查实,立即删除!

相关文章

适合 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;…

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

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

【React系列】react-router

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

自动生成表结构screw

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

超简单|配图详细| 双系统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 …

【Spring实战】20 Spring Data REST+JPA构建基础的RESTful API

文章目录 1. 基础概念1&#xff09;Spring Data REST2&#xff09;JPA&#xff08;Java Persistence API&#xff09; 2. 添加依赖3. 创建JPA实体4. 创建JPA Repository5. 启用Spring Data REST6. 启动服务7. 测试8. 总结 Spring Data REST 是 Spring Framework 生态系统中的一…

加密算法和身份认证

前瞻概念 在了解加密和解密的过程前&#xff0c;我们先了解一些基础概念 明文&#xff1a;加密前的消息叫 “明文” &#xff08;plain text&#xff09;密文: 加密后的文本叫 “密文” (cipher text)密钥: 只有掌握特殊“钥匙”的人&#xff0c;才能对加密的文本进行解密,这里…

【深度学习:(Contrastive Learning) 对比学习】深入浅出讲解对比学习

对比学习允许模型从未标记的数据中提取有意义的表示。通过利用相似性和不相似性&#xff0c;对比学习使模型能够在潜在空间中将相似的实例紧密地映射在一起&#xff0c;同时将那些不同的实例分开。这种方法已被证明在计算机视觉、自然语言处理 &#xff08;NLP&#xff09; 和强…

STM32和ESP8266的WiFi模块控制与数据传输

基于STM32和ESP8266 WiFi模块的控制与数据传输是一种常见的嵌入式系统应用。在这种应用中&#xff0c;STM32作为主控制器负责控制和与外部传感器交互&#xff0c;而ESP8266 WiFi模块则用于实现无线通信和数据传输。本文将介绍如何在STM32上控制ESP8266模块&#xff0c;建立WiFi…

3D 纹理的综合指南

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…

【Redux】自己动手实现redux和react-redux

1. React提供context的作用 在class组件的世界里&#xff0c;如果后代组件共享某些状态&#xff0c;比如主题色、语言键&#xff0c;则需要将这些状态提升到根组件&#xff0c;以props的方式从根组件向后代组件一层一层传递&#xff0c;这样则需要在每层写props.someData&#…

Java Arrays.copyOfRange的用法

Arrays.copyOfRange的使用方法&#xff1a; 将一个数组拷贝至另一个数组中 参数&#xff1a; original&#xff1a;第一个参数为要拷贝的数组对象 from&#xff1a;第二个参数为拷贝的开始位置&#xff08;包含&#xff09; to&#xff1a;第三个参数为拷贝的结束位置&#x…