hex2v.c
上传用户:bltddc
上传日期:2020-07-09
资源大小:4428k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

VHDL

  1. // // Copyright (c) 1999 Thomas Coonan (tcoonan@mindspring.com) // //    This source code is free software; you can redistribute it //    and/or modify it in source code form 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 // // Intel HEX to Verilog converter. // // Usage: //    hex2v <file> // // You probably want to simply redirect the output into a file. // #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // Input and Output file streams.
  5. FILE *fpi;
  6. // Well.. Let's read stuff in completely before outputting.. Programs
  7. // should be pretty small..
  8. //
  9. #define MAX_MEMORY_SIZE  1024
  10. struct {
  11.    unsigned int  nAddress;
  12.    unsigned int  byData;
  13. } Memory[MAX_MEMORY_SIZE];
  14. char szLine[80];
  15. unsigned int  start_address, address, ndata_bytes, ndata_words;
  16. unsigned int  data;
  17. unsigned int  nMemoryCount;
  18. int main (int argc, char *argv[])
  19. {
  20.    int  i;
  21.    if (argc != 2) {
  22.       printf ("nThe Synthetic PIC --- Intel HEX File to Verilog memory file");       printf ("nUsage: hex2verilog <infile>");       printf ("n");       return 0;    }
  23.    // Open input HEX file
  24.    fpi=fopen(argv[1], "r");    if (!fpi) {       printf("nCan't open input file %s.n", argv[1]);
  25.       return 1;
  26.    }
  27.    // Read in the HEX file
  28.    //
  29.    // !! Note, that things are a little strange for us, because the PIC is
  30.    //    a 12-bit instruction, addresses are 16-bit, and the hex format is
  31.    //    8-bit oriented!!
  32.    //
  33.    nMemoryCount = 0;
  34.    while (!feof(fpi)) {
  35.       // Get one Intel HEX line
  36.       fgets (szLine, 80, fpi);
  37.       if (strlen(szLine) >= 10) {
  38.          // This is the PIC, with its 12-bit "words".  We're interested in these
  39.          // words and not the bytes.  Read 4 hex digits at a time for each
  40.          // address.
  41.          //
  42.          sscanf (&szLine[1], "%2x%4x", &ndata_bytes, &start_address);
  43.          if (start_address >= 0 && start_address <= 20000 && ndata_bytes > 0) {
  44.             // Suck up data bytes starting at 9th byte.
  45.             i = 9;
  46.             // Words.. not bytes..
  47.             ndata_words   = ndata_bytes/2;
  48.             start_address = start_address/2;
  49.             // Spit out all the data that is supposed to be on this line.
  50.             for (address = start_address; address < start_address + ndata_words; address++) {
  51.                // Scan out 4 hex digits for a word.  This will be one address.
  52.                sscanf (&szLine[i], "%04x", &data);
  53.                // Need to swap bytes...
  54.                data = ((data >> 8) & 0x00ff) | ((data << 8) & 0xff00);
  55.                i += 4;
  56.                // Store in our memory buffer
  57.                Memory[nMemoryCount].nAddress = address;
  58.                Memory[nMemoryCount].byData   = data;
  59.                nMemoryCount++;
  60.             }
  61.          }
  62.       }
  63.    }
  64.    fclose (fpi);
  65.    // Now output the Verilog $readmemh format!
  66.    //
  67.    for (i = 0; i < nMemoryCount; i++) {
  68.       printf ("n@%03X %03X", Memory[i].nAddress, Memory[i].byData);    }
  69.    printf ("n");
  70. }