首先,MATLAB是特别强大的数学工具,如果不会MATLAB那么自己的整个职业生涯只能写写接口逻辑,与算法再无关联,很难有长久的进步,所以这里我们将给出几个MATLAB的例子。
我们为什么要将一幅图片转换成coe图片,因为在ISE软件中,我们可以发现ROM中预存的信息格式是coe文件,所以我们要想在ROM存储相应的信息,必须先把文件转换成coe文件。相信同学们也都明白该操作的意义,所以我们这里直接给出代码以供学习交流。
// *********************************************************************************
// Project Name : OSXXXX
// Author : zhangningning
// Email : [email protected]
// Website :
// Module Name : fig.coe
// Create Time : 2020-02-07 15:26:28
// Editor : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// XXXX zhangningning 1.0 Original
//
// *********************************************************************************
clc;
clear all;
RGB=imread('logo.jpg');
R=RGB(:,:,1);
G=RGB(:,:,2);
B=RGB(:,:,3);
outdata=zeros(1,40000);
for r = 1:200
for c = 1:200
outdata((r-1)*200+c)=bitand(R(r,c),224)+bitshift(bitand(G(r,c),224),-3)+bitshift(bitand(B(r,c),192),-6);
end
end
fid=fopen('data.coe','w+');
fprintf(fid,'memory_initialization_radix=16;\nmemory_initialization_vector=\n');
for i = 1:39999
fprintf(fid,'%x,\n',outdata(i));
end
fprintf(fid,'%x;',outdata(40000));
fclose(fid);
这里也说明一下这样做的原因,例如我们要经过串口发送一幅图片数据时,我们不能直接用UE打开图片,然后将UE中的信息发送出去,因为学过图像处理的同学都应该知道,对于bmp真彩图,图片中含有文件头和信息头与图片信息,对于索引图像更是有索引表,对于常见的jpg压缩图像更使与图片信息没有直接关系。所以我们要利用MATLAB将图片信息提取到txt文件中。弄清楚了该过程的意义之后,我们给出转换的代码如下:
// *********************************************************************************
// Project Name : OSXXXX
// Author : zhangningning
// Email : [email protected]
// Website :
// Module Name : fig.txt
// Create Time : 2020-02-07 15:26:28
// Editor : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// XXXX zhangningning 1.0 Original
//
// *********************************************************************************
clear all; %清空所有变量
clc; %
pic_data = imread('./800x600a.jpg'); %R:8bit
pic_red = pic_data(:,:,1);
pic_green = pic_data(:,:,2);
pic_blue = pic_data(:,:,3);
[ROW COL] = size(pic_red);
% 对原图进行处理,将处理完的图像数据写入abc.txt文件
fid = fopen('./abcde800x600a.txt','w+');
for r = 1: ROW
for c = 1:COL
%red取高3位,green取高3位,blue取高2位,拼成8位
% 串口,一帧数据:8bit,原始图像一个像素点占24bit
pic_out(r,c) = bitand(pic_red(r,c), 224) + bitshift(bitand(pic_green(r,c),224),-3)+ bitshift(bitand(pic_blue(r,c),192),-6);
fprintf(fid,'%02x ',pic_out(r,c));
end
end
fclose(fid);
intel FPGA中ROM文件中存储的时mif文件,与Xilinx中相同,想将图片信息存储到FPGA的ROM中,必须先将图片信息转存成mif文件,这里也不过说直接给出相应的代码供同学们理解:
// *********************************************************************************
// Project Name : OSXXXX
// Author : zhangningning
// Email : [email protected]
// Website :
// Module Name : fig.mif
// Create Time : 2020-02-07 15:26:28
// Editor : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// XXXX zhangningning 1.0 Original
//
// *********************************************************************************
function miffile(filename,var,width,depth)
if(nargin~=4) %% be tired to do more inupts check!
error('Need 4 parameters! Use help miffile for help!');
end,
fh=fopen(filename,'w+');
fprintf(fh,'--Created by zhangningning.\r\n');
fprintf(fh,'[email protected].\r\n');
fprintf(fh,'--%s.\r\n',datestr(now));
fprintf(fh,'WIDTH=%d;\r\n',width);
fprintf(fh,'DEPTH=%d;\r\n',depth);
fprintf(fh,'ADDRESS_RADIX=HEX;\r\n');
fprintf(fh,'DATA_RADIX=HEX;\r\n');
fprintf(fh,'CONTENT BEGIN\r\n');
var=rem(var,2^width);%% clip to fit the width;
[sx,sy,sz]=size(var);%% can only fit 3D or less;
value=var(1,1,1);
sametotal=1;
idepth=0;
addrlen=1;
temp=16;
while(temp<depth) %%decide the length of addr
temp=temp*16;
addrlen=addrlen+1;
end,
datalen=1;
while(temp<width) %%decide the length of data
temp=temp*16;
datalen=datalen+1;
end,
for k=1:sz,
for j=1:sy,
for i=1:sx,
if(~((i==1 ) &&( j==1) &&( k==1)))
if(idepth<depth),
idepth=idepth+1;
if(value==var(i,j,k))
sametotal=sametotal+1;
continue;
else
if(sametotal==1)
fprintf(fh,['\t%' num2str(addrlen) 'X:%' num2str(datalen) 'X;\r\n'],idepth-1,value);
else
fprintf(fh,['\t[%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;\r\n'],idepth-sametotal,idepth-1,value);
end,
sametotal=1;
value=var(i,j,k);
end,
else
break;
end,
end,
end,
end,
end,
if(idepth<depth)
if(sametotal==1)
fprintf(fh,['\t%' num2str(addrlen) 'X:%' num2str(datalen) 'X;\r\n'],idepth,value);
else
fprintf(fh,['\t[%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;\r\n'],idepth-sametotal+1,idepth,value);
end,
end,
if(idepth<depth-1)
if(idepth==(depth-2))
fprintf(fh,['\t%' num2str(addrlen) 'X:%' num2str(datalen) 'X;\r\n'],idepth+1,0);
else
fprintf(fh,['\t[%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;\r\n'],idepth+1,depth-1,0);
end,
end,
fprintf(fh,'END;\r\n');
fclose(fh);
这里为了不同从给出了一个通用性比较高的代码,当然也可以像写coe文件那样简单的写一个MATLAB文件。
为什么要将图片转换成bin文件,举一个实际的例子,在做USB传输数据的时候,cypress公司给出的上位机传输有以下特点:
1、直接选择数据传输会传输多余的数据;
2、图像转成TXT图像传输,会对TXT图像中的数据进行ASCII编码;
所以我们要将图形数据转换成bin文件的数据,代码如下:
// *********************************************************************************
// Project Name : OSXXXX
// Author : zhangningning
// Email : [email protected]
// Website :
// Module Name : fig.bin
// Create Time : 2020-02-07 15:26:28
// Editor : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// XXXX zhangningning 1.0 Original
//
// *********************************************************************************
clear all; %清空所有变量
clc; %
pic_data = imread('./800x600a.jpg'); %R:8bit
pic_red = pic_data(:,:,1);
pic_green = pic_data(:,:,2);
pic_blue = pic_data(:,:,3);
[ROW COL] = size(pic_red);
pic_out_h = zeros(ROW COL);
pic_out_l = zeros(ROW COL);
% 对原图进行处理,将处理完的图像数据写入abc.txt文件
fid = fopen('./tuxiang.bin','w+');
for r = 1: ROW
for c = 1:COL
pic_out_h(r,c) = bitand(pic_red(r,c), 248) + bitshift(bitand(pic_green(r,c),224),-5);
fprintf(fid,'%02x ',pic_out_h(r,c));
pic_out_l(r,c) = bitshift(bitand(pic_green(r,c),28),3) + bitshift(bitand(pic_blue(r,c),248),-3)
fprintf(fid,'%02x ',pic_out_l(r,c));
end
end
fclose(fid);
创作不易,认为文章有帮助的同学们可以收藏点赞支持。(工程也都在群中)对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群: