zynq板zedboard+SDK设计(一)读取SD中bmp图片存入DDR

zynq板zedboard+vitis设计 (一) hello world实验 基于zedboard开发板与vitis结合的入门实验 阅读详情
AI摘要

本文详细介绍了如何在Zedboard开发板上使用Vivado2019.1SDK从SD卡读取BMP图像,并将其存储到DDR内存中。文章涵盖了BMP图像的位深概念,文件结构,以及利用FATFS进行文件操作的方法。通过读取文件头和信息头来解析图像尺寸,并将像素数据写入DDR。

0.前言

本文讲的是如何读取SD卡中的BMP图像并存入DDR中

使用的开发板是zedboard

vivado使用的是2019.1配套SDK

1.bmp图像

讲程序之前先简单说一下bmp图像

1.1bmp位深

BMP是位图(bitmap),可以分为1、4、8、16、24及32位图像等。

1位深的bmp图只有2^{1}种颜色,就是纯粹的黑白图片。图中1个像素点占1个比特位,即1个字节可以描述8个像素点。

8位深的bmp图有2^{8}种颜色,通常是灰度图,即由不同程度的黑白色构成的图像,也可以是伪彩色图,即由较少色彩构成的图像。该图中1个像素点占1个字节,即1个字节可以描述1个像素点。

24位深的bmp图有2^{24}种颜色,称为真彩色图。24个比特位以8位一组分三个通道,即RGB通道。该图中1个像素点占3个字节,即3个字节可以描述1个像素点。

1.2bmp图像构成

BMP文件由以下四部分组成:

  • 位图文件头:用于描述整个bmp文件的情况,具体包括BMP文件的类型、文件大小和位图起始位置等信息。
  • 位图信息头:含有 BMP 图像的宽、高、压缩方法,以及定义颜色等信息。
  • 颜色表:用于说明位图中的颜色(24位深的bmp图像没有颜色表)。
  • 像素阵列:记录位图的每一个像素点(记录顺序是在扫描行内是从左到右,扫描行之间是从下到上)。

 在属性的详细信息内可以看见图像的宽、高及位深信息

这里用notepad++打开该图

 画红线的部分是文件头,绿色部分是信息头,紫色部分是颜色表,橙色部分一直到最后都是像素矩阵。

其中文件头每一位的具体含义如下表

 其中信息头每一位的具体含义如下表

 举个例子

 图中黑圈内的两个四字节数就是图像的宽和高,因为这里是小端存储的,所以宽和高分别是00000114和00000114,换成10进制就是276,和从图像属性内看到的一致。

2.bd部分

本文设计的SD卡读取及对DDR的写入只需要zynq本身就可以完成,因此BlockDesign中添加一个zynq核并打开SD以及其他基本配置即可。

3.SDK部分

3.1读取SD卡前置设置

 如图所示,读取SD卡前需要先右击bsp文件选择board support package setting,然后勾选xilffs,然后选择下面的xilffs页面,将use_lfn后面的value中的0改为1。xilffs是打开SD卡需要使用的工具,use_lfn是允许读取长整型的文件名

3.2代码

完整代码如下

#include "xparameters.h"
#include "xil_printf.h"
#include "ff.h"
#include "xdevcfg.h"
#include "stdio.h"
#include "xil_io.h"
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"

#define FILE_NAME "cat.bmp"                //定义文件名
static FATFS fatfs;                         //文件系统

unsigned int const DDR_buffer_addr = 0x01000000;//DDR地址

//初始化SD卡
u32 Init()
{
    FRESULT result;
    TCHAR *Path = "0:/";
    result =f_mount(&fatfs,Path, 0);    
        if(result){
               printf("error : f_mount returned error \r\n");

               return XST_FAILURE;
                  }

    return XST_SUCCESS ;
}

//SD卡写函数
u32 Write(char *FileName,u32 src_addr,u32 byte_len,u32 start_addr)
{
    FIL file;       //文件对象
    FRESULT result;
    UINT BytesWr;   //f_write函数返回已写入的字节数

    result = f_open(&file,FileName,FA_CREATE_ALWAYS | FA_WRITE);//打开一个文件,如果不存在,则创建一个文件
    if(result)
    {
        printf("error : f_open returned error \r\n");
        return XST_FAILURE;
    }

    result = f_lseek(&file, start_addr);//移动打开的文件对象的文件读/写指针,相当于将鼠标放在文件的某个开始位置。
    if(result)
    {
        printf("error : f_lseek returned error \r\n");
        return XST_FAILURE;
    }

    result = f_write(&file,(void*) src_addr,byte_len,&BytesWr);//写文件内容
    if(result)
    {
        printf("error : f_write returned error \r\n");
        return XST_FAILURE;
    }

    result = f_close(&file);    //关闭一个文件
    if(result){
        printf("error : f_close returned error \r\n");
        return XST_FAILURE;
    }

    return XST_SUCCESS;
}

