目录

momo-simulator

对标 Proteus 的 mini 版 MCU 仿真模拟器:多架构 CPU 指令级仿真 + 虚拟终端 + 虚拟屏幕。

momo-simulator 是一个用 C11 + xmake + SDL2 实现的教学/演示型 MCU 仿真器。它在单一进程内完成「取指-译码-执行」的指令级仿真,并通过引脚级网络表(netlist)把 CPU 与外设、虚拟器件互联,模拟 Proteus 风格的硬件电路仿真体验。

特性

  • CPU 仿真:RV32I(+M) 指令集,顺序流水线模型;x0 恒零、CSR(mstatus/mie/mip/mtvec/mepc/mcause)、非法指令陷阱。可插拔多架构框架(后续扩展 Cortex-M0 / RV64I)。
  • 外设:UART / SPI / I2C / GPIO,以 MMIO 方式接入 SoC。
  • 虚拟终端:UART 输出实时渲染为可滚动的字符终端。
  • 虚拟屏幕:SSD1306(128×64 单色 OLED,I2C 总线),带整数缩放与屏幕配置对话框。
  • 网络表工程*.net 文本工程文件描述器件与连线;附带纯前端 HTML 设计器可视化拖拽连线并导出。
  • 图形界面:SDL2 双栏布局(左=虚拟终端+寄存器查看器,右=虚拟屏幕);实时寄存器查看器、七档仿真速度调节、屏幕 I2C 地址配置模态框。
  • 自研工具链tools/rv32asm.py 迷你 RV32 汇编器(本机无 RISC-V 交叉编译器时用于生成固件 .bin)。
  • 测试:8 个 xmake 测试 target 全部通过。

架构

分层结构(自下而上):

src/core/     CPU(RV32)、内存、中断控制器、定时器
src/periph/   UART / SPI / I2C / GPIO 外设模型
src/devices/  虚拟终端、虚拟屏幕、SSD1306 器件驱动
src/sim/      事件队列(evq)、引脚网络表(net)、SoC 互联、netlist 工程解析
src/gui/      SDL2 界面(工具栏、窗口、寄存器面板、屏幕面板)
src/utils/    HEX 解析、日志、公共类型

仿真原理对标 Proteus:

  • 周期推进:CPU 每帧执行若干周期(sim_run 按速度档位推进 cycles/frame)。
  • 事件队列evq 按时间戳分发定时/外设事件。
  • 引脚级总线互联net 模块实现引脚-网络表的电平传播,CPU 与外设通过地址解码 + MMIO 读写交换数据。

目录结构

momo-simulator/
├── src/                 # 源码(core/periph/devices/sim/gui/utils)
├── tests/               # 单元/冒烟测试(8 个 target)
│   ├── fixtures/        # 测试固件/数据
│   ├── rv32_unit.c      # RV32 指令级单测
│   ├── unit_net.c       # 引脚网络表单测
│   └── smoke_*.c        # 各模块冒烟测试
├── examples/
│   ├── fw/              # 示例固件(.S 源 + .bin)
│   └── projects/        # 示例 netlist 工程(.net)
├── tools/
│   ├── rv32asm.py            # RV32 迷你汇编器
│   └── netlist-editor.html   # 网络表可视化设计器
├── thirdparty/          # SDL2 / SDL2_ttf 预编译包(mingw x86_64)
├── xmake.lua
└── README.md

构建

依赖:

  • mingw-w64 工具链(本项目在 D:/msys64/mingw64 下验证)
  • xmake 构建工具
  • SDL2 / SDL2_ttf(已放入 thirdparty/,无需系统安装;xrepo 源码安装在本环境有 cmake 路径 bug,故采用官方 mingw 预编译包手动管理)
# 配置 mingw 工具链(仅需一次,结果缓存在 .xmake/)
xmake f -p mingw --mingw="D:/msys64/mingw64" -y

# 构建模拟器本体
xmake build momosim

构建产物:build/mingw/x86_64/debug/momosim.exe(SDL2.dll 自动从 thirdparty 拷贝)。

运行

# 直接运行(默认加载 examples/fw/hello.bin,加 --auto-run 自动启动仿真)
build/mingw/x86_64/debug/momosim.exe --auto-run

# 指定固件
build/mingw/x86_64/debug/momosim.exe --auto-run examples/fw/hello.bin

# 加载网络表工程(SSD1306 屏幕示例)
build/mingw/x86_64/debug/momosim.exe --netlist examples/projects/ssd1306.net --auto-run

界面操作:

  • 工具栏:运行 / 暂停 / 复位 / 单步;右侧速度 [- | 档位 | +] 与「寄存器」开关(关闭后左栏终端占满)。
  • 屏幕面板右上角 :打开配置对话框,可切换 SSD1306 的 I2C 地址(0x3C ↔ 0x3D),点「应用」实时生效。

固件汇编

本机若没有 RISC-V 交叉编译器,使用自研迷你汇编器生成固件:

python tools/rv32asm.py examples/fw/hello.S   -o examples/fw/hello.bin
python tools/rv32asm.py examples/fw/ssd1306.S -o examples/fw/ssd1306.bin

汇编器支持 RV32I(+M) 子集与常用伪指令,两遍汇编,输出小端 .bin

网络表设计器

用浏览器打开 tools/netlist-editor.html,拖拽器件、连线,导出 .net 工程文件,再用 --netlist 加载到模拟器。

测试

8 个 xmake 测试 target 全部通过:

target 覆盖
momosim-tests CPU 冒烟(add 固件端到端)
momosim-tests-periph 外设(UART/SPI/I2C/GPIO)
momosim-tests-screen 虚拟屏幕 / SSD1306 模型
momosim-tests-fw 固件端到端(UART 打印)
momosim-tests-fw-screen 固件 + 屏幕联合
momosim-tests-netlist netlist 解析
momosim-tests-rv32 RV32 指令级单测(R/I/S/B/U/J 型、CSR、陷阱、M 扩展)
momosim-tests-net 引脚网络表单测
xmake build -a          # 构建全部 target
for t in momosim-tests momosim-tests-periph momosim-tests-screen \
         momosim-tests-fw momosim-tests-fw-screen momosim-tests-netlist \
         momosim-tests-rv32 momosim-tests-net; do
    xmake run $t
done

开发路线

  • Phase 0–3:工程骨架、RV32I CPU、外设、虚拟终端、RV32 汇编器、固件端到端
  • Phase 4:虚拟屏幕(SSD1306)
  • Phase 5:网络表(netlist)解析 + HTML 设计器
  • Phase 6:仿真控制完善(寄存器查看器 + 速度调节)
  • Phase 7 / #13:屏幕配置模态对话框
  • 16:单测完善(RV32 指令级 + net 引脚网表)

  • 19:扩展 CPU — Cortex-M0(Thumb 指令集)

  • 20:扩展 CPU — RV64I

  • 18:README + GitLink 托管

托管

本项目托管于 GitLink:https://gitlink.org.cn/ltree/momo-simulator

许可证

本项目采用 MIT 许可证

关于

一个arm, risc-v 单片机模拟器

20.0 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号