Skip to content

Undefined01/riscv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

65 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

riscv

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 (未实现特权相关指令,如 ecallsret。未实现非四字节内存访问,如 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 程序运行的最小运行时,包括 putcharsleep 等常用函数)。

final 目录为最终展示程序。 可以使用 make 指令一键编译。 该程序实现了一个最小终端,并支持运行以下程序。

程序名称 程序描述和参数
help 输出终端支持的指令。
hello 输出 hello world 并退出。
echo 原样输出参数。
fib 需要一个整数n,输出斐波那契数列的第n项。
uptime 输出 CPU 启动的时间。
md5 需要一个字符串,输出该字符串的 MD5 哈希值。
snake 进入贪吃蛇小程序。使用wasd进行控制,使用q退出。