//SD卡读函数
u32 Read(char *FileName,u32 DestinationAddress,u32 ByteLength,u32 start_addr)
{
    FIL file;    //文件对象
    FRESULT result;
    UINT BytesRd;    //f_read函数返回已读出的字节数

    result = f_open(&file,FileName,FA_READ);    //打开一个只读的文件
    if(result)
    {
        printf("error : f_open returned error \r\n");
        return XST_FAILURE;
    }

    result = f_lseek(&file,start_addr);    //相当于将鼠标放在文件的某个开始位置。
    if(result)
    {
        printf("error : f_lseek returned error \r\n");
        return XST_FAILURE;
    }

    result = f_read(&file, (void*)DestinationAddress,ByteLength,&BytesRd);//读文件内容
    if(result)
    {
        printf("error : f_read returned error \r\n");
        return XST_FAILURE;
    }

    result = f_close(&file);//关闭一个文件
    if(result)
    {
        printf("error : f_close returned error \r\n");
        return XST_FAILURE;
    }
    return XST_SUCCESS;
}

//main函数
int main()
{
    int Status,i,j,j_1,j_2,k,k_1,line_cnt,line_last,signal_cnt;
    u8 bmp_head[54];
    UINT *bmp_width,*bmp_height,*bmp_size,*offbit;

    Init();

    //读取bmp图像头文件
     Status=Read(FILE_NAME, bmp_head, 54, 0);
     if (Status==XST_FAILURE)
     {
         return XST_FAILURE;
     }
     //读取信息头,并显示图像高、宽、大小以及像素数据开始位等信息
     xil_printf("cat.bmp head: \r");
     for(i=0;i<54;i++)
         xil_printf(" %x",bmp_head[i]);

     bmp_width = (UINT *)(bmp_head + 0x12);
     bmp_height = (UINT *)(bmp_head + 0x16);
     bmp_size = (UINT *)(bmp_head + 0x22);
     offbit = (UINT *)(bmp_head + 0x0A);
     xil_printf("\n width = %d, height = %d, size = %d, offbit = %d bytes \r",
             *bmp_width,*bmp_height,*bmp_size,*offbit);

//每次一行,将图像中除了信息头以及颜料表之外的像素数据存入DDR
     for(i=0;i<=*bmp_height-1;i++){
         Read(FILE_NAME,DDR_buffer_addr+i*(*bmp_width),(*bmp_width),(*offbit)+i*(*bmp_width));
     }

  }

terminal内打印出文件的文件头和信息头数据,和前面的对比没有问题

 debug模式下,可以看见图像的数据被写入了ddr内

 4.结语

本文都是比较基础的应用,如有错误,欢迎指正。

Zedboard开发板的linux搭建 zedboard开发板的linux环境搭建 阅读详情

相关推荐

zynq板zedboard+SDK设计(二)HDMI工程解析

bd部分的内容就是这些,整体来看就是先通过vdma从ddr内读取视频数据,然后将rgb格式转换成YCrCb格式,再结合vide timing controller产生的时序将数据流转化成视频输出格式的数据,最后通过HDMI输出IP输出数据。GitHub上原版的工程没有SDK部分需要自己添加,这里放上本次使用的工程以供不便去GitHub上下载的读者使用。【免费】zedboard开发板读取sd卡内图像通过HDMI显示-嵌入式文档类资源-CSDN文库t=N7T8。

EfunStudy的博客 2810

zedboard资料

以下参考资料整理,是我从网络上找的,非原创,感恩yuan原作者! 第一阶段:找资料,熟悉ZYNQ (1)了解Zedboard的核心ZYNQ的介绍,包括PS、PL、APU基本概念,可以参考手册 ug804_zynq-7000_plat_sum和 maxim.eefocus.com/bbs/article_1237_380029.html (2)在ZedBoard.org网站上找到Zedboard板的...

