#include <stdio.h>
 
#include <stdlib.h>
 
 
 
 
 
int emit_header(FILE * infile, int abits);
 
int emit_body(FILE * infile, FILE * outfile, int inlen, int abits);
 
int emit_footer(FILE * infile);
 
 
 
 
 
int main( int argc, char* argv[] )
 
{
 
        int error=0;
 
 
 
        FILE * infile=NULL;
 
        FILE * outfile=NULL;
 
 
 
        int inlen;
 
        int abits;
 
        int temp;
 
 
 
        if( argc!=3 )
 
        {
 
                printf("usage: bin2v <infile> <outfile>\n\n");  
                error++;
 
        }
 
 
 
        if( !error )
 
        {
 
                if( !(infile
=fopen(argv
[1],"rb")) )  
                {
 
                        printf("cant open infile!\n");  
                        error++;
 
                }
 
        }
 
 
 
        if( !error )
 
        {
 
                if( !(outfile
=fopen(argv
[2],"wt")) )  
                {
 
                        printf("cant open outfile!\n");  
                        error++;
 
                }
 
        }
 
 
 
        if( !error )
 
        {
 
                if( fseek(infile
,0,SEEK_END
) )  
                {
 
                        printf("Cannot fseek() infile!\n");  
                        error++;
 
                }
 
        }
 
 
 
        if( !error )
 
        {
 
                inlen
=(int)ftell(infile
); 
 
 
                if( inlen==(-1L) )
 
                {
 
                        printf("Cannot ftell() length of infile!\n");  
                        inlen=0;
 
                        error++;
 
                }
 
        }
 
 
 
        if( !error )
 
        {
 
                if( !inlen )
 
                {
 
                        printf("Infile is zero length!\n");  
                        error++;
 
                }
 
        }
 
 
 
        if( !error 
&& fseek(infile
,0,SEEK_SET
) )  
        {
 
                printf("Cannot fseek() infile!\n");  
                error++;
 
        }
 
 
 
 
 
        if( !error )
 
        {
 
                // how many address bits to use
 
                temp=inlen-1;
 
                abits=1;
 
                while( temp>>=1 ) abits++;
 
        }
 
 
 
 
 
        if( !error ) error+=emit_header(outfile, abits);
 
 
 
        if( !error ) error+=emit_body(infile, outfile, inlen, abits);
 
 
 
        if( !error ) error+=emit_footer(outfile);
 
 
 
 
 
 
 
 
 
 
 
        if( outfile 
) fclose(outfile
);  
 
 
        return error;
 
}
 
 
 
int emit_body(FILE * infile, FILE * outfile, int len, int bits)
 
{
 
        int i;
 
        unsigned char b;
 
 
 
        for(i=0;i<len;i++)
 
        {
 
                if( 1==fread(&b
,1,1,infile
) )  
                {
 
                        if( b!=0xFF )
 
                                fprintf(outfile
, "\t\t%d'h%X: out_word = 8'h%02X;\n", bits
,i
,(int)b
);  
                }
 
                else // error reading byte
 
                {
 
                        return 1;
 
                }
 
        }
 
 
 
        return 0;
 
}
 
 
 
 
 
int emit_header(FILE * file, int abits)
 
{
 
 
 
 
 
        fprintf(file
,"\tinput  wire [%2d:0] in_addr,\n\n",abits
-1);  
 
 
        fprintf(file
,"\toutput reg  [ 7:0] out_word\n\n");  
 
 
 
 
 
 
        fprintf(file
,"\tcase( in_addr )\n\n");  
 
 
        return 0;
 
}
 
 
 
int emit_footer(FILE * file)
 
{
 
        fprintf(file
,"\n\t\tdefault: out_word = 8'hFF;\n\n");  
 
 
 
 
 
 
        return 0;
 
}