微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于mc8051的modelsim仿真问题

关于mc8051的modelsim仿真问题

时间:10-02 整理:3721RD 点击:
在Oregano Systems官网上下了一个mc8051的软核,然后参考《在FPGA中嵌入8051核的详细方法和步骤》一文,在FPGA中进行验证,程序为对外部RAM的读写操作,通过signaltap查看,功能正确。然后就想通过modelsim_altera进行仿真,添加testbench之后,进行功能仿真时,出错,具体报错如下。





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


在下载的文件中,共有这么几个文件夹,其中msim是专门在modelsim中仿真的环境,运行脚本,软核也能跑起来。后来想跑一下自己的程序,在把hex文件转换为dua文件的时候,有点疑问,同样的hex文件,在FPGA上可以运行,但是转换为dua后在modelsim中却不能正常运行。如下几个文件是msim文件夹中的文件以及说明。

  1. hex2dual.c ......... C source code for a program to convert a Intel hex file into a text file
  2.                      containing binary entries, 8 bit per line.
  3. keil.dua ........... Converted output file from KEIL simulator containing binary data, 8 bit
  4.                      per line.
  5. keil.hex ........... Output file from KEIL simulator after executing the tc1.asm program.
  6.                      (Caution: The KEIL software adds a line at the beginning of this file, which
  7.                      is not needed - it has to be deleted manually before conversion with hex2dual
  8.                      to have identical files.)
  9. mc8051_compile.do .. Compile script for modelsim.
  10. mc8051_rom.dua ..... Textfile containing the ROM contents for VHDL code simulation.
  11. mc8051_sim.do ...... Simulation script for modelsim.
  12. mc8051_wave.do ..... Wave file for modelsim.
  13. readme.txt ......... This file. Descriptions to ease verification.
  14. regs.log ........... Ouput file after executing the write2gfile.do Tcl script in modelsim.
  15. tc1.asm ............ 8051 assembler program.
  16. tc1.dua ............ Converted 8051 program (can be copied to mc8051_rom.dua).
  17. tc1.hex ............ 8051 program in Intel hex format.
  18. 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)空语句,如此,程序运行结果只会输出一次。不明白为什么会这样子?求解。

  1. #include <reg51.h>
  2. #define XBYTE ((char*)0x20000L)

  3. unsigned char DATAO;

  4. void main()
  5. {
  6.         XBYTE[0x0001] = 0x55;
  7.         XBYTE[0x0002] = 0x35;
  8.         XBYTE[0x0003] = 0x47;
  9.         XBYTE[0x0004] = 0x5F;
  10.         XBYTE[0x0005] = 0xB5;
  11.         XBYTE[0x0006] = 0xAA;
  12.         XBYTE[0x0007] = 0x97;
  13.         XBYTE[0x0008] = 0x17;

  14.         DATAO = XBYTE[0x0001];
  15.         DATAO = XBYTE[0X0003];
  16.         DATAO = XBYTE[0X0005];
  17.         DATAO = XBYTE[0X0007];
  18.        
  19.         while(1);       
  20. }

复制代码



   把系统做到一块了,两个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

好复杂啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top