⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dapkg_gen.c

📁 算术处理器的VERILOG hdl的源代码
💻 C
字号:
/* dapkg_gen -- Distributed Arithmetic package generator * Copyright (C) 2001 Jamil Khatib * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */      /* This program generates the DApkg.vhd file that is used to define  * the DA filter core and gives its parameters and the contents of the  * Distributed Arithmetic Look-up-table "DALUT" according to the DA algorithm *//* * * To compile the program do: gcc -o DApkg_gen DApkg_gen.c * */                                                                    /*  INCLUDES */#include <stdio.h>/*  DEFINES  */#define MAXTAPS 64		 		/* Maximum number of taps */#define MAXWORDSIZE 64   		/* Maximum word size      */#define MAXROMSIZE pow2(MAXTAPS)/* Maximum ROM size	      */void tobinstr(unsigned int ,unsigned int ,char * );unsigned int pow2(unsigned int );void generate_LUT(unsigned int [] , unsigned int []  ,unsigned int );/* Main function */    main(int argc,char **argv){    unsigned int taps = 0;  unsigned int word_size = 0;  unsigned int constants[MAXTAPS];  unsigned int constants_table[MAXROMSIZE];    char binary_num[MAXWORDSIZE+3];  unsigned int rom_size = 0;    int i =0;    FILE * f;    printf("\n*********DApkg.vhd generator**********\n");  printf("\nEnter word size ");  scanf("%d",&word_size);     if( word_size <= 0 )    {      printf("Negative numbers are not allowed\n");      exit(1);          }    printf("\nEnter no. of filter taps ");  scanf("%d",&taps);    if( taps <= 0 )    {      printf("Negative numbers are not allowed\n");      exit(1);          }  rom_size = pow2(taps); /* Calculate rom size */             printf("\nEnter filter constants starting from tap[0]");        for( i =0;i < taps; i++)       {         printf("\n[%d]:",i);         scanf("%d",&constants[i]);                  if(constants[i] >= (pow2(word_size)))           {             printf("[Error]: large constant >= [%d]\n",pow2(word_size));             exit(1);                                     }                         }     printf("\nFilter information\n");  printf("\nFilter taps = [%d]",taps);  printf("\nWord size = [%d]",word_size);  printf("\nFilter constants\n");  for( i =0; i< taps; i++)  {    printf("\n[%d]:[%d]",i,constants[i]);      }  printf("\n");  printf("\nLUT contents\n"); /* Calculate LUT contents */  generate_LUT(constants, constants_table ,taps);           f = fopen("DApkg.vhd","w+");  fprintf(f,"--------------------------------------------------------------------------------- Title      :Distributed Arithmetic Package-- Project    : Arithmetic blocks--------------------------------------------------------------------------------- File        : DApkg.VHD-- Author      : Jamil Khatib  -- Organization: OpenIPCore Project-- Created     : 2001/04/17-- Last update : 2001/04/17-- Platform    : -- Simulators  : Modelsim 5.3XE / Windows98-- Synthesizers: Leonardo / WindowsNT-- Target      : -- Dependency  : --------------------------------------------------------------------------------- Description: Distributed Arithmetic Package--------------------------------------------------------------------------------- Copyright (c) 2001 Jamil Khatib-- -- This VHDL design file is an open design; you can redistribute it and/or-- modify it and/or implement it under the terms of the Openip General Public-- License as it is going to be published by the OpenIPCore Organization and-- any coming versions of this license.-- You can check the draft license at-- http://www.opencores.org/OIPC/license.html--------------------------------------------------------------------------------- Revisions  :-- Revision Number :   1-- Version         :   0.1-- Date            :   17th Apr 2001-- Modifier        :   Jamil Khatib (khatib@ieee.org)-- Desccription    :   Created----------------------------------------------------------------------------------- Revisions  :-- Revision Number :   2-- Version         :   0.2-- Date            :   30h Apr 2001-- Modifier        :   Jamil Khatib (khatib@ieee.org)-- Desccription    :   defining the constant CONSTANTS for DALUT contents--					   which should be genrated automatically in later versions----------------------------------------------------------------------------------- This file was generated by DApkg_gen binary toollibrary ieee;use ieee.std_logic_1164.all;package DApkg is  constant BUFFER_SIZE : integer := %d;  -- No. of inputs, No of filter taps,                                        -- No. of constants , Buffer Size  constant DATA_SIZE   : integer := %d;  -- Word size  type TABLE is array ( 0 to (2**BUFFER_SIZE) -1) of std_logic_vector((DATA_SIZE -1 ) downto 0);                                        -- Memory type  constant CONSTANTS : TABLE := (\n\n",taps,word_size);  /**************************************/  /* write teh LUT contents into the file */ for(i = 0; i < rom_size-1 ;i++) {     tobinstr(constants_table[i],word_size,binary_num);     printf("\nDALUT[%d] = [%d]   %sb",i,constants_table[i],binary_num);     fprintf(f,"   %s,\n",binary_num);      }  tobinstr(constants_table[i],word_size,binary_num); printf("\nDALUT[%d] = [%d]   %sb",i,constants_table[i],binary_num); fprintf(f,"   %s\n",binary_num);  /************************************/ fprintf(f,"\n);\n--------------------------------------------------------------------------------- DA filter top core  component DA    generic (      NOINPUTS  :     integer := BUFFER_SIZE;  -- number of inputs, no. of filter taps      WORD_SIZE :     integer := DATA_SIZE;  -- word size      CONTENTS  :     TABLE   := CONSTANTS);    port (      data      : in  std_logic_vector(WORD_SIZE -1 downto 0);  -- input data      Clk       : in  std_logic;        -- system clock      Rst_n     : in  std_logic;        -- System reset      Result    : out std_logic_vector(WORD_SIZE -1 downto 0);  -- Result      ValidOut  : out std_logic;        -- Output valid      Overflow  : out std_logic);       -- Overflow signal  end component;--------------------------------------------------------------------------------- DALUT Distributed Arithmetic Lookup table  component DALUT    generic (      ADDR_SIZE   : integer;                   --:= BUFFER_SIZE;      -- LUT address size or number of input terms      OUTPUT_SIZE : integer;  --:= DATA_SIZE;  -- Output size      CONTENTS    : TABLE                      -- CONSTANTS      -- These values should be generated automaticlly from the original      -- constants of the filter      );    port (      Address : in  std_logic_vector(ADDR_SIZE -1 downto 0);  -- DALUT Address      Result  : out std_logic_vector(OUTPUT_SIZE -1 downto 0));  -- Result  end component;  ------------------------------------------------------------------------------end DApkg;package body DApkg isend DApkg;");   fclose(f);    printf("\nDApkg.vhd is generated\n");      return 0;  }/****************************************************************** * void tobinstr(unsigned int num,unsigned int size,char * str)    * * tobinary converts from number to binary representation string  * * Inputs: * num : the number to be converted * size: number of bits in the binary number * str: string buffer to store the converted number  ******************************************************************/void tobinstr(unsigned int num,unsigned int size,char * str){  unsigned int i = size;    unsigned int tmp =0;    str[0] = '"';  str[size +1] = '"';  str[size+2] = NULL;    for (i=size; i > 0 ; i--)    {	        	 tmp = num & 0x1;              switch(tmp)     {       case 0:           str[i] = '0';           break;         case 1:             str[i] = '1';             break;         default :             printf("\n!!!!!!!!! Illegal number conversion !!!!!!!!!!\n");             exit(1);	 }		      num = num >> 1;          }    return ;  }/****************************************************************** * unsigned int pow2(unsigned int num) * * pow2  calculates 2^num  * * Inputs: * num : the power ******************************************************************/unsigned int pow2(unsigned int num){    unsigned int res = 1;    int i=0;        for(i = 0; i < num; i++)    {        res = 2 * res;                    }    return res;    }/****************************************************************** * void generate_LUT(unsigned int  consts[], unsigned int  rom[],unsigned int num_const) * * Generates the LUT (rom) contents * * Inputs: * consts[] : Filter's constants * rom[]    : Array to store the LUT constants  * num_const: Number of filter's constants *  ******************************************************************/void generate_LUT(unsigned int  consts[], unsigned int  rom[],unsigned int num_const){    unsigned int i= 0;    unsigned int j = 0;    unsigned int max_addr = pow2(num_const);    unsigned int flag = 0;    unsigned index = 0;            for (i= 0;i < max_addr; i++)/* i = rom address*/    {        index = i;        rom[i] = 0;                for (j = 0; j < num_const; j++)        {            flag = 0x1 & index;  /* Mask the first bit*/            rom[i] = rom [i] + ( consts[j] * flag);                        index >>=1; /* get next bit in the address*/                    }                    }            return ;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -