写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步!
函数一、生成正弦波mif文件
/*-—---功能:正弦波------*/
int sine_wave(FILE* p, int maxwords,int depth)
{
int i,j;
for(i=0;i<depth;i++)
{
j=(int)((maxwords/2-1)*sin(2*M_PI*i/depth) + maxwords/2);
fprintf(p,"\t%-6x:%x;\n",i,j);
}
return 1;
}
函数二、生成余弦波mif文件
/* -----功能:余弦波----- */
int cosine_wave (FILE *p,int maxwords, int depth)
{
int i, j;
for(i=0; i<depth; i++)
{
j=(int)((maxwords/2-1)*cos(2*M_PI*i/depth)+maxwords/2);
fprintf(p,"\t%-6x:%x;\n",i,j);
}
return 1;
}
函数三、生成方波mif文件
/*-----功能:方波-----*/
int square_wave(FILE * p,int maxwords, int depth)
{
fprintf(p,"\t[%d..%d]:%x;\n",0,depth/2,0);
fprintf(p,"\t[%d..%d]:%x;\n",depth/2+1,depth-1,maxwords - 1);
return 1;
}
函数四、生成三角波mif文件
/*-----功能:三角波------*/
int triangle_wave(FILE *p,int maxwords,int depth)
{
int i=0,j=0,k=0;
k=2*(maxwords)/depth;
for(i=0,j=0;i<depth;i++)
{
fprintf(p,"\t%-6x:%x;\n",i,j);
if(i<depth/2)
{
j+=k;
}
else j-=k;
if(j>=maxwords)
{
j = maxwords-1;
}
}
return 1;
}
函数五、生成锯齿波mif文件
/*-----功能:锯齿波----*/
int sawtooth_wave(FILE*p,int maxwords,int depth)
{
int i=0,j=0,k=0;
k=(maxwords-1)/(depth-1);
for(i=0,j=0;i<depth;i++)
{
fprintf(p,"\t%-6x:%x;\n",i,j);
j+=k;
if(j>=maxwords)
{
j=maxwords-1;
}
}
return 1;
}
六、main函数
int main(int argc,char*argv[])
{
int width=8;//字位宽
int depth=256;//字深度
int maxwords = 0;//最大值
int choice =0;//波类型
FILE *fp;
char filename[128]={0};
char mif_name[128]={0};
printf( "Input filename:\n");
scanf("%s",filename);
sprintf(mif_name, "%s.mif",filename);
if (!(fp=fopen(mif_name,"w+")))
{
printf("open file error!\n");
return -1;
}
printf("\nInput word width:\n");//输入字位宽
scanf("%d", &width);
printf("Input word depth:\n");//输人字深度
scanf("%d" ,&depth);
printf("\nInput .mif mode\n [0] sine wave\n [1] cosine wave\n [2] square wave\n [3] triangle wave\n [4] sawtooth wave\n Your choice:");
scanf("%d",&choice) ;//选择产生波的类型
maxwords=1<<width;
fprintf(fp,"WIDTH=%d; \nDEPTH=%d; \n\nADRESS_ RADIX = HEX; \nDATA_ RADIX = HEX;\n\nCONTENT BEGIN\n",width,depth);//格式为十六进制
switch(choice)
{
case 1:cosine_wave(fp,maxwords,depth); break;
case 2:square_wave(fp,maxwords,depth); break;
case 3:triangle_wave(fp,maxwords,depth); break;
case 4:sawtooth_wave(fp,maxwords,depth); break;
default:sine_wave(fp,maxwords,depth);
}
fprintf(fp,"END;\n");
fclose(fp);
printf(".mif generated successfully!\n");
return 0;
}
注:以上代码主要参考了《计算机硬件技术基础实验教程》(方恺晴主编)里面的代码,但有所改进,主要是对于数据的输出改进为十六进制格式的输出,适用于Quatus 工程的直接调用。
七、代码改进
由于不同的芯片中存储器的字长宽度、存储单元的数量是不一样的,即width可能是8位、16位等,最大的depth也可能不一样。运行原程序时,当输入“width=8,depth=1024”时,生成的mif文件中的数据会是全为0,因为“k=2*(maxwords)/depth”这个语句已经限制了相邻数据之间的差值,这是源代码可以改进的地方,可以根据需求在生成mif文件时对以上代码进行个性化修改设计。以生成三角波、锯齿波mif文件为例,需要生成一个适用于“width=8,depth=1024”存储器的mif文件,可将在以上代码的基础上修改如下:
/*-----功能:三角波------*/
int triangle_wave(FILE *p,int maxwords,int depth)
{
int i=0,j=0,k=1;//自行设计k,即j自增/自减的步长
//k=2*(maxwords)/depth;
for(i=0,j=0;i<depth;i++)
{
fprintf(p,"\t%-6x:%x;\n",i,j);
//可根据自身输入的depth设定自增/自减条件,保证j小于256,即满足width=8此条件
if((i<depth/4)||(i>=depth/2&&i<3*depth/4))
{
j+=k;
}
else if((i>=depth/4&&i<depth/2)||(i>=3*depth/4))
{
j-=k;
}
if(j>=maxwords)
{
j = maxwords-1;
}
if(j<=0)
{
j=0;
}
}
return 1;
}
/*-----功能:锯齿波----*/
int sawtooth_wave(FILE*p,int maxwords,int depth)
{
int i=0,j=0,k=1;
//k=(maxwords-1)/(depth-1);
for(i=0,j=0;i<depth;i++)
{
fprintf(p,"\t%-6x:%x;\n",i,j);
j+=k;//设计数据增加的步长
if(j>=maxwords)
{
j=0;
//j=maxwords-1;
}
}
return 1;
}