tag 标签: mif

相关博文
  • 热度 5
    2018-5-3 22:11
    4174 次阅读|
    1 个评论
    【博客大赛】使用MATLAB一键制作mif文件
    这里讲解实现一个16384(2^14)点的14位正弦波数据mif格式文件的生成,使用此文件,我们便可以在FPGA上基于直接数字合成(DDS)原理生成标准的正弦波,即实现信号发生器的功能。关于DDS原理的相关内容,请参考由北航出版社出版的《FPGA自学笔记——设计与验证》一书第六章第6.2节—— “双通道幅频相可调DDS信号发生器” 一节的内容。   在很早之前,我曾编写过一个生成1024点16位正弦波mif文件的方法,不过那时候我的matlab技术还特别特别菜(现在也很菜),只是在matlab中简单的实现了正弦波数据的生成,关于四舍五入取整以及mif文件的最终生成,我用了excel和quartus两个软件经过了复杂的操作才最终完成。如今,自己都对那种方法没有了耐心,刚好新做的一个双通道14位高速DAC模块在做DDS实验时需要用到14位的mif数据,因此今天对matlab的脚本文件重新编写了下,实现了仅通过Matlab就可以一键生成mif文件的功能。 Script。在该文件中输入以下内容: F1=1;%信号的频率 Fs=2^14;%采样频率 P1=0;%信号初始相位 N=2^14;%采样点数为N t= ;%采样时刻 ADC=2^13 - 1;%直流分量 A=2^13;%信号幅度 s=A*sin(2*pi*F1*t +pi*P1/180) + ADC;%生成信号 plot(s);%绘制图形 fild =fopen('d:/sin14bit_16384.mif','wt');%创建mif文件 %写入mif文件文件头 fprintf(fild,'%s\n','WIDTH=14;');%位宽 fprintf(fild,'%s\n\n','DEPTH=16384;');%深度 fprintf(fild,'%s\n','ADDRESS_RADIX=UNS;');%地址格式 fprintf(fild,'%s\n\n','DATA_RADIX=HEX;');%数据格式 fprintf(fild,'%s\t','CONTENT');%地址 fprintf(fild,'%s\n','BEGIN');% fori= 1:N s2(i) =round(s(i));%对小数四舍五入以取整 ifs2(i) <0%强制将负1置0, s2(i) = 0 end % addr : data; fprintf(fild,'\t%g\t',i-1);%地址,从0开始编码 fprintf(fild,'%s\t',':'); fprintf(fild,'%x',s2(i)); fprintf(fild,'%s\n',';'); end 用户如果想自己生成其他深度和位宽的数据,只需要对应修改采样频率(Fs)、采样点数(N)、直流分量(ADC)和信号幅度(A)即可。   保存文件,点击运行按钮,即可生成我们所需要的正弦波数据,并在电脑的D盘根目录生成一个名为“sin14bit_16384 .mif”的文件。 随后,会弹出如下图1所示的界面,该界面便是以我们生产的数据为值,t为时间轴绘制出来的波形,从波形可知为标准的正弦波,你也可以通过放大缩小来具体查看几个顶点的值,以确定数据是否在自己预期的范围内。这里,我们直接关掉该界面即可。 下图2为使用该文件设计的DDS信号发生器系统,输出频率为3.448Mhz(随机设置的一个值),通过示波器的FFT功能可以看到,谐波量并不大。
  • 热度 16
    2014-11-9 23:54
    2592 次阅读|
    12 个评论
    本文档主要讲解实现一个1024点的16位正弦波数据的生成,并将该数据制作成quartus II使用的mif文件,使用此文件,我们便可以使用FPGA,基于直接数字合成(DDS)原理生成标准的正弦波,即实现信号发生器的功能。小梅哥的DDS实验已经做完,目前还没有进行文档的编写。朋友今天邀请我为他制作一个1024点的16位的正弦波mif文件,实现之后,发现过程中涉及到MATLAB软件、Excel软件、Quartus II软件的使用,每个过程简单,但是步骤较多,因此在这里以文档的方式记录下来,分享给需要的朋友。   首先,打开MATLAB软件,小梅哥这里使用的版本为MATLAB 2012b。新建一个Script文件,操作为File —New—Script。在该文件中输入以下内容: F1=1; %信号的频率 Fs=1024;%采样频率 P1=0;%信号初始相位 N=1023;%采样点数为N+1 t= ;%采样时刻 ADC=32767;%直流分量 A=32767;%信号幅度 s=A*sin(2*pi*F1*t + pi*P1/180) + ADC;%生成信号 plot(s);%绘制图形   即可生成我们所需要的数据,其中最后一行为绘制图形,是为了验证我们所生成的数据是否满足要求,不是一定需要。输入完成以后,点击“save and run”按钮,如下图所示。 将文件保存在你自己的路径下面,命一个有意义的名字,这里我暂时保存在桌面,命名为sin16_1024。保存后会弹出如下所示的对话框,选择Add to Path即可。 随后,会弹出如下所示的界面,该界面便是以我们生产的数据为值,t为时间轴绘制出来的波形,从波形可知为标准的正弦波,你也可以通过放大缩小来具体查看几个顶点的值,以确定数据是否在自己预期的范围内。这里,我们直接关掉该界面即可。 这个时候,我们在MATLAB主界面中,右侧的workspace栏中,选中name为s的一项,双击,便可打开该数组的值,如下所示: 将该表格中的所有数据选中(可选中第一个数据,然后将进度条拉到最后一个数据的位置,按下键盘上的shift键,鼠标点击最后一个数据,便可全选了),单击右键,复制即可。然后打开execl软件,选中A1单元格,ctrl+V(粘贴),即可。   在表格中,我们会发现,这些数据是带有2位小数位的,如下图所示: 而我们的mif文件不支持小数,因此需要将这些数据进行四舍五入。四舍五入的方法非常简单我们只需要选中行1(在数字1处点击鼠标左键即可选中),单击鼠标右键,选择设置单元格格式,如下图所示: 在弹出的界面中选中“数字”选项卡,选择“数值”,在“小数位数”处输入0,点击确定,即可。具体如下图所示: 设置完成之后我们再看,发现表格中的数据已经全部被四舍五入了,此时的数据,就是我们可以使用的数据了。如下所示: 此时,我们已经完成了mif文件所需数据的生成工作,我们可以将这个表格文件保存,也可以直接开着,不用关闭就行,因为这个文件只是一个中转。下一步,就是将这些数据生成我们所需要用到的mif文件了。 打开quartus II软件,选择file—New,在打开的选项卡中,选择Memory Initialization File,点击OK。在弹出的mif文件大小设置选项卡中,设置Number of Words为1024,Word Size为16,点击OK即可,详细如下所示:   此时,就会建立好一个空白的mif文件,其中所有内容均为0,如下图所示: 我们将excel表格中的数据选中(可选中第一个数据,然后将进度条拉到最后一个数据的位置,按下键盘上的shift键,鼠标点击最后一个数据,便可全选了),单击右键,复制即可。然后回到quartus II的mif编辑界面,在mif文件的任意一个数据位置点击鼠标左键,然后按下键盘上的组合键ctrl + A(也就是全选),然后单击鼠标右键,选择paste即可。如下图 此时,我们发现,所有数据便依次存入了相应的地址中,如下图所示: 我们点击quartus II软件界面上的file—save,选择你需要存储的路径,这里小梅哥暂时存储在桌面上,将文件名命名为sin16_1024,即完成了我们所有的工作。因为小梅哥这里没有创建工程,所以保存完成后quartus II软件会弹出以下界面,问你是否需新建工程,这里小梅哥只是做演示用,不需要新建工程,因此这里选择NO。 最后,附上朋友采用该mif文件生成的正弦波的仿真波形图: 利用此文件,就可以开始你的DDS设计啦。
  • 热度 18
    2014-3-23 01:48
    3177 次阅读|
    4 个评论
      创建图像的.mif文件 一、用Image2Lcd打开一个图像,并选择输出数据类型,扫描模式,输出灰度,最大宽度和高度等信息。这里创建一个.bin类型文件,其参数类型如下: 二、保存为.bin文件 二、打开BmpToMif软件,选择数据文件,在源文件中选择刚才新建的test.bin文件,再根据自己的需要选择字长,这里选择8位。并点击生成Mif文件,如下所示: 三、到这里已经创建了一个.mif的文件,进而就可以在quartus中调用。   创建图像的.coe文件 一、在刚才创建的.mif的基础上,右击test1.mif的文件,在打开方式中选择用 Excel打开。打开界面如下图: 二、在Excel界面中把那些生成的数据全部选中,点击菜单栏的“数据”,然后选择“分列”,在选择“分隔符号”,最后点击“下一步”,出现如下界面: 三、在上面的界面中在“其他”前打勾,在右边中填入“:”点击下一步,完成。这些就把这些数字的前面的编号分开了,如下所示: 四、按住“ctrl+H”,将全部分号替换为逗号。再把B列删掉,然后另存为.TXT的格式。如下所示替换完如下图: 五、用记事本打开刚刚保存的txt文件,把数字上方的文章都去掉,去完以后如下所示: 六、把倒数第二行的逗号换成分号,换完后再删掉最后一行的“END”。如下所示: 七、在最上面添加如下语句 MEMORY_INITIALIZATION_RADIX=2;   /*2为基数,即下面的数的形式,因为这个例子里面的数据是二进制,故选择2,也可以是4,8,16等。*/ MEMORY_INITIALIZATION_VECTOR=   添加完了以后图形如下所示: 八、点击文件,再单击另存为,在文件名中填写文件名和文件类型为.coe,在保存类型中选择“所有文件(*.*)”,点击保存即可完成.coe文件的建立。      
  • 热度 13
    2014-3-23 01:43
    1143 次阅读|
    0 个评论
      创建图像的.mif文件 一、用Image2Lcd打开一个图像,并选择输出数据类型,扫描模式,输出灰度,最大宽度和高度等信息。这里创建一个.bin类型文件,其参数类型如下: 二、保存为.bin文件 二、打开BmpToMif软件,选择数据文件,在源文件中选择刚才新建的test.bin文件,再根据自己的需要选择字长,这里选择8位。并点击生成Mif文件,如下所示: 三、到这里已经创建了一个.mif的文件,进而就可以在quartus中调用。   创建图像的.coe文件 一、在刚才创建的.mif的基础上,右击test1.mif的文件,在打开方式中选择用 Excel打开。打开界面如下图: 二、在Excel界面中把那些生成的数据全部选中,点击菜单栏的“数据”,然后选择“分列”,在选择“分隔符号”,最后点击“下一步”,出现如下界面: 三、在上面的界面中在“其他”前打勾,在右边中填入“:”点击下一步,完成。这些就把这些数字的前面的编号分开了,如下所示: 四、按住“ctrl+H”,将全部分号替换为逗号。再把B列删掉,然后另存为.TXT的格式。如下所示替换完如下图: 五、用记事本打开刚刚保存的txt文件,把数字上方的文章都去掉,去完以后如下所示: 六、把倒数第二行的逗号换成分号,换完后再删掉最后一行的“END”。如下所示: 七、在最上面添加如下语句 MEMORY_INITIALIZATION_RADIX=2;   /*2为基数,即下面的数的形式,因为这个例子里面的数据是二进制,故选择2,也可以是4,8,16等。*/ MEMORY_INITIALIZATION_VECTOR=   添加完了以后图形如下所示: 八、点击文件,再单击另存为,在文件名中填写文件名和文件类型为.coe,在保存类型中选择“所有文件(*.*)”,点击保存即可完成.coe文件的建立。      
  • 热度 18
    2014-2-28 15:27
    7697 次阅读|
    2 个评论
    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;iDEPTH;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