1. 程式人生 > >用matlab生成mif文件

用matlab生成mif文件

quartus 個數 while size example ima var mat fprintf

在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.\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);
[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,[‘\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);

使用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!‘);

用matlab生成mif文件