波形MIF文件生成器(C语言)

写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步!

波形MIF文件生成代码

函数一、生成正弦波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;
}

猜你喜欢

转载自blog.csdn.net/qq_45909595/article/details/115690904