- added switch EB/EL to switch endianess
Committed on the Free edition of March Hare Software CVSNT Server. Upgrade to CVS Suite for more features and support: http://march-hare.com/cvsnt/ git-svn-id: http://moon:8086/svn/vhdl/trunk@439 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
@@ -3,11 +3,54 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#define INT8 char
|
||||||
|
#define INT16 short
|
||||||
|
#define INT32 long
|
||||||
|
#define UINT8 unsigned char
|
||||||
|
#define UINT16 unsigned short
|
||||||
|
#define UINT32 unsigned long
|
||||||
|
#define INT int
|
||||||
|
#define UINT unsigned int
|
||||||
|
#define FLOAT32 float
|
||||||
|
#define FLOAT64 double
|
||||||
|
|
||||||
#define ARCH_NAME "data"
|
#define ARCH_NAME "data"
|
||||||
#define ENT_NAME "rom"
|
#define ENT_NAME "rom"
|
||||||
#define JTAG_ADDR_WIDTH 16
|
#define JTAG_ADDR_WIDTH 16
|
||||||
|
|
||||||
|
UINT32 g_endianess_EB;
|
||||||
|
|
||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
|
UINT32 conv_endian32(UINT32 src)
|
||||||
|
{
|
||||||
|
UINT32 dst;
|
||||||
|
|
||||||
|
dst = (0xFF000000 & (src << 24))
|
||||||
|
| (0x00FF0000 & (src << 8))
|
||||||
|
| (0x0000FF00 & (src >> 8))
|
||||||
|
| (0x000000FF & (src >> 24));
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
};
|
||||||
|
|
||||||
|
UINT32 to_big_endian32(UINT32 src)
|
||||||
|
{
|
||||||
|
#ifndef NATIVE_IS_BIG_ENDIAN
|
||||||
|
return conv_endian32(src);
|
||||||
|
#else
|
||||||
|
return src;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 from_big_endian32(UINT32 src)
|
||||||
|
{
|
||||||
|
#ifndef NATIVE_IS_BIG_ENDIAN
|
||||||
|
return conv_endian32(src);
|
||||||
|
#else
|
||||||
|
return src;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void basename(char *pSrc, char *pDst)
|
void basename(char *pSrc, char *pDst)
|
||||||
{
|
{
|
||||||
int i, size;
|
int i, size;
|
||||||
@@ -90,7 +133,11 @@ int SaveROM(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntNa
|
|||||||
for (i=0; i < filesize; i += sizeof(int))
|
for (i=0; i < filesize; i += sizeof(int))
|
||||||
{
|
{
|
||||||
fread(&word, 1, sizeof(int), pFileIn);
|
fread(&word, 1, sizeof(int), pFileIn);
|
||||||
|
if (g_endianess_EB)
|
||||||
|
fprintf(pFileOut, "\t\tX\"%8.8X\"", to_big_endian32(word));
|
||||||
|
else
|
||||||
fprintf(pFileOut, "\t\tX\"%8.8X\"", word);
|
fprintf(pFileOut, "\t\tX\"%8.8X\"", word);
|
||||||
|
|
||||||
if (i < (romsize-sizeof(int)))
|
if (i < (romsize-sizeof(int)))
|
||||||
fprintf(pFileOut, ", -- %8.8X\n", i);
|
fprintf(pFileOut, ", -- %8.8X\n", i);
|
||||||
else
|
else
|
||||||
@@ -208,7 +255,11 @@ int SaveROM_V4LD(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *p
|
|||||||
for (i=0; i < filesize; i += sizeof(int))
|
for (i=0; i < filesize; i += sizeof(int))
|
||||||
{
|
{
|
||||||
fread(&word, 1, sizeof(int), pFileIn);
|
fread(&word, 1, sizeof(int), pFileIn);
|
||||||
|
if (g_endianess_EB)
|
||||||
|
fprintf(pFileOut, "\t\tX\"%8.8X\"", to_big_endian32(word));
|
||||||
|
else
|
||||||
fprintf(pFileOut, "\t\tX\"%8.8X\"", word);
|
fprintf(pFileOut, "\t\tX\"%8.8X\"", word);
|
||||||
|
|
||||||
if (i < (romsize-sizeof(int)))
|
if (i < (romsize-sizeof(int)))
|
||||||
fprintf(pFileOut, ", -- %8.8X\n", i);
|
fprintf(pFileOut, ", -- %8.8X\n", i);
|
||||||
else
|
else
|
||||||
@@ -314,6 +365,9 @@ int SaveROM_TCL(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pE
|
|||||||
for (i=0; i < filesize; i += sizeof(int))
|
for (i=0; i < filesize; i += sizeof(int))
|
||||||
{
|
{
|
||||||
fread(&word, 1, sizeof(int), pFileIn);
|
fread(&word, 1, sizeof(int), pFileIn);
|
||||||
|
if (g_endianess_EB)
|
||||||
|
fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, to_big_endian32(word));
|
||||||
|
else
|
||||||
fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, word);
|
fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, word);
|
||||||
word_addr++;
|
word_addr++;
|
||||||
}
|
}
|
||||||
@@ -345,14 +399,20 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: romgen <input file> <num. word address bits>\n");
|
fprintf(stderr, "Usage: romgen <input file> <num. word address bits> [{EL|EB}]\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pFilenameIn = argv[1];
|
pFilenameIn = argv[1];
|
||||||
if (argc == 3)
|
|
||||||
nbits_addr = atoi(argv[2]);
|
nbits_addr = atoi(argv[2]);
|
||||||
|
|
||||||
|
g_endianess_EB = 0;
|
||||||
|
if (argc == 4)
|
||||||
|
{
|
||||||
|
if ((toupper(argv[3][0]) == 'E') && (toupper(argv[3][1]) == 'B'))
|
||||||
|
g_endianess_EB = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
basename(pFilenameIn, name_prj);
|
basename(pFilenameIn, name_prj);
|
||||||
sprintf(name_rom, "%s.vhd", name_prj);
|
sprintf(name_rom, "%s.vhd", name_prj);
|
||||||
|
|||||||
Reference in New Issue
Block a user