原创 关于QuartusII里面调用MATLAB里生成的mif文件的一些问题

2009-6-2 12:15 10954 11 14 分类: FPGA/CPLD

最近做DDS正弦信号发生器,需要用到MATLAB生成一个正弦信号的ROM(MIF文件)。首先在MATLAB里面建立一个M-File,程序如下:


depth=4096;                 %存储单元数;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


widths=12;                    %数据宽度为12;


N=0:1: 4096;


s=sin(pi*N/2048);             %计算0~pi/2Sin;


fidc=fopen('dds.mif','wt');       %"wt"的形式打开,\n为换行


% 写入 dds.mif %


fprintf(fidc,'depth=%d;\n',depth);


fprintf(fidc,'width=%d;\n',widths);


fprintf(fidc,'address_radix=dec;\n');


fprintf(fidc,'data_radix = dec;\n');


fprintf(fidc,'Content Begin\n');


for(x=1:depth)


fprintf(fidc,'%d:%d;\n',x-1, round(2047*sin(pi*(x-1)/ 2048)+2048));


 


end


fprintf(fidc,'end;');


fclose(fidc);


再点RUN就生成所要的MIF文件了,保存在C:\MATLAB7\work


当然程序是老师写的,本人对这东东一无所知,不怕读者笑话。(也正是因为对这个程序的茫然不知,导致后面严重的错误。)


然后在QuartusII调用一个12位宽,4096位深度的LPM_ROM,指定路径C:\MATLAB7\work,我已为大功告成。


可接下来问题来了,在QII里面编译时出现如下错误:


Error: Data at line 6 exceeds the specified width (12) in the Memory Initialization File "C:/MATLAB7/work/dds.mif"
Error: Memory Initialization File or Hexadecimal (Intel-Format) File C:/MATLAB7/work/dds.mif contains illegal syntax at line 6
Error: Can't read Memory Initialization File or Hexadecimal (Intel-Format) File C:/MATLAB7/work/dds1.mif for ROM instance . If the file exists, it is not in correct format.
Error: Can't elaborate user hierarchy "lpm_rom0:inst|altsyncram:altsyncram_component|altsyncram_3c81:auto_generated"
Error: Quartus II Analysis & Synthesis was unsuccessful. 4 errors, 1 warning


第一个错误是说我生成的MIF文件第六行数据已经超过的指定的数据位宽。后面的大概就是QII里面的一些VHDL语法错误了(我认为,因为英文不好)。


可是我想不通的是调用LPM_ROM明明是12位宽,4096的深度怎么会不对呢?问老师说不知道,且说MATLAB程序没问题。于是本人只好百度一下了,结果找到一篇这样的文章:


MATLAB生成*.mif*.hexQUARTUS II)文件简介


macro_qian@yahoo.com.cn


 


FPGA设计时经常要调用芯片内存。特别对于ROM,内存的初始化就显得比较重要。当然你完全可以手工在QUARTUS II打开mif文件的表格里或是在EXCEL中逐个输入,几十项(字)或是近百项(字)你还可以接受,如果上千项或是更多呢?估计能累的人吐血!


一般内存的初始化数据都是有规律的,符合一定的函数,我们完全可以用MATLAB来完成(如果没规律只能逐项手工输入了)


首先,我们应该知道*.mif文件的格式。它是文本格式。随便打开一个mif文件,你会发现它具有如下的格式:


 


-- Copyright (C) 1991-2007 Altera Corporation


-- Your use of Altera Corporation's design tools, logic functions


-- and other software and tools, and its AMPP partner logic


-- functions, and any output files from any of the foregoing


-- (including device programming or simulation files), and any


-- associated documentation or information are expressly subject


-- to the terms and conditions of the Altera Program ******


-- Subscription Agreement, Altera MegaCore Function ******


-- Agreement, or other applicable ****** agreement, including,


-- without limitation, that your use is for the sole purpose of


-- programming logic devices manufactured by Altera and sold by


-- Altera or its authorized distributors.  Please refer to the


-- applicable agreement for further details.


 


-- Quartus II generated Memory Initialization File (.mif)


 


WIDTH=8;


DEPTH=256;


 


ADDRESS_RADIX=UNS;


DATA_RADIX=UNS;


 


CONTENT BEGIN


       0:127;


       1:126;


       2:126;


       ……


    ……


       253:126;


       254:126;


       255:127;


END;


 


格式很简单吧。首先根据需要设置每个字的位宽WIDTH和总字数DEPTH。然后设置地址和数据的进制基数ADDRESS_RADIXDATA_RADIX,建议大家不要修改,就使用无符号数(UNS)。然后用MATLAB生成需要的数据(按上边的格式,注意中间“:”,最后“;”),往CONTENT BEGINEND中间一贴就行了。


 


下边举例说明MATLAB程序的写法,希望对大家有用。


 


%the walue of cosine


function data="makedata"


index = linspace(0,2*pi,2^8);                     


cos_value = cos(index);                                 


cos_value = cos_value * (2^7 -1 );           


cos_value = fix(cos_value);


cos_value =abs(cos_value);


for i="65:192"


    cos_value(i)=cos_value(i)+128;


end


%///////////////////////////////////////上边的用来生成数据,下边的用于控制格式输出(对大家有用的)


number=[0:255];


for i="1:256"


    comer(i)=':';


end


for i="1:256"


    semi(i)=';';


end


data=[number; comer; cos_value; semi];


fid=fopen('d:\data.txt','w');


fprintf(fid, '%d%c%d%c\n', data);


fclose(fid);


 


D盘下找到data.txt文件,用写字板打开mif文件,将data.txt中的内容贴到CONTENT BEGINEND中间,然后保存就可以了。


 


对于hex文件,更简单。大家生成mif文件后,用QUARTUS II打开,然后另存为hex文件就可以了。


---------------------------------


我注意到 下面这两行:


ADDRESS_RADIX=UNS;


DATA_RADIX=UNS;


和老师的程序有点出入,于是把MATLAB生成的MIF文件里面的DEC改成UNS,就是把有符号10进制改成无符号十进制的整数,再重新调用LPM_ROM,编译就顺利通过了:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 


这里要感谢这位仁兄,所以也将自己的一点体会摆出来一起交流,有什么不对的地方还请大家批评指正。


 

 

文章评论3条评论)

登录后参与讨论

用户1116930 2010-6-5 23:08

好文章。受益了。

用户178146 2009-9-6 04:41

有可能,但是我同学和我一样的版本,他的能编译,我想我的电脑唯一和他的不同就是主板了~~

coyoo 2009-7-6 13:12

呵呵,你的12位位宽其实有效只有11位,最高位为符号位。 不知道你的QII版本是什么,在老的版本里你老师的程序可能没有问题,在新版本,我不记得从哪个版本开始的,mif文件会检查这个问题。 我估计你老师一直用的很老的QII。^0^
相关推荐阅读
用户178146 2009-12-23 17:03
个人简历
个人资料                                  姓名:YGM                  性别:男                籍贯:湖南学历:本科        ...
用户178146 2009-11-16 11:09
8*8点阵
https://static.assets-stash.eet-china.com/album/old-resources/2009/11/16/7ac6100e-4813-496c-ade3-cc1...
用户178146 2009-10-27 08:27
DSP最小系统
经过几天的努力,终于画完了这个TMS320C55X系列的最小系统。核心板上主要是DSP芯片TMS320VC5501,Flash(AT25F512),SDRAM(HY57V6416),还有JTAG接口。...
用户178146 2009-10-26 15:02
如何学习嵌入式系统(基于ARM平台)---转自kinreven 的Blog
关于嵌入式系统--献给热爱此道的初学者们前言   网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。也请大家不要轻易转载。一、嵌入式系统的概念...
用户178146 2009-10-16 14:49
LM3s1138学习手记(4)之玩转LED
好久没写东西了,不是我偷懒,而是最近很背。不说了,开始我们的LED吧!先上硬件电路图:既然是玩转LED,那么设计任务就不能草率。我的设计要求是:先依次点亮LED1,LED2,LED3,时间间隔为1s,...
用户178146 2009-09-26 18:39
DDS基本完工了!
经过将近一个月的努力,基于FPGA的正弦信号发生器终于完工了。我做是硬件部分,我同学写软件。硬件包括如下几个部分:1.高速数模转换DAC2.低通滤波部分3.信号放大部分最后用示波器观察波形如下:   ...
我要评论
3
11
关闭 站长推荐上一条 /2 下一条