如果你觉得这个项目对你有帮助的话给Arielle点个star⭐谢谢喵!
这是2025年武汉大学计算机学院,计算机类,计算机科学与技术专业方向,本科二年级第三学期的"计算机系统综合设计A/B"课程作业。该作业是一个经典的五级流水线架构CPU,实现RISC-V 32I指令集。
项目编写自2025年6月28日夜晚开始,到2025年7月4日中午结束,耗时约5.5天。
- Vivado 2020.1 或更高版本
- Nexys4 DDR FPGA开发板
此项目的文件结构为:
MyPipelineCPU/
├── Srcs/ # 源代码文件
│ ├── PipelineCPU.v # 五级流水线CPU顶层模块
│ ├── PC.v # 程序计数器
│ ├── alu.v # 算术逻辑单元
│ ├── ctrl.v # 控制单元
│ ├── ctrl_encode_def.v # 控制信号定义
│ ├── dm.v # 数据存储器
│ ├── EXT.v # 立即数扩展单元
│ ├── hazard_units.v # 冒险检测和前递单元
│ ├── pipeline_regs.v # 流水线寄存器模块
│ ├── RF.v # 寄存器文件
│ ├── sccomp.v # CPU系统顶层
│ ├── top_module.v # FPGA顶层模块
│ └── dm_32bit.v # 32位地址空间数据存储器(未使用)
├── Test/ # 测试文件
│ ├── simple_dump.py # 简单反汇编脚本
│ ├── riscv-studentnosorting.coe # 指令存储器初始化文件
│ ├── Venus.txt # Venus模拟器输出
│ └── disasm_output.txt # 反汇编输出
├── Docs/ # 文档
│ ├── 验收教程by Arielle.md # 详细的验收指导文档
│ └── assets/ # 文档资源文件
├── Refs/ # 参考资料
│ ├── COAD AUX MEM.md # 计组基础知识笔记
│ ├── info.json # 项目信息
│ └── assets/ # 参考资料资源文件
├── Nexys4DDR_CPU.xdc # FPGA约束文件
└── README.md # 项目说明文档
要将这个项目描述的CPU在您的电脑上运行起来,您可以直接在Release中下载已经编译好的bit文件,然后烧录到您的FPGA开发板上。
如果您希望在您的电脑上从头运行这个项目,您需要执行以下步骤:
- 将仓库克隆到本地:
git clone https://github.com/CelestialDesolation7/WHU-5-StagePipelineCPU.git
cd WHU-5-StagePipelineCPU- 使用Vivado新建一个项目:
- 打开Vivado,选择"Create Project"
- 项目名称:
MyPipelineCPU - 项目类型:选择"RTL Project"
- 目标器件:选择
xc7a100tcsg324-1(Nexys4 DDR)
- 将源代码文件和仿真文件分别添加到项目:
- 在Vivado中,右键点击"Sources"窗口
- 选择"Add Sources" → "Add or create design sources"
- 添加以下文件:
Srcs/top_module.v(设为顶层模块)Srcs/sccomp.vSrcs/PipelineCPU.vSrcs/PC.vSrcs/alu.vSrcs/ctrl.vSrcs/ctrl_encode_def.vSrcs/dm.vSrcs/EXT.vSrcs/hazard_units.vSrcs/pipeline_regs.vSrcs/RF.v
- 添加约束文件
- 右键点击"Sources"窗口
- 选择"Add Sources" → "Add or create constraints"
- 添加
Nexys4DDR_CPU.xdc
- 创建ROM IP核
- 此项目中ROM IP核名为dist_mem_gen_0,如果你要改名,请修改sccomp中的实例化。
- 添加测试文件(可选)
- 右键点击"Sources"窗口
- 选择"Add Sources" → "Add or create simulation sources"
- 添加
Test/sccomp_rom_testbench.v - 右键点击sccomp_rom_testbench.v,选择"Set as Top"
- 点击左侧导航栏中的"Run Simulation" → "Run Behavioral Simulation"
- 如果一切顺利,您应该会看到仿真结果。
- 生成位流并下板运行:
- 点击"Run Synthesis"
- 综合完成后,点击"Run Implementation"
- 实现完成后,点击"Generate Bitstream"
- 将Nexys4 DDR开发板连接到电脑
- 点击"Open Hardware Manager"
- 点击"Open target" → "Auto Connect"
- 右键点击FPGA设备,选择"Program Device"
- 选择生成的.bit文件,点击"Program"
然后无论您是否希望用这个项目去验收,阅读验收教程都能帮助您理解。
- IF(取指令):PC_NPC模块负责指令地址计算和取指令
- ID(指令解码):控制单元、寄存器文件、立即数扩展
- EX(执行):ALU执行算术逻辑运算
- MEM(存储器访问):数据存储器读写操作
- WB(写回):寄存器写回操作
- 数据冒险:通过ForwardingUnit实现前递
- Load-Use冒险:通过HazardDetectionUnit检测,结合前递解决
- 控制冒险:通过HazardDetectionUnit检测,清空流水线
add,addi,sub:加法和减法slt,slti,sltu,sltiu:比较指令lui,auipc:高位立即数指令
and,andi,or,ori,xor,xori:逻辑运算sll,slli,srl,srli,sra,srai:移位指令
lw,lh,lhu,lb,lbu:加载指令sw,sh,sb:存储指令
beq,bne,blt,bge,bltu,bgeu:条件分支jal,jalr:无条件跳转
⚠警告:此项目默认使用dm.v作为内存,仅支持7位字地址,即9位字节地址,合计512Byte⚠
如果你的测试程序需要访问32位地址空间,请看本文最后的教程
(Arielle的测试程序没有用到这么大的地址)
在FPGA中实现32位地址空间(4GB)的内存时,不能简单地在Verilog中分配如此大量的寄存器,因为这会消耗巨大的硬件资源。
- 在Vivado中打开您的项目
- 在Flow Navigator中点击"IP Catalog"
- 搜索"Block Memory Generator"
- 双击打开配置界面
Basic Tab:
- Memory Type: Simple Dual Port RAM
- Write Width: 32
- Write Depth: 65536 (或您需要的大小)
- Read Width: 32
- Read Depth: 65536
- Enable Port Type: Use ENA Pin
- Write Enable: Use WEA Pin
Port A Options:
- Write Width: 32
- Write Depth: 65536
- Enable Port Type: Use ENA Pin
- Write Enable: Use WEA Pin
- Byte Enable: Yes (重要!)
Port B Options:
- Read Width: 32
- Read Depth: 65536
- Enable Port Type: Use ENB Pin
- 点击"Generate"按钮
- 在项目中实例化生成的IP核
- 使用提供的
dm_32bit.v模块
在sccomp.v中替换原有的dm模块:
// 替换原有的dm实例化
dm_32bit U_dm_32bit(
.clk(clk),
.DMWr(MemWrite),
.DMType(DMType),
.addr(dm_addr),
.din(dm_din),
.dout(dm_dout)
);目前的实现中,如果你试图对dm输入超过表示范围的地址,dm将拒绝写入,并输出0。