笔记:soc最小系统(软硬件协同仿真)--插桩&hello

笔记:soc最小系统(软硬件协同仿真)--插桩&hello,第1张

笔记:soc最小系统(软硬件协同仿真)–插桩&hello

0.环境配置:quartus2 15.0+Modelsim10.4+keil5
1.插桩
功能:在完成最小系统的设计后,简单测试数据是否能够写入寄存器,以及uart能否打印hello
实现:先在keil和quartus2分别设计好软硬件工程,再将keil产生的bin/hex文件读到最小系统的sram中,最后通过Modelsim仿真查看波形与打印字符。
1.1 soc最小系统架构连接解析
下图是一个soc系统的结构图,我们即将按照这个架构连接soc中各个模块。

busmatrix 开启了三个端口(有3个slave),

在下面的代码中,slave0连接了sram,
slave1连接了ahb2apb,

apb连接上之后,开启apb的端口使能,apb有自己的slave,开启多选一选通器

uart挂在apb上,
CM3DS_MPS2.h文件Peripheral memory map 外设存储器映射定义了各个部分不同的位置定义
这里UART地址=0x40000000UL(apb_base)+0x4000UL

apb选通了psel4来挂。将各信号连接

2.最小系统仿真流程与现象
软件部分:添加头文件 底层驱动 库函数 主函数等 。keil配置环境后构建系统

不要在这里直接生成hex文件

用仿真器模拟debug

在此处配置即将写入数据的起始memory地址

fromelf.exe --vhx --8x1 --output=.\output\outfile.hex .\hello.axf
在这里生成outfile.hex文件,之后在tcl的sram中写入

#include "CM3DS_MPS2.h"
#include 
#include "uart_stdout.h"

int main (void)
{
	uint32_t* addr;
	
	addr = ((uint32_t*) 0x00009000UL);
  *addr = 0x12345678;
	
	addr = ((uint32_t*) 0x0000a000UL);
  *addr = 0x87654321;
	
  // UART init
  UartStdOutInit();

  printf("Hello world\n");

  printf("** TEST PASSED **\n");

  // End simulation
  UartEndSimulation();

  return 0;
}

上图是keil主函数,他有两个功能,
a. 插桩:在地址为0x00009000UL的位置上写入0x12345678,
b. uart功能开启,打印hello word和test passed

在该模块memfile写入产生的hex数据 “软件”即可在“硬件”中运行。

下图是定义在该模块下的仿真块,它的作用是通过位宽计算memory的大小,首先将寄存器内的数据都清零,然后将32位的软件数据分到4个8位的ram中(即实现一个memory读取的hex文件的 *** 作)

`ifndef SIMULATION
  integer i;
  localparam MEM_SIZE = 2**(AW+2);
  reg [7:0] fileimage [0:((MEM_SIZE)-1)];

  initial begin
    //  Initialize memory content to avoid X value on bus
    for (i = 0; i <= AWT; i=i+1)
      begin
        BRAM0[i] = 8'h00;
        BRAM1[i] = 8'h00;
        BRAM2[i] = 8'h00;
        BRAM3[i] = 8'h00;
      end

`ifndef RAMPRELOAD_SPI
  // Simulation
  $readmemh(MEMFILE, fileimage);
      // Copy from single array to splitted array
    for (i=0;i<(MEM_SIZE/4); i= i+1)
    begin
      BRAM3[i] = fileimage[i*4+3];
      BRAM2[i] = fileimage[i*4+2];
      BRAM1[i] = fileimage[i*4+1];
      BRAM0[i] = fileimage[i*4];

    end
`endif // RAMPRELOAD_SPI
  end
`endif // SIMULATION

modulsim仿真可得log如下图片打印出uart print的数据

图中UART0 TDX已经成功传输了内容

//************************************************************************************
说明:
1 代码可到我主页免费下载
2 代码仅用于学习交流使用

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/797826.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存