原创 【原创】ROM的初始化文件-mif文件

2014-2-28 15:27 7704 16 18 分类: FPGA/CPLD

1、mif文件

1)、mif文件的概念

mif文件,是FPGA中ROM的初始化文件(Memory Initialization File),用来配置RAM或者ROM。因为FPGA是基于SRAM存储的,是掉电易失性的,所以要实现ROM的功能,我们就需要在FPGA配置的过程中,把相应的存储块初始化,从而在FPGA处在用户状态时,这个存储块在用户看来就相当于一个ROM。

 

2)、mif文件的格式

mif文件有固定的格式。如下:

  DEPTH = XXX;//存储块的深度

  WIDTH = XX;//每个存储单元存储数据的宽度

  ADDRESS_RADIX = HEX;

  DATA_RADIX = HEX;

  CONTENT

BEGIN

XX        :       XXX;//冒号前的数表示存储单元在存储块中的位置,后面的数据表示该存储单元中存储的数据。

   END;

因为mif文件的格式是固定的,所以要想产生带有我们需要数据的mif文件很简单,只要按照mif文件的格式把BEGIN...END中的数据替换成我们需要的数据即可。

 

3)、Quartus II 中mif文件里数据产生的方法

①、手工录入法

当mif文件中的数据较少时,我们可以在Quartus II 中新建一个mif文件,然后直接在mif文件中编辑录入所需要的数据。编辑的方法既可以是直接在Quartus II 软件界面中直接输入,也可以打开.mif文件的文本文档直接编辑BEGIN ...END;中的数据

 

②高级语言生成法

如果mif文件中的数据具有一定的规律,我们可以用高级语言按照这个规律来编写程序来生成这些数据。比如mif文件中的数据是正弦曲线上的数值,那么我们就可以用高级语言编写一个正弦函数来算得这些数值。

高级语言生成,可以用C语言也可以用Matlab 的M语言。比如,用C语言生成一组正弦函数数据:

#include <stdio.h>

#include <math.h>

void main()

{

              int t;

              int u;

              for(t=0;t<=121;t++)

              {

                            u=sin(2*3.1415926*(100*t+59*t*t/7));

                            printf("%d:                    %d;\n",t,u);

              }

}

这里就是生成122个正弦曲线上的数据的方法,我们只需要把打印输出的数据复制到mif文件的BEGIN ...END;之间替代之前的数据即可。

 

③高级语言直接生成mif文件

我们也可以直接用高级语言(C语言或者M语言)来生成mif文件,之前两种方法产生的只是mif文件中的数据。

比如,用C语言来产生一个正弦波的数据波形,保存在“TestMif.mif”文件中:

#include <stdio.h>

#include <math.h>

 

#define PI 3.141592

#define DEPTH 128     /*数据深度,即存储单元的个数*/

#define WIDTH 8       /*存储单元的宽度*/

 

int main(void)

{

    int i,temp;

    float s;

 

    FILE *fp;

    fp = fopen("TestMif.mif","w");   /*文件名随意,但扩展名必须为.mif*/

    if(NULL==fp)

        printf("Can not creat file!\r\n");

    else

    {

        printf("File created successfully!\n");

        /*

        *    生成文件头:注意不要忘了“;”

        */

        fprintf(fp,"DEPTH = %d;\n",DEPTH);

        fprintf(fp,"WIDTH = %d;\n",WIDTH);

        fprintf(fp,"ADDRESS_RADIX = HEX;\n");

        fprintf(fp,"DATA_RADIX = HEX;\n");

        fprintf(fp,"CONTENT\n");

        fprintf(fp,"BEGIN\n");

 

        /*

        * 以十六进制输出地址和数据

        */

        for(i=0;i<DEPTH;i++)

        {

             /*周期为128个点的正弦波*/

            s = sin(PI*i/64);  

            /*将-1~1之间的正弦波的值扩展到0-255之间*/

            temp = (int)((s+1)*255/2);

            /*以十六进制输出地址和数据*/

            fprintf(fp,"%x\t:\t%x;\n",i,temp);

        }//end for

       

        fprintf(fp,"END;\n");

        fclose(fp);

    }

}

把这个生成的mif文件直接导入到Quartus II中即可。

 

4、参考文件

如何生成mif文件http://www.cnblogs.com/BitArt/archive/2012/12/11/2813503.html

文章评论2条评论)

登录后参与讨论

用户403664 2014-4-9 15:56

哎呀!太惨了,一定记得保存到草稿箱再提交!

coyoo 2014-3-3 16:13

回去翻了下本人博客,找到了当时用TCL写的怎么产生MIF文件的介绍了: http://bbs.ednchina.com/BLOG_ARTICLE_253659.HTM

coyoo 2014-3-3 16:07

最近流行的c编译器是什么?好久没玩过了,你的这个使用高级语言产生mif的思路,我是用脚本来实现的。脚本语言不需要编译器,所以比较简单。
相关推荐阅读
用户1610289 2014-06-23 17:43
【转载】一篇关于dB的文章
声音有太多的不确定性,尽管这样,工程师们还是想办法定些规矩,要知道这些"规矩"历史并不久,没赶上,否则这些规矩的制定也许能听听你的意见  dB中文称"分贝",没有任何特别含义,就象"厘米"、"公斤...
用户1610289 2014-06-18 16:50
【原创】调用RAM核报错
Internal Error: Sub-system: BAL, File: /quartus/synth/bal/bal_ec_balancer.cpp, Line: 1463 dest &...
用户1610289 2014-06-03 14:57
【原创】ARM对FPGA进行FPP模式的远程配置
        最近的一个项目里有一项功能是,用ARM来配置FPGA,配置模式是FPP模式。这么做的目的是,ARM可以实现通过网络来实现FPGA配置文件的远程升级,从而实现FPGA的远程配置。 ...
用户1610289 2014-03-13 18:43
【原创】FPGA配置不成功的原因分析
       近期项目的板卡焊接回来,开始进行硬件调试。在调试FPGA最小电路能否正常工作的时候,出现了这样一个问题:用JTAG烧写器往FPGA中烧写配置文件的时候,文件可以正常烧写,但是FPGA...
用户1610289 2014-03-08 18:14
【转载】关于generate用法的总结
Abtract     generate语句允许细化时间(Elaboration-time)的选取或者某些语句的重复。这些语句可以包括模块实例引用的语句、连续赋值语句、always语句、ini...
用户1610289 2014-02-28 16:20
【转载】Quartus II中FPG**上存储器初始值更新的方法
最近在调试中遇到了这样一个问题:一组参数预先存储在FPGA的片上存储器内;在系统运行过程中部分参数会被读出,修改后写回;为了调试,需要经常变换参数的初始化值。 riple     实现存储器中...
我要评论
2
16
关闭 站长推荐上一条 /2 下一条