An FPGA-based RISC-V CPU.
本项目为 2020 年数字电路实验的期末大实验。由 李晗 @Undefined01 和 高灏 @UYTFVBNJ 共同开发。
本项目实现了基于 RISC-V
指令集的 CPU (RV32I
),并针对 Cyclone 5CSXFC6D6F31C6
开发板实现了相应的外设模块。
CPU 可以通过 MMIO 的方式对外设进行控制并运行具有一定实用性的程序。
Quartus 项目位于 fpga 目录。
设计源文件主要位于 fpga/src 目录。
-
CPU 频率: 50MHz
-
上电启动地址: 0x00000000 (非标准)
-
内存大小: 64KB (定义于 common.v)
-
指令集: RV32I (未实现特权相关指令,如
ecall
和sret
。未实现非四字节内存访问,如lb
,sh
等等。设计程序时应总是使用int
等四字节变量。) -
内置固件: firmware/final (定义于 perip.v)
-
MMIO: 定义于 common.v ,在 perip.v 中进行转发。具体映射如下:
Address Description 0x00000000 - 0x10000000 内存。仅使用开头到实际内存大小的段。指令、数据等均存放在内存中。 0xa0000000 - 0xa1000000 字符显存。仅使用开头到实际显存大小的段。向此处写入字符的 ASCII
码即可被自动显示在屏幕上。0xa1000010 - 0xa1000020 键盘。仅使用第一个四字节。从此处读取键盘事件。 0xa1000020 - 0xa1000030 启动时间。仅使用前两个四字节。从此处读取以小端序保存、 8 字节的、以微秒计的启动时间。
测试激励模块和简易测试用例位于 fpga/testbench 目录。
可使用 make
自动编译测试用例(需要安装 riscv64-unknown-elf
工具链)。
本项目还移植了 RISC-V
的官方测试集 riscv-tests
(位于 riscv-tests 目录下)。
在使用 git submodule update --init
初始化子项目后,可在 riscv-tests/isa 目录下执行 make
命令自动编译测试用例(需要安装 riscv64-unknown-elf
工具链)。
编译完测试用例后,可在 Quartus
中进行 RTL 级仿真。
激励模块中有简易的测试框架,能够对 CPU 进行自动化测试。
由于项目的开发基于 git/Github
并配置了相应的测试脚本,因此可以在每次提交 commit
时自动触发持续集成进行测试。持续集成使用的测试用例与上一小节中的测试方法相同,但是测试由 Github Actions
自动执行。因此在小组成员各自独立编写代码的过程中,如果由于代码功能或接口的修改导致另一模块出现错误,会被 Github
立即发现并且定位到 commit
级别。再根据 git diff
重新审查代码的修改,即可确认错误。既减少了修改代码时的心智负担,又能避免日后合并代码时发生隐含的错误。
最终展示时使用的软件位于 firmware 目录。 主要使用 C 语言进行开发。
其中, crt 目录为支撑 C 程序运行的最小运行时,包括 putchar
、 sleep
等常用函数)。
final 目录为最终展示程序。
可以使用 make
指令一键编译。
该程序实现了一个最小终端,并支持运行以下程序。
程序名称 | 程序描述和参数 |
---|---|
help | 输出终端支持的指令。 |
hello | 输出 hello world 并退出。 |
echo | 原样输出参数。 |
fib | 需要一个整数n ,输出斐波那契数列的第n 项。 |
uptime | 输出 CPU 启动的时间。 |
md5 | 需要一个字符串,输出该字符串的 MD5 哈希值。 |
snake | 进入贪吃蛇小程序。使用wasd 进行控制,使用q 退出。 |