本文主要讲解三种本人已知的将图像数据传入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地址开始(只展示部分数据)
文章来源:https://www.toymoban.com/news/detail-770027.html
4.结语
介绍了三种比较基础的将数据存入ddr的方法,也不一定是图像数据,其他的数据也都可以按照这些方法导入ddr内,对于图像数据,通过sdk直接存入ddr内和通过sd卡读取还是比较便捷的,通过将数据初始化到rom内的方法限制较大,在导入图像数据后,因为三种方法的数据格式不同,要注意数据的使用方法。 文章来源地址https://www.toymoban.com/news/detail-770027.html
到了这里,关于FPGA + 图像处理(一)三种向zynq中DDR内导入图像数据的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!