USTC-RVSoC/README.md

105 lines
4.4 KiB
Markdown
Raw Normal View History

2019-02-05 16:19:46 +08:00
# USTCRVSoC
2019-02-05 17:00:24 +08:00
一个用SystemVerilog编写的基于RISC-V的SoC
2019-02-07 19:36:33 +08:00
# 特点
1、RISC-V核采用5段流水线能运行RV32I指令集
2、SoC使用简单直观的32bit握手总线(naive_bus.sv)
3、总线仲裁器(naive_bus_router.sv)预留了宏可修改主从设备的数量和地址空间以方便拓展外设、多核、DMA等
4、具有UART调试器(isp_uart.sv)用户可以使用PC上的串口助手、minicom等软件实现交互式的系统复位、上传程序、查看内存等功能
5、全部使用SystemVerilog实现不调用IP核方便在Altera、Xilinx、Lattice等不同FPGA平台上移植
6、RAM和ROM符合一定的Verilog写法自动综合成Block RAM
2019-02-05 17:00:24 +08:00
# SoC 结构
2019-02-08 00:38:18 +08:00
![Image text](https://github.com/WangXuan95/USTCRVSoC/blob/master/images/SoC.png)
2019-02-05 17:00:24 +08:00
2019-02-08 00:38:18 +08:00
### 主要部件
2019-02-05 21:22:07 +08:00
2019-02-07 19:36:33 +08:00
1、多主多从总线仲裁器(naive_bus_router.sv):负责接受主接口发来的读写请求,根据其地址空间将其路由到相应的从接口,并在不同主接口同时访问一个从接口时,控制其中优先级高的从接口先进行访问,优先级低的主接口等待。
2019-02-05 21:22:07 +08:00
2019-02-07 19:36:33 +08:00
2、RV32I Core(core_top.sv):包括两个主接口,一个用于取指令,一个用于读写数据
2019-02-05 21:22:07 +08:00
2019-02-07 19:36:33 +08:00
3、UART调试器(isp_uart.sv)包括一个主接口。它接收用户从UART发来的命令操控复位等信号或对总线进行读写。可以使用UART命令复位整个SoC上传程序或者查看运行时的RAM数据。
2019-02-05 21:22:07 +08:00
2019-02-07 19:36:33 +08:00
4、指令ROM(instr_rom.sv)地址空间00000000~00000fffCPU复位后从00000000开始取指令因此若在指令ROM中存放编译好的指令流复位后就自动运行其中的程序
2019-02-05 21:22:07 +08:00
2019-02-07 19:36:33 +08:00
5、数据RAM(ram_bus_wrapper.sv)地址空间00010000~00010fff
2019-02-05 21:22:07 +08:00
2019-02-07 19:36:33 +08:00
6、显存RAM(vedio_ram.sv)地址空间00020000~00020fff一共4096B若VGA信号正确连接到VGA接口则屏幕上能够显示98列*36行=3528个字符显存RAM的前3528B对应的ASCII码值就决定了每个字符是什么
2019-02-05 21:22:07 +08:00
2019-02-07 19:36:33 +08:00
7、用户UART(user_uart_tx)暂时只具有发送功能地址空间00030000~00030003向00030000写一个字节相当于把该字节放入发送缓冲区FIFO缓冲区大小256B缓冲区的数据会尽快发送。
2019-02-05 17:00:24 +08:00
2019-02-08 00:38:18 +08:00
### 地址空间分配
![Image text](https://github.com/WangXuan95/USTCRVSoC/blob/master/images/AddressSpace.png)
# CPU 结构
![Image text](https://github.com/WangXuan95/USTCRVSoC/blob/master/images/Core-RTL.png)
TODO
# Getting Start
我们提供了两种方式运行代码:
1、修改指令ROM内的数据。每次修改只能修改Verilog代码然后重新编译综合重新烧写FPGA逻辑。虽然麻烦但这便于进行RTL仿真你可以将想要运行的程序放入指令ROM然后仅需在testbench中给予SoC一个时钟就可以观察整个SoC在运行这段代码时的波形。
2、使用UART调试器在线修改指令RAM内的数据。
### 部署电路到FPGA
你需要一块至少具有一个UART的FPGA开发板。另外它最好还有另一路UART或一个VGA接口。
在Quartus或Vivado等开发软件中以soc_top为顶层模块进行综合。注意到该顶层模块具有两路UART和一路VGA其中最重要的是ISP-UART务必将其连接开发板的UART。另外一路UART和VGA视开发板的情况而定。
另外注意时钟需要是50MHz如果你的开发板时钟不是50MHz可以使用PLL IP产生50MHz提供给SoC。
当你将电路烧写到FPGA后ISP-UART已经在等待命令并且Risc-v CPU应该已经开始运行指令ROM中的程序了。
### 用UART调试器读写RAM
TODO
### 用UART调试器让VGA显示字符
TODO
### 汇编文件产生指令流
TODO
### 用RISC-V CPU调用UART外设打印Hello
TODO
### 用RISC-V CPU在VGA上显示字符
TODO
### 用RISC-V CPU计算斐波那契数列
TODO
# RTL仿真
### 汇编文件产生Verilog ROM
进行RTL仿真首先需要修改指令ROM中的程序方法是
2019-02-05 21:22:07 +08:00
2019-02-05 21:20:39 +08:00
1、将汇编代码汇编为指令流并存在Verilog ROM中在./ASM目录中运行python文件asm2verilogrom.py具体命令行命令格式见python中的注释。推荐使用windows完成这一步因为 ./ASM/riscv32-gnu-toolchain-windows 中提供了编译好的riscv-windows工具链不需要另外配置环境。
2019-02-05 21:22:07 +08:00
2019-02-05 21:20:39 +08:00
2、将生成的.sv文件中的内容复制替换 ./RTL/instr_rom.sv 中的内容。
2019-02-05 17:00:24 +08:00
2019-02-08 00:38:18 +08:00
### 进行仿真
2019-02-05 17:00:24 +08:00
2019-02-08 00:38:18 +08:00
修改ROM后请直接使用soc_top_tb.sv文件进行仿真这个仿真是针对整个SoC的因此你可以修改ROM程序后进行仿真观察SoC运行该程序的行为