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

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

0.图像数据

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

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文件

打开后先选择processor

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

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

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

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

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

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

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,控制模式可以根据自己需要选择

在other options页面内勾选load init file选项后就可以根据路径选择对应的coe文件

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

添加zynq模块和bram controller

自动连线即可,最终结果如下

rom的地址如下

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

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

#include <stdio.h>
#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 < 60;i = i + 1){
	ddr_add = ddr_base_add + 4*i;
	rom_add = rom_base_add + 4*i;
	data = Xil_In32(rom_add);
    Xil_Out32(ddr_add,data);
	}

	printf("end");
	return 0;
}

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

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

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

4.结语

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

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值