matlab 2016读取mif文件

本文使用代码及测试用例下载如下

【免费】MATLAB读取mif文件资源-CSDN文库

背景

mif文件介绍

mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据。生成QuartusII11.0可用的mif文件,有如下几种方式:

方法1:利用Quartus自带的mif编辑器

优点:对于小容量RAM可以快速方便的完成mif文件的编辑工作,不需要第三方软件的编辑;

缺点:一旦数据量过大,一个一个的输入会使人崩溃;

方法2:利用mif软件来生成

无论使用什么编辑器,必须保证mif文件的格式如下:冒号左边是地址,右边是数据;分号结尾;

需求

项目需要将QuartusII11.0生成的mif文件读取到matlab中进行数据分析

实现

思路

从网上找到帖子

参考帖子
https://blog.csdn.net/weixin_43239754/article/details/106073535
感谢作者的分享。

这里作者读取了mif文件又将mif文件转换成coe文件

我这里仅仅需要读取mif文件即可

所以可以使用,但是实际运行过程中,这个帖子的代码运行总是报错,发现是matlab版本问题,我的matlab是2016,太低了。

这里我修改代码实现再2016能够读取mif文件

并给出测试用例

代码

function DATA=mifread(file_in_fullpath)




%file_in_fullpath = 'InputB1152.mif';
file_in_fullpath = 'checkB_1152.mif';

%% 一些说明
% 输入.mif文件的路径
% 输出转换后的.coe文件及其路径(输出的路径与.mif在同一目录下)
% .coe文件位宽默认16位
%% 读取文件
%----------------------------------------------
index_doc_mif=strfind(file_in_fullpath,'.mif');
if(isempty(index_doc_mif))
    error('非.mif格式文件')
end
%----------------------------------------------
index_slash=strfind(file_in_fullpath,'\');
if(isempty(index_slash))
    index_slash=0;
    file_path=mfilename('fullpath');
    index_slash0=strfind(file_path,'\');
    file_path=file_path(1:index_slash0(end));
else
    file_path=file_in_fullpath(1:index_slash(end));
end
%----------------------------------------------
fid_in=fopen(file_in_fullpath,'r');
try
    A=textscan(fid_in,'%s','Delimiter','/n');
catch
    error('在路径下没有找到.mif文件')
end
fclose(fid_in);
%% 提取主要参数
File_str=A{1,1};
%File_str_test = ['Mary Ann Jones','Christopher Matthew Burns','John Paul Smith'];
%pat = ['Ann','Paul'];
index_DEPTH_GP=(strfind(File_str,'DEPTH'));
%index_DEPTH=strfind(File_str_test,pat);
index_WIDTH_GP=(strfind(File_str,'WIDTH'));
index_ADDRESS_RADIX_GP=(strfind(File_str,'ADDRESS_RADIX'));
index_DATA_RADIX_GP=(strfind(File_str,'DATA_RADIX'));
index_CONTENT_GP=(strfind(File_str,'CONTENT'));
index_BEGIN_GP=(strfind(File_str,'BEGIN'));
index_END_GP=(strfind(File_str,'END'));

index_DEPTH=76;
index_WIDTH=75;
index_ADDRESS_RADIX=77;
index_DATA_RADIX=78;
index_CONTENT=79;
index_BEGIN=79;
%index_END=663;
index_END=669;

if(   isempty(index_DEPTH) ...
   || isempty(index_WIDTH) ...
   || isempty(index_ADDRESS_RADIX) ...
   || isempty(index_DATA_RADIX)...
   || isempty(index_BEGIN) ...
   || isempty(index_END) )

    error('你打开.mif文件错误或已损坏')
end
%-------------------------------DEPTH-----------------------------------
DEPTH=regexp(File_str(index_DEPTH),'\.?\d*','match');DEPTH=char(DEPTH{1});DEPTH=str2num(DEPTH);
%-------------------------------WIDTH-------------------------------------
WIDTH=regexp(File_str(index_WIDTH),'\.?\d*','match');WIDTH=char(WIDTH{1});WIDTH=str2num(WIDTH);
%---------------------------ADDRESS_RADIX----------------------------------
splitStr = regexp(File_str(index_ADDRESS_RADIX),'\=','split');
ADDRESS_RADIX=splitStr{1,1}{1,2};
ADDRESS_RADIX(isspace(ADDRESS_RADIX)) = [];ADDRESS_RADIX(ADDRESS_RADIX==';')=[];
%----------------------------DATA_RADIX------------------------------------
splitStr = regexp(File_str(index_DATA_RADIX),'\=','split');
DATA_RADIX=splitStr{1,1}{1,2};
DATA_RADIX(isspace(DATA_RADIX)) = [];DATA_RADIX(DATA_RADIX==';')=[];
%-------------------------------------------------------------------------
%% 数据裁剪补齐
addr_and_data=File_str(index_BEGIN+1:index_END-1);
DATA=[];
if size(addr_and_data,1)<DEPTH
    for i=1:size(addr_and_data,1)
        data_element=cell2mat(addr_and_data(i));
        if ( (strfind(data_element,'[')) & (strfind(data_element,'..')) & (strfind(data_element,']')) )
           repeat_start_index=str2num(data_element(find(data_element=='[')+1:strfind(data_element,'..')-1));
           repeat_end_index=str2num(data_element(strfind(data_element,'..')+2:find(data_element==']')-1));
           repeat_data=data_element(find(data_element==':')+1:find(data_element==';')-1);repeat_data(isspace(repeat_data))=[];
           DATA=[DATA;repmat(repeat_data,repeat_end_index-repeat_start_index+1,1)];
        else
           repeat_data=data_element(find(data_element==':')+1:find(data_element==';')-1);repeat_data(isspace(repeat_data))=[];
           DATA=[DATA;repeat_data];
        end
    end
else
    index_colon=cell2mat(strfind(addr_and_data,':'));
    addr_and_data=cell2mat(addr_and_data);
    data = addr_and_data(:,index_colon(1)+1:end-1);
    data(:,isspace(data(1,:)))=[];
    % data=mat2cell(data,ones(size(data,1),1),size(data,2));
    DATA=data;  
end

DATA=(str2num(DATA));









end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大牛攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值