关于mc8051的modelsim仿真问题

不太理解为何是在这里报错,暂时没找到方法,因而通过其他方法,直接在modelsim中仿真。

在下载的文件中,共有这么几个文件夹,其中msim是专门在modelsim中仿真的环境,运行脚本,软核也能跑起来。后来想跑一下自己的程序,在把hex文件转换为dua文件的时候,有点疑问,同样的hex文件,在FPGA上可以运行,但是转换为dua后在modelsim中却不能正常运行。如下几个文件是msim文件夹中的文件以及说明。
- hex2dual.c ......... C source code for a program to convert a Intel hex file into a text file
- containing binary entries, 8 bit per line.
- keil.dua ........... Converted output file from KEIL simulator containing binary data, 8 bit
- per line.
- keil.hex ........... Output file from KEIL simulator after executing the tc1.asm program.
- (Caution: The KEIL software adds a line at the beginning of this file, which
- is not needed - it has to be deleted manually before conversion with hex2dual
- to have identical files.)
- mc8051_compile.do .. Compile script for modelsim.
- mc8051_rom.dua ..... Textfile containing the ROM contents for VHDL code simulation.
- mc8051_sim.do ...... Simulation script for modelsim.
- mc8051_wave.do ..... Wave file for modelsim.
- readme.txt ......... This file. Descriptions to ease verification.
- regs.log ........... Ouput file after executing the write2gfile.do Tcl script in modelsim.
- tc1.asm ............ 8051 assembler program.
- tc1.dua ............ Converted 8051 program (can be copied to mc8051_rom.dua).
- tc1.hex ............ 8051 program in Intel hex format.
- write2file.do ...... Tcl script to write signal values to a text file.
上面这些叙述中,keil.hex中说,KEIL软件生成的hex文件会在起始添加一行,应手动删除,这个不太理解啊。不明白为何要删除呢?删除什么呢?同样的hex文件,在FPGA上为何没有问题呢?那究竟要如何正确的转换为dua呢?好多疑问。
还有这些文件,tc1.hex和keil.hex,tc1.dua和keil.dua有区别吗?tc1.asm编译后生成tc1.hex,再转换成tc1.dua,上述又说,keil.hex是tc1.asm在KEIL里运行输出的hex文件,应该删除一行,why?好糊涂。求助论坛朋友帮忙啊!在此先谢过了!


自己顶一下!求助!
更新一下,昨晚不知什么缘故,仿真结果不对,今天重新试试,却又可以了。至于keil.hex描述中所提到的要删掉一行之类的没考虑。另外,程序运行的时候,如果对外部RAM读写操作的话,程序会一直重复执行,除非在程序后面加一条while(1)空语句,如此,程序运行结果只会输出一次。不明白为什么会这样子?求解。
- #include <reg51.h>
- #define XBYTE ((char*)0x20000L)
- unsigned char DATAO;
- void main()
- {
- XBYTE[0x0001] = 0x55;
- XBYTE[0x0002] = 0x35;
- XBYTE[0x0003] = 0x47;
- XBYTE[0x0004] = 0x5F;
- XBYTE[0x0005] = 0xB5;
- XBYTE[0x0006] = 0xAA;
- XBYTE[0x0007] = 0x97;
- XBYTE[0x0008] = 0x17;
- DATAO = XBYTE[0x0001];
- DATAO = XBYTE[0X0003];
- DATAO = XBYTE[0X0005];
- DATAO = XBYTE[0X0007];
-
- while(1);
- }
把系统做到一块了,两个mcu,各自进行软件开发,最后互联进行通信。依然存在问题,函数调用后无法返回,一直重复执行,类似楼上问题,实在想不明白了。会不会是mc8051附带的hex2dua函数的问题?打算近期研究下软件的汇编代码,看看hex2dua函数,不知道能否找到突破。
经过刚刚的试验发现,官网下载的mc8051\Oregano Systems\mc8051_design_v1.6\Version1_6\msim\hex2dual.c文件在转换hex文件的时候出错,对比Keil汇编代码、hex2dual.c转换后的dua文件、自己根据汇编代码手动生成的dua文件时,结合仿真结果,发现hex2dual.c生成的dua文件并没有考虑起始地址的问题。
hex文件以每一行以冒号开头;第一个字节 表示本行数据的长度;第二、三字节表示本行数据的起始地址;第四字节表示数据类型;接下来是数据;最后一字节为校验和。hex文件以行为单位,每一行包含地址信息,但是并没有按照地址顺序存储。而hex2dual.c在转换的时候没有考虑地址,仅按照hex文件每行的存储顺序进行转换,依次往下,因而造成程序执行的错误。
之前的简单实验可行的原因在于,程序代码简单,仅为对外部ramx的写操作,恰好其汇编代码在hex文件中在第一行,因而执行结果看似无误。后来将对外部ramx写操作作为一个外部函数进行调用,发现执行结果始终是对该地址重复写,查看hex2dual.c转换后的dua文件,发现程序0x0000位置并非主程序入口,也非8051初始化程序,而直接为调用的子函数机器码,在执行到RET指令时,由于没有主函数,因此反复执行了该子函数,另一方面,通过查看对应hex文件,发现该子函数汇编代码恰好在第一行,更佐证了hex2dual.c文件转换结果错误的事实。
昨晚仔细研究了下下载包里自带的hex2dual.c程序,发现确实是上述问题,忽略了程序地址,忽略了NOP指令占据代码段的事实。已修改,可正确转换并进行仿真。have a look
好复杂啊
- #include <reg51.h>