qq_35608277的博客 4170

【零 zedboard】从SD卡中启动

测试zedboard记录 文章目录一、准备工作二、使用步骤## 1.引入库2.读入数据总结 一、准备工作 连接好电源、串口线、插入sd卡。开始时的接线。在电脑中查看对应的串口号,我的时com8 ![请添加图片描述](https://img-blog.csdnimg.cn/da947c44b6d049f6b131560924b80d85.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAeHpzNTI

xzs520xzs的博客 1782

ZYNQ:zedboard开发板的 VGA彩条显示实验

qq_36426195的博客 1113

FPGA + 图像处理(一)三种向zynq中DDR内导入图像数据的方法

介绍了三种比较基础的将数据存入ddr的方法,也不一定是图像数据,其他的数据也都可以按照这些方法导入ddr内,对于图像数据,通过sdk直接存入ddr内和通过sd卡读取还是比较便捷的,通过将数据初始化到rom内的方法限制较大,在导入图像数据后,因为三种方法的数据格式不同,要注意数据的使用方法。

EfunStudy的博客 5068

ZYNQ系列之-----SD卡读写文件

1、前提 sd卡挂载在ps测,并且使用的ZYNQ系统 2、设备与软件 软件: vivado 2021.2 及其配套的软件。 硬件: ZCU106开发板。 3、PL测SD的设置 4、VITIS软件设置 在“Board Support Package Settings”中设置“xilffs” 这里的"use_lfn"选项要设置为1之后,就可以操作sd卡中的名字比较长的文件。 5、ps测代码: 初始化代码: u32 sd_i...

HHH的博客 5328

ZedBoard教程PL篇(5):模式设置

开发板环境:vivado2017.4开发板:Zedboard 芯片型号:xc7z020clg484-1这篇主要记录一下zedboard开发板的模式设置从上面这个图可以看出,开发板有三种模式JTAG,QSPI,SD卡,从图可以看出三种模式基本取决于MIO4和MIO5这两个管脚的设置开发板跳线帽原理图JTAG启动模式QSPI启动模式SD卡启动模式 以上是zedboard开发板的三种启动方式的设置...............

weiwei_fpga的博客 1565

ZedBoard开发:GPIO操作与BOOT.BIN引导文件初探

ZedBoard开发板是一种性能强大的开发平台,它由Xilinx公司出品,使用了Zynq-7000系列的SoC芯片,该芯片集成了ARM处理器和FPGA,使开发者能够利用灵活的硬件配置以及丰富的软件生态系统来构建复杂的嵌入式系统。本章将详细介绍ZedBoard开发板的硬件组成以及在各个领域中的应用场景和开发优势。通用输入输出(General Purpose Input/Output,GPIO)是一种在微控制器、微处理器或其他电子设备上常见的接口。

weixin_42509888的博客 858

赛灵思运行linux,玩转赛灵思Zedboard开发板(6):如何在Zedboard上运行linux下的应用程序?...

描述电子发烧友网讯:ZedBoard开发板上的Zynq是一个ARM PS(processing system, 双核A9 + 存储管理 + 外设)+ PL(programable Logic) 结构,如果不使用PL,zynq的开发和普通的ARM 开发一样。不同的是ARM PS是可配置,因而硬件信息是不固定的。这也是zynq灵活性的一个表现。电子发烧友网编辑现为读者整合《玩转赛灵思Zedboard开...

weixin_42121412的博客 830

Zedboard开发板VxWorks系统构建实战项目

Zedboard是一款基于Xilinx Zynq-7000系列SoC的高性能嵌入式开发平台,广泛应用于工业控制、图像处理、通信系统及科研教学等领域。该开发板集成了双核ARM Cortex-A9处理器与Artix-7 FPGA架构,形成处理系统(PS)与可编程逻辑(PL)深度融合的异构计算平台,具备高性能、低功耗与高度灵活性的特点。AXI(Advanced eXtensible Interface)是ARM公司定义的高性能、高带宽、低延迟总线协议,广泛应用于Zynq平台内部通信。

weixin_42510243的博客 644

Seedance2.5本地部署:从环境配置到批量生图的工程实践指南

