栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

笔记: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=.outputoutfile.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 worldn");

  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 代码仅用于学习交流使用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/857170.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号