在FPGA中,rom模块的初始化文件分为两种,一种是hex文件,另外一种是mif文件,这两种文件都可以通过Quartus进行手工创建,进行手工输入数据,也可以借助于专用的文件编辑器完成编辑。
在此介绍使用matlab生成mif文件的方法。
miffile.m文件的源程序如下:
function miffile(filename,var,width,depth)
%输入4个参数:
% filename: 所要生成的.mif文件的文件名,即目标文件名
% var :数据输入的文件,即源文件
% width :数据位宽
% depth : 数据深度
%
% example:
% a=unit8(rand(16,16),*255);
% miffile('randnum.mif',a,8,255);
%
if(nargin~=4) %输入必须是四个参数!
error('Need 4 parameters! Use help miffile for help!');
end,
%模拟输出mif文件的格式
fh=fopen(filename,'w+');
fprintf(fh,'--Created by xxxx.
');
fprintf(fh,'--xxxx@126.com.
');
fprintf(fh,'--%s.
',datestr(now));
fprintf(fh,'WIDTH=%d;
',width); %位宽
fprintf(fh,'DEPTH=%d;
',depth); %深度
fprintf(fh,'ADDRESS_RADIX=HEX;
'); %地址采用十六进制数表示
fprintf(fh,'DATA_RADIX=HEX;
'); %数据采用十六进制数表示
fprintf(fh,'CONTENT BEGIN
'); %数据开始标志
%%%%%%%%%%
%%%%%%%%%%
var=rem(var,2^width);
[sx,sy,sz]=size(var);
value=var(1,1,1);
sametotal=1;
idepth=0;
addrlen=1;
temp=16;
while(temp<depth) %计算所需地址的个数,地址长度
temp=temp*16;
addrlen=addrlen+1;
end,
datalen=1;
while(temp<width) %计算数据的个数,数据长度
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,[' %' num2str(addrlen) 'X:%' num2str(datalen) 'X;
'],idepth-1,value);
else
fprintf(fh,[' [%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;
'],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,[' %' num2str(addrlen) 'X:%' num2str(datalen) 'X;
'],idepth,value);
else
fprintf(fh,[' [%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;
'],idepth-sametotal+1,idepth,value);
end,
end,
if(idepth<depth-1)
if(idepth==(depth-2))
fprintf(fh,[' %' num2str(addrlen) 'X:%' num2str(datalen) 'X;
'],idepth+1,0);
else
fprintf(fh,[' [%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;
'],idepth+1,depth-1,0);
end,
end,
%%%%%%%%%
%%%%%%%%%
fprintf(fh,'END;
');
fclose(fh);
使用miffile函数的例程如下,将一幅RGB图片的R基色转换为灰度值后,存入到mif文件中:
clc;
clear all;
%注释
RGBImage=imread('test.JPG');
RImage=RGBImage(:,:,1);
[row,col]=size(RImage);
OutDate=zeros(1,row*col);
for i=1:row
for j=1:col
OutData((i-1)*col+j)=RImage(i,j);
end
end
miffile('data.mif',OutData,8,row*col)
imshow(RImage);
disp('OK!');