如何生成mif文件

fpga中的mif文件用来存储波形数据的,一般有下面的方法来实现mif文件的编写:
方法1:利用Quartus自带的mif编辑器
该方的优缺点在于:对于小容量RAM可以快速方便的完成mif文件的编辑工作,不需要第三方软件的编辑;但是一旦数据量过大,就不适用啦。
方法二:采用mif生成软件来生成
方法三:采用高级语言来实现,本节以matlab语言编写为例进行详细的编写
例如用fpga生成一个正弦波的时候,需要先生成一个存储正弦波数据的mif文件,然后将该mif文件加载到rom中,进而从rom中读出数据,然后经过DA转换就可以生成正弦波(该方法也叫做查表法)
1、第一步是需要在ROM中添加初始化数据,创建.mif文件,采用matlab来实现。matlab代码如下:
%在ROM中添加初始化数据,创建.mif文件,采用matlab来实现,.mif文件
width=12;
depth=4096;%深度是4096
n=0:depth-1;
yn=sin(2pi/4096n);
yn=round((yn+1)2047);%将-1到1的数据变为0-4096
plot(n,yn);
%开始写mif文件
addr=0:depth-1;
str_width=strcat(‘WIDTH=’,num2str(width));%str = num2str(A)把数组A中的数转换成字符串表示形式
str_depth=strcat(‘DEPYH=’,num2str(depth));%
fid=fopen(‘C:\Users\Administrator\Desktop\lianxi\sin_code.mif’,‘wt’);%打开或新建mif,存放位置和文件名任意
%如果只写文件名,则在当前目录下建立此文件
fprintf(fid,str_width);%数据的格式化输出:fprintf(fid, format, variables)按指定的格式将变量的值输出到屏幕或指定文件,fid为文件句柄,若缺省,则输出到屏幕
fprintf(fid,str_depth);
fprintf(fid,’;\n\n’);
fprintf(fid,‘ADDRESS_RADIX=HEX;\n’); %因为下面的数据输入我选的是16进制,
%这里可根据情况改写
fprintf(fid,‘DATA_RADIX=HEX;\n\n’);
fprintf(fid,‘CONTENT BEGIN\n’);
fprintf(fid,’\t%X : %X;\n’,[addr;yn]) %开始写数据了
fprintf(fid,‘END;\n’);
fclose(fid);
上面的程序经过
yn=sin(2
pi/4096*n);

然而,经过
yn=sin(2pi/4096n);
yn=round((yn+1)*2047);%将-1到1的数据变为0-4096
之后的图形变为下面的图形:

经过上面的程序,在C:\Users\Administrator\Desktop\lianxi下得到sin_code.mif文件。
2、第二步是建立ROM表,主要的问题也是数据的位宽和深度。其中的数据位宽指的是每一个数据的位数,数据深度是数据的个数。
其中要注意:添加的.mif文件一定要放在所建立的工程文件下面,不然会读不出ROM表中的数据。(至少quartusII 12版本是这个样子的)
3、写主module,然后将生成的ROM例化进去
module sin(clk,rst_n,start,data_out,phase);
input clk;
input rst_n;
input start;
output [11:0]data_out;
output [11:0]phase ;
//
wire [11:0]phase;
myrom U1(
.address(phase),
.clock(clk),
.q(data_out));
/
*/
reg [11:0]cnt=12’d0;
always@(posedge clk or negedge rst_n)
begin
if(rst_n==1’b0)
cnt<=12’d0;
else if(start)
cnt<=cnt+1’b1;
else
cnt<=cnt;
end
assign phase=cnt;
endmodule

作者:Stupidnan
来源:CSDN
原文:https://blog.csdn.net/qq_38492080/article/details/78558976
版权声明:本文为博主原创文章,转载请附上博文链接!
4、编写testbench
`timescale 1 ns/1 ns
module sin_simulation();
reg clk;
reg rst_n;
reg start=1;
wire [11:0]data_out;
wire [11:0]phase;
/*******************************、
sin U1(.clk(clk),.rst_n(rst_n),.start(start),.data_out(data_out),.phase(phase));
initial
begin
rst_n=1’b0;
#10 rst_n=1’b1;
end
initial
begin
clk=0;
forever #5 clk=~clk;
end
endmodule
5、运行modelsim
设置modelsim模式为示波器模式,数据格式设置为无符号类型
Radix——unsigned
Format——Analog(automatic)//将要显示的波形以模拟量的形式显示
这样就得到要显示的波形啦!
6、通过设置设置地址的步进长度可以得到不同周期的正弦波,同时创建不同波形的.mif文件,同样可以通过按键得到不同的相应的波形,制作一个简易的波形发生器。
需要注意的就两点:
1、.mif文件中数据的宽度和深度,然后还有创建的ROM的数据宽度和深度,两者不匹配的话就 会读不 出数据
2、添加.mif文件的地址需要注意,如果碰到读不出数据,首先检查一下添加地址是否正确


作者:Stupidnan
来源:CSDN
原文:https://blog.csdn.net/qq_38492080/article/details/78558976
版权声明:本文为博主原创文章,转载请附上博文链接!
方法三:本文档主要讲解实现一个1024点的16位正弦波数据的生成,并将该数据制作成quartus II使用的mif文件,使用此文件,我们便可以使用FPGA,基于直接数字合成(DDS)原理生成标准的正弦波,即实现信号发生器的功能。小梅哥的DDS实验已经做完,目前还没有进行文档的编写。朋友今天邀请我为他制作一个1024点的16位的正弦波mif文件,实现之后,发现过程中涉及到MATLAB软件、Excel软件、Quartus II软件的使用,每个过程简单,但是步骤较多,因此在这里以文档的方式记录下来,分享给需要的朋友。

本文引用地址:http://www.eepw.com.cn/article/276733.htm
  首先,打开MATLAB软件,小梅哥这里使用的版本为MATLAB 2012b。新建一个Script文件,操作为File —>New—>Script。在该文件中输入以下内容:

F1=1; %信号的频率

Fs=1024;%采样频率

P1=0;%信号初始相位

N=1023;%采样点数为N+1

t=[0:1/Fs:N/Fs];%采样时刻

ADC=32767;%直流分量

A=32767;%信号幅度

s=Asin(2piF1t + 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值