最近在几个技术社群里,看到不少人在讨论 AI 生图和视频工具。有人抱怨在线服务要么贵、要么慢、要么生成内容受限;也有人尝试了各种“免费”方案,结果不是功能残缺就是暗藏收费陷阱。就在大家觉得“又好又免费”的本地部署方案门槛太高时,Seedance2.5 突然冒了出来,而且口号相当直接:本地部署、完全免费、不联网、功能对标甚至超越一些付费产品。 但这类宣传我们见多了,真正的问题是:它到底能不能在普通开发者的机器上跑起来?生成质量是否真的可用?长期使用会不会遇到模型崩溃、依赖冲突或者资源爆炸?更重要的是,对于一个

weixin_27419879的博客 1123

ZedBoard教程PS篇(4):EMIO的使用

在zynq中分为MIO和EMIO,MIO是arm端的管脚,而EMIO是将arm端的管脚使用fpga管脚来进行扩展,本章主要使用EMIO来点亮LED灯。再次点击New-->applicationProject,新建一个hello_world工程。EMIO0~EMIO63一共64个管脚,这里只控制FPGA侧的LED一共八个,硬件连接如下图所示。点击New-->applicationProject新建fsbl。新建hello_world工程,点击Next。新建工程后,调用zynq核。......

weiwei_fpga的博客 1536

Comsol实战:铌酸锂x切与z切参数设置全攻略(附电场强度归一化技巧)

本文详细介绍了在Comsol Multiphysics中设置铌酸锂x切与z切晶体参数的全流程,包括晶体取向定义、电光系数配置及关键光学参数计算。重点讲解了电场强度归一化这一实用技巧,帮助用户提升仿真分析效率,为设计电光调制器等集成光子器件提供精准的仿真基础。

year5的博客 582

ZEDBOARD开发板教程:移植ZED+AD9361到SDK与单音回环测试

将SD卡插入开发板,并将开发板的启动模式设置为SD卡启动,插入电源和串口。如下图所示,是我们将ZED+AD9361移植到SDK中的项目,可以在Windows或Linux环境下使用SDK直接修改编译。从vivado设计图中可以看出,我们的ZED开发板使用ADI官方的驱动程无需任何修改,与官方全兼容直接使用即可。我们可以在此基础上添加单音回环程序,编译运行,运行结果如下图所示。本例程演示使用ZED开发板加AD9361射频子板,运行ADI官方例程HDL加NO-OS。ZED+AD9361移植到SD中的项目。

mcupro的专栏 1302

实战指南 | IC模拟版图设计从零到精通,手把手带你掌握EDA工具与GDSII输出

本文提供了一份从零开始的IC模拟版图设计实战指南。详细介绍了如何搭建Linux环境、安装Cadence Virtuoso等EDA工具,并深入解析了PDK设计规则。通过手把手绘制CMOS反相器版图的实例,系统讲解了版图绘制、DRC/LVS验证、寄生参数提取、匹配设计以及ESD防护等核心技能,最终指导如何正确生成交付芯片制造厂的标准GDSII文件,帮助读者掌握完整的模拟版图设计流程。

weixin_29214691的博客 389

【分子指纹】化学分子指纹的概念和应用(非常重要)

分子指纹(Molecular fingerprints)可以低计算成本的方式表示大规模化学数据集中化合物的化学(结构、物理化学等)性质。它们在将化学数据集中的分子转换为适合于计算方法的一致输入格式(bit向量或数值)方面发挥着重要作用。在这篇综述中,

DJJ5210的博客 1万+

zynq板zedboard+SDK设计(四)结合自建IP核对axi接口文件进行详解

本文将通过建立一个简易的led灯的IP核,对其中axi相关接口的文件以及每个步骤进行详细分析,以实现从知道怎么做到知道为什么的转变IP核的建立工程参照了正点原子实验需要对AXI总线有一些基本的了解,可以看一看本人主页的AXI学习记录。

EfunStudy的博客 900

从零到一:ASTER L2数据获取的实战避坑指南

本文提供了一份详细的ASTER L2数据获取实战指南,涵盖账号注册、环境配置、数据检索、下载故障排除及后处理等关键步骤。特别针对NASA EarthData平台的隐形门槛和常见陷阱,给出了实用解决方案,帮助科研新手高效获取地表温度数据,适用于环境监测和城市热岛效应分析等领域。

weixin_29061425的博客 515

FPGA:Zedboard开发板之点灯(PL)

开发环境为Vivado 2019.2。 1新建工程 打开Vivado,选择Create Project新建一个工程 下面的界面直接next 设置工程名及路径 工程类型选为RTL工程,因为在新建工程时不指定源文件,所以勾选下面Do not 那个选项,源文件等到工程建立完毕后再指定。 这里配置板卡的信息,可以在下面进行每一项的手动配置,由于我们采用的是zedboard开发板可在boards里面快速配置,不需要一个个参数手动指定,所以这里选boards。如果你的不是zedboard开发板,可以去board

qq_40456669的博客 1916

【RT-DETR涨点改进】全网独家创新,卷积细节涨点改进篇 | TCSVT 2025 | 引入DGBM差分专家引导双向调制模块,利用双向仿射调制实现特征分布对齐,含多种创新改进,助力小目标检测高效涨点

本文提出DGBM差分专家引导双向调制模块,用于改进RT-DETR目标检测网络。该模块通过差分建模突出不同层级特征的独特信息,利用双向调制实现特征分布对齐,增强局部细节与全局语义的协同表达。DGBM包含差分专家机制、物理反演建模和双向仿射调制三个关键部分,能有效解决CNN与Transformer特征融合冲突问题。实验表明,该方法可提升复杂场景下的检测精度,降低误检漏检率,且模块具有可插拔、易集成的特点。文章详细介绍了模块结构、原理、优势及具体实现代码,并提供了四种RT-DETR改进方案的yaml配置文件。

Ai缝合怪、助力小伙伴高效发论文 440

【Unity】【Pico】【VR开发】为何PICO打包后真机运行闪退

由于并没有开版权验证,而且闪退后也并没有弹框说版权问题,所以还是怀疑环境有什么地方不对。设置步骤,项目配置都没问题,Build也成功,Unity版本是符合要求的2022LTS版本,但是一在真机上运行就闪退。

每日出拳老爷子的博客 3174

ZC702与ZedBoard开发板的比较

ZC702与ZedBoard开发板基本上是同期推出的XILINX ZYNQ开发板,前者官方售价为895美元,后者官方售价为395美元,虽然二者价格差别比较大,但在资源上却有很多的相似性,下面就两者做个简单比较,以期读者对这两块开发板有个清楚的认识,如有遗漏和不当之处还请大家补充指正。 1.SoC主器件型号都是Zynq-7000XC7Z020-1CLG484(CES)

yonwnn163的博客 5971

【MATLAB代码】基于水声通信(ACOMMS)下的到达时间差(TDOA)定位的AUV自主导航例程,附完整代码

水下AUV导航系统仿真研究 本研究基于到达时间差(TDOA)技术实现了水下自主航行器(AUV)的三维导航仿真系统。系统采用四个声学信标作为定位基准,通过TDOA测量数据迭代求解AUV位置。仿真结果表明: 导航性能:系统能够有效跟踪AUV从起点(30,30,-20)到目标点(70,70,-20)的航行轨迹,定位误差保持在合理范围内。 误差分析:定位误差变化曲线显示系统具有稳定的定位精度,平均误差为0.5米左右。 技术特点:采用两步最小二乘迭代算法求解非线性TDOA方程,提高了定位精度和计算效率。 该仿真系统为

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 320

Zynq PS无法读取SD卡(TF卡)异常分析及如何读写SD卡

Zynq PS无法读取SD卡(TF卡)异常分析及如何读写SD卡

王小波门下走狗 4630

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Zedboard开发板使用

烧录Boot.bin后,启动后不停报错,无法进入u-boot,重新焊接板子DDR3颗粒后问题解决。官方自带的固件,可以测试板载所有外设,其中HDMI兼容性不好,分辨率太高的屏幕无法点亮,

黑客三遍猪 684

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ZedBoard教程PS篇(2):debug调试和qspi下载以及启动

开发板环境:vivado2017.4开发板:Zedboard 芯片型号:xc7z020clg484-1本章节主要使用上个hello_world工程,在SDK中演示debug在线调试和qspi下载以及启动打开SDK 开发板打到jtag启动模式,并且连接USB-JTAG和串口UART,这里演示debug在线调试 右击hello_world-->Debug As -->Debug Configurations 双击GDB双击GDB后会自动添加hello_world Debug 在下拉对话框中选择Reset Ent

weiwei_fpga的博客 1567

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: zynq板zedboard+vitis设计(三)状态机及中断,PL与PS部分的状态交互
下一篇: VHDL语法入门 (一) VHDL结构
EfunStudy
博客等级 码龄5年 184粉丝 31原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值