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

2024-03-13 1171阅读

温馨提示:这篇文章已超过419天没有更新,请注意相关的内容是否还可用!

本文主要讲解三种本人已知的将图像数据传入ddr的方法(一些非图像数据也可以用),方便后续通过fpga对图像进行处理,在一些导入方法中,需要将图像转换成特定的格式,因此,需要用到matlab来实现图像的格式转换

0.图像数据

这里先展示一下用到的图像,是一个ai随机绘制的图像

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

1.通过SDK存入ddr

通过SDK将图像存入ddr需要将图像转为.bin格式,这种方法不但可以将外部数据导入ddr内,在对ddr内的数据处理完成后还可以导出到外部bin文件,便于后续对比观察,推荐这种方法

1.1格式转换

将图像转换成bin格式的matlab代码如下

clc;
clear all;
Image=imread('ai.jpg');
R=Image(:,:,1);
G=Image(:,:,2);
B=Image(:,:,3);
[row, col] = size(R);
fid = fopen('ai.bin','wb');
for i=1:row
    for j=1:col
      fwrite(fid,B(i,j));
      fwrite(fid,G(i,j));
      fwrite(fid,R(i,j));
    end
end
fclose(fid);

 1.2vivado工程

根据自己需求创建好vivado工程后,进入sdk

在Xilinx页面下的dump/restore data file选项内可以ddr内的数据导出或导入为bin文件

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

打开后先选择processor

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

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

 注意选择好文件后下方的dump memory和restore memory分别是导入和导出ddr数据,我们要导入数据,选择restore memory

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

 再下方设置开始存入数据的地址以及数据长度

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

点击确认后数据便成功存入ddr内

bin文件内的数据(只展示部分数据)

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

存入ddr内的数据 (只展示部分数据)

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

 这里注意如果数据存入后顺序不对,可能是大端小端显示方式的问题,可以通过memory页面内的new renderings选择不同的数据显示形式

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

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

2.通过SD卡存入ddr

先将图像导入SD卡,然后通过对SD卡的读取存入ddr内,详细操作请看本人主页内文章zynq板zedboard+SDK设计(一)读取SD中bmp图片存入DDR_EfunStudy的博客-CSDN博客

3.建立rom转存ddr

通过rom将图像存入ddr内需要将图像转为.coe格式,这种方法存入图像对内存要求较高,通常只能存入很小的图像,因此不太推荐这个办法。

3.1格式转换

将bmp图像转为coe格式的matlab相关代码如下

clc;
clear all ;
pic = imread('ai.bmp') ;
pic_size = size(pic);
h = pic_size(1);
w = pic_size(2);
R =pic ( : ,: ,1) ;
G =pic ( : ,: ,2) ;
B =pic ( : ,: ,3) ;
coeR = zeros(1,w*h) ;
coeG = zeros(1,w*h) ;
coeB = zeros(1,w*h) ;
image =  uint8(zeros(h, w, 3));
for i = 1:h
	for j = 1: w 
        coeR((i-1)*w+j) = bitand(R(i,j),255);
        coeG((i-1)*w+j) = bitand(G(i,j),255);
        coeB((i-1)*w+j) = bitand(B(i,j),255);     
    end
end
out = fopen('ai.coe','w+');
fprintf(out,'memory_initialization_radix=16;\nmemory_initialization_vector=\n');
for k = 1:w*h
      fprintf(out,'%02x%02x%02x,\n',coeR(k),coeG(k),coeB(k));
end
 
fclose(out);

3.2vivado工程

新建工程后新建block design

添加block memory generator核

首先将block memory设置成单口rom,控制模式可以根据自己需要选择

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

在other options页面内勾选load init file选项后就可以根据路径选择对应的coe文件FPGA + 图像处理(一)三种向zynq中DDR内导入图像数据的方法

点击OK后将建立好了一个包含图像数据的rom,我们只需要将数据读到ddr内就可以了

添加zynq模块和bram controller

自动连线即可,最终结果如下FPGA + 图像处理(一)三种向zynq中DDR内导入图像数据的方法

rom的地址如下

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

生成比特流并导出platform后打开sdk

sdk部分代码如下,只是很简单的数据搬运代码,将rom地址下的数据搬运到ddr内

#include 
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"
#include "xparameters.h"
int main()
{
	u32 i,data,ddr_add,rom_add;
	u32 ddr_base_add = 0x10000000;
	u32 rom_base_add = 0x40000000;
	for(i = 0;i  

通过debug内的内存检测我们可以看到,rom内的数据成功搬运到ddr内

rom内数据,从0x40000000地址开始(只展示部分数据)

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

 搬运后ddr内数据,从0x10000000地址开始(只展示部分数据)

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

4.结语

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]