Synth Daily

从零开始自主设计的开源掌上游戏机 RISCBoy

RISCBoy 是一个从零开始设计的开源掌上游戏机项目。它包含一个兼容 RISC-V 的 CPU、图形处理单元以及完整的芯片基础设施,旨在重现一个“假如 RISC-V 在 2001 年就已存在”的 Gameboy Advance。整个设计基于 Verilog 语言,并计划部署在 iCE40-HX8k FPGA 上,所有相关硬件和软件资源均已开源。

这既是写给我童年时代掌上游戏机的一封情书,也是在凌晨三点醉意朦胧时,发给那些驱动了它们的技术的一条信息。

核心技术组件

RISCBoy 的设计完全从零开始,包含了一台游戏主机所需的所有关键部分:

  • 一个兼容 RV32IMC 指令集的 RISC-V 处理器。
  • 一个光栅图形管线和显示控制器。
  • 其他芯片基础设施,如总线、内存控制器、UART、GPIO 等。
  • 使用 KiCad 设计的 PCB 布局。

整个设计采用可综合的 Verilog 2005 编写,目标是适配 iCE40-HX8k FPGA。这款 FPGA 拥有 7680 个逻辑单元,要把一个 32 位的游戏机塞进去,需要非常精巧的设计。

如何获取项目

该项目仓库使用了子模块(submodules)来管理硬件描述语言(HDL)和测试文件。

  • 推荐的克隆方式: git clone --recursive https://github.com/Wren6991/RISCBoy.git riscboy

  • 或者分步操作: git clone https://github.com/Wren6991/RISCBoy.git riscboy cd riscboy git submodule update --init --recursive

注意: 必须使用 --recursive 参数才能完整地运行处理器的独立测试。

构建编译工具链

编译软件测试用例需要 RV32IMC 工具链。你可以遵循 RISC-V GNU Toolchain GitHub 上的说明进行安装,但配置步骤有所不同。

  • 最重要的配置参数如下: ./configure --prefix=/opt/riscv --with-arch=rv32imc --with-abi=ilp32 --with-multilib-generator="rv32i-ilp32--;rv32ic-ilp32--;rv32im-ilp32--;rv32imc-ilp32--"

  • 这个配置确保编译器能为 RISCBoy 支持的所有指令集变体(如 RV32I 或 RV32IMC)生成正确的标准库。在 RV32I-only 的处理器上运行链接了 RV32IMC 标准库的程序会导致严重错误。

仿真与测试

仿真流程由 Xilinx ISIM 14.x 驱动,相关的 makefile 文件位于 scripts/ 目录下。

  • 运行所有 HDL 测试: cd test ./runtests

  • 进行图形化调试: 若要对某个特定测试(如 helloworld)进行图形化调试,可以直接运行其 makefile: cd system make TEST=helloworld gui

硬件设计 (PCB)

目前的 A 版 PCB 兼容 iTead 的 4 层 5x5 厘米原型服务。在硬件和引导程序成熟之前,B 版的设计不会启动。目前的开发硬件看起来更像 Snowflake FPGA 开发板。

FPGA 综合

FPGA 综合使用的是一套开源工具链,你需要先构建它们:

  • Yosys:用于逻辑综合。
  • nextpnr:用于布局布线。
  • Project Icestorm:用于生成比特流文件。

工具链准备就绪后,运行以下命令即可为 Lattice HX8k 评估板生成 FPGA 镜像:

cd synth make -f HX8k-EVN.mk bit

项目目录结构

  • board: 存放 RISCBoy 主 PCB 和其他开发板的 KiCad 文件。
  • doc: 文档的 LaTeX 源码、图表和 PDF 文件。
  • hdl: RISCBoy 门级电路的 Verilog 源码。
    • hazard5: 完全独立的 RISC-V 处理器源码。
    • graphics: 像素处理单元的源码。
    • peris: UART、SPI 等小型外设。
  • scripts: 其他辅助脚本。
  • software: 用于系统级测试的 C 语言文件集合。
  • synth: 用于运行全系统综合的工作目录,包含顶层 makefile 和引脚约束文件。
  • test: 回归测试集合,包括 Verilog 测试平台和软件测试用例。