在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!');
|
请发表评论