• 用matlab生成mif文件


            在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!');

  • 相关阅读:
    【BZOJ】1710: [Usaco2007 Open]Cheappal 廉价回文
    【BZOJ】3302: [Shoi2005]树的双中心 && 2103: Fire 消防站 && 2447: 消防站
    【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑
    【Atcoder】CODE FESTIVAL 2017 qual A D
    【BZOJ】3038: 上帝造题的七分钟2 && 3211: 花神游历各国
    【BZOJ】1707: [Usaco2007 Nov]tanning分配防晒霜
    【BZOJ】1754: [Usaco2005 qua]Bull Math
    【BZOJ】1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
    【BZOJ】1828: [Usaco2010 Mar]balloc 农场分配(经典贪心)
    【BZOJ】1709: [Usaco2007 Oct]Super Paintball超级弹珠
  • 原文地址:https://www.cnblogs.com/MAQI/p/7390653.html
Copyright © 2020-2023  润新知