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

笔记: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 <stdio.h>
#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已经成功传输了内容
在这里插入图片描述

在这里插入图片描述
for循环里面的变量cnt你可以改为用integer定义,reg定义的好像不行,
尽量不要使用for语句,可以改为if语句,i,j的大小为if后的判定语句
//************************************************************************************
说明:
1 代码可到我主页免费下载
2 代码仅用于学习交流使用

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sr_shirui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值