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

news2024/11/26 12:29:10

目录

第一部分、实验说明

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:ROW
    for c=1:COL
        imgdata((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*COL
    if(i == 1)
        fprintf(fidc,'{ %d ',imgdata(i));
    elseif(i == ROW*COL)
        fprintf(fidc,',%d };',imgdata(i));  
    else
        fprintf(fidc,',%d ',imgdata(i));%给了空格
    end
end

fclose(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 1000

static 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 cache
	Xil_DCacheDisable();//关闭dcache,直接往ddr写
//	Xil_ICacheDisable();
	initGpio();

	XGpioPs_WritePin(&GpioPs,RST,0x00); //RST SET 0
	XGpioPs_WritePin(&GpioPs,RST,0x01);//RST SET 1
	XGpioPs_WritePin(&GpioPs,RST,0x00); //RST SET 0

	while(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 54
 
static 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 0
	XGpioPs_WritePin(&GpioPs,RST,0x01);//CMOS_RST SET 1
	XGpioPs_WritePin(&GpioPs,RST,0x00); //CMOS_RST SET 0
	while(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.coloradmin.cn/o/1357571.html

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

相关文章

了解一下InternLM1

InternLM 是在过万亿 token 数据上训练的多语千亿参数基座模型。通过多阶段的渐进式训练&#xff0c;InternLM 基座模型具有较高的知识水平&#xff0c;在中英文阅读理解、推理任务等需要较强思维能力的场景下性能优秀&#xff0c;在多种面向人类设计的综合性考试中表现突出。在…

flutter项目用vscode打包apk包,完美运行到手机上

1.创建密钥库 执行以下命令: keytool -genkey -v -keystore F:/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天) 2.填写密钥内容 执行以上命令后会提示一次输入密钥库密码、确认…

JVS规则引擎和智能BI(自助式数据分析)1.3新增功能说明

规则引擎更新功能 新增: 1、数据源新增Excel数据源&#xff1b; Excel数据源功能允许用户将Excel文件作为数据源导入&#xff0c;并进行数据清洗、转换和处理&#xff0c;以实现数据的集成、可视化和深度分析&#xff0c;为决策提供强大支持&#xff0c;同时保持良好的交互性…

TTPLA:一种用于输电杆塔和输电线路检测与分割的航空影像数据集

从航空图像中准确检测和分割输电塔&#xff08;TTs&#xff09;和电力线&#xff08;PLs&#xff09;对于保护电网安全和低空无人机安全起着关键作用。同时&#xff0c;TTs和PLs的航空图像对从事对象检测和分割工作的计算机视觉研究人员提出了许多新挑战——电力线长而细&#…

USB 转 TTL线直接读取DS18B20

简介 使用USB转TTL线直接读取DS18B20 温度。 电路图 绘制图 实物图 软件 Download 1-Wire/iButton Drivers for Windows 操作 所有的线路连接好之后将 USB 转 TTL线接到PC上; 安装软件 Download 1-Wire/iButton Drivers for Windows 并打开 软件打开之后先选择串口后 …

VitePress搭建Vite官方中文文档首页

✨专栏介绍 在当今数字化时代&#xff0c;Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序&#xff0c;就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术&#xff0c;以及各种框架、库和工具…

记一次使用mpvue开发微信小程序动画播放播放完成再播放下一个动画,实现动画队列的实战操作

微信小程序wxss支持Css的keyframes动画&#xff0c;我们想通过事件监听&#xff0c;在动画开始、动画播放阶段、动画播放结束的时候进行下一步动作。如下图&#xff0c;有一个从右飘入&#xff0c;然后从左侧出去的动画&#xff0c;我们希望的是&#xff0c;前一个出去后&#…

pytorch07:损失函数与优化器

目录 一、损失函数是什么二、常见的损失函数2.1 nn.CrossEntropyLoss交叉熵损失函数2.1.1 交叉熵的概念2.2.2 交叉熵代码实现2.2.3 加权重损失 2.2 nn.NLLLoss2.2.1 代码实现 2.3 nn.BCELoss2.3.1 代码实现 2.4 nn.BCEWithLogitsLoss2.4.1 代码实现 三、优化器Optimizer3.1 什么…

GPT/GPT4科研应用与AI绘图技术及论文高效写作(建议收藏)

详情点击链接&#xff1a;GPT/GPT4科研实践应用与AI绘图技术及论文高效写作 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Clau…

轻量检测模型NanoDet解析

官方解读&#xff1a;YOLO之外的另一选择&#xff0c;手机端97FPS的Anchor-Free目标检测模型NanoDet现已开源~ - 知乎 official implementation&#xff1a; GitHub - RangiLyu/nanodet: NanoDet-Plus⚡Super fast and lightweight anchor-free object detection model. &…

[LitCTF 2023]这是什么?SQL !注一下 !

[LitCTF 2023]这是什么&#xff1f;SQL &#xff01;注一下 &#xff01; wp 题目描述&#xff1a;为了安全起见多带了几个套罢了o(▽)q 页面内容&#xff08;往下滑&#xff09;&#xff1a; SQL 语句已给出&#xff0c;无非是更换了闭合方式。 先输个 1 试试&#xff1a; …

<HarmonyOS第一课>1~10课后习题汇总

HarmonyOS第一课 &#xff1c;HarmonyOS主题课&#xff1e;1~3课后习题汇总 1运行Hello World 判断题 main_pages.json存放页面page路径配置信息。&#xff08;正确&#xff09;DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。&#xff08;正确&#xff09; 单选题…

MS4553S用于开漏模式和推拉模式的 2bit 双向电平转换器,可替代TXS0102/PCA9306等

产品简述 MS4553S 是一款双向电平转换器&#xff0c;可以用作混合电压的数字信 号系统中。其使用两个独立构架的电源供电&#xff0c; A 端供电电压范围是 1.65V 到 5.5V &#xff0c; B 端供电电压范围是 2.3V 到 5.5V 。可用在电压为 1.8V 、 2.5V 、 3.3V 和 5V 的信号转…

vue3 vuedraggable draggable element must have an item slot

vue3vite 看官网使用这种<template #item“{ element }”> <draggablev-model"myArray"start"onStart"end"onEnd":sort"false"item-key"id"draggable".item"handle".mover" ><template…

3-sql注入之Mysql手工注入

文章目录 sql注入之Mysql手工注入sqli-labs数字型注入注入流程注入语句 sql注入之Mysql手工注入 练习靶场为sqli-labs第二关数字型注入 sqli-labs数字型注入 在url中输入id值&#xff0c;执行查询sql语句。即可得到对应数据 less-2源码分析&#xff1a; 浏览器 进行数据提交…

python旅游大数据分析可视化大屏 游客分析+商家分析+舆情分析 计算机毕业设计(附源码)Flask框架✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

关于目标检测任务中,XML(voc格式)标注文件的可视化

1. 前言 最近在弄关于目标检测的任务&#xff0c;因为检测的图片和标签是分开的&#xff0c;可视化效果不明显&#xff0c;也不知道随便下载的数据集&#xff0c;标注信息对不对。网上看了好多代码&#xff0c;代码风格和本人平时不同&#xff0c;看起来麻烦&#xff0c;也不知…

接了一条路由器视频广告

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 2023年7月&#xff0c;松松团队荣幸的承接了“某口袋路由器”的短视频广告。 我们向客户索取了了几个卖点&#xff1a; 1.家用美观不用走线(无线小巧美观) 外出便携(出差、户外直播、露营等&#xff0c;只要充满电…

Spring中的工厂类

目录 1.ApplicationContext 4.2.BeanFactory 1.ApplicationContext ApplicationContext的实现类&#xff0c;如下图&#xff1a; ClassPathXmlApplicationContext&#xff1a;加载类路径下 Spring 的配置文件 FileSystemXmlApplicationContext&#xff1a;加载本地磁盘下 S…

GO语言笔记1-变量与基本数据类型

变量使用步骤 声明赋值使用 package main import "fmt" func main(){var age int //声明一个 int类型的变量叫ageage 18 //给变量用 赋值fmt.Println(age) //使用变量 输出变量的值 } 编译运行输出变量值 变量的四种使用方式 package main import "fmt&q…