从一块 FPGA 开始,亲手造一颗 CPU:RISC-V 五级流水线实战全记录
今天,我们在 Xilinx FPGA 上,用 Verilog 从零实现一个完整的 RISC-V 五级流水线 CPU。包含取指、译码、执行、访存、写回五大阶段,并解决真实数据冒险与控制冒险的可运行核心。
为什么是 RISC-V + FPGA?
- 开放免费:没有授权费,文档齐全,连寄存器编码都写得明明白白。
- 简洁清晰:RV32I 只有 40 多条指令,没有 x86 那样层层嵌套的历史包袱。
- 模块化扩展:基础整数指令够用,后续想加浮点、压缩指令、向量扩展,都可以一步步来。
FPGA 可以把它捏成任何你想要的电路形态。不像 ASIC 动辄百万成本,也不像 MCU 被固化功能束缚。改个逻辑,重新综合,几分钟后就能烧录验证。
更重要的是,你能看到一切。ILA(集成逻辑分析仪)可以抓取内部任意信号波形,就像给 CPU 做 CT 扫描。这种透明度,在真实芯片里根本不可能实现。
所以,当你把 RISC-V 和 FPGA 放在一起,得到的不只是一个软核,而是一个可观察、可调试、可演进的计算系统沙盒。
五级流水线:让 CPU'并行'起来的秘密
现代 CPU 之所以快,靠的不是单条指令跑得飞快,而是让多条指令同时处于不同阶段,像工厂流水线一样源源不断地出货。
拆解五大阶段
| 阶段 | 对应操作 | 类比 |
|---|---|---|
| IF(Instruction Fetch) | 根据 PC 读取指令 | 店员去仓库拿食谱 |
| ID(Instruction Decode) | 解码指令,读取寄存器值 | 看懂食谱,准备好原料 |
| EX(Execute) | ALU 运算或地址计算 | 开始揉面、发酵 |
| MEM(Memory Access) | 访问内存(load/store) | 把成品放进/拿出烤箱 |
| WB(Write Back) | 写结果回寄存器 | 把做好的面包摆上货架 |
理想情况下,每个时钟周期都有一个新任务进入流程,也有一个成品离开。虽然单条指令仍需 5 拍才能完成,但吞吐率接近每周期一条指令。
💡 关键指标:
- CPI(Clocks Per Instruction) ≈ 1(理想状态)
- 加速比 ≈ 5 倍于非流水线设计
但现实没那么美好。流水线会遇到三大障碍:结构冲突、数据冒险、控制冒险。处理不好,性能反而不如单周期。
如何在 Xilinx FPGA 上搭建这个 CPU?
目标明确:使用 Digilent Nexys A7 开发板(XC7A35T),基于 Vivado 2023.1 工具链,构建一个能运行 RISC-V 汇编程序的完整 SoC。
系统架构总览
整个系统采用哈佛架构(分离指令与数据存储),关键模块如下:
+------------------+
| Clock (50MHz) |
+
PC Reg Inst ROM (BRAM)
IF Stage
( instruction PC)
ID
Control Unit ← Opcode Decoder
RegFile Read ← rs1, rs2
EX
ALU Control ← funct3funct7
ALU Operation (subsltetc.)
MEM
Data Memory (Block RAM)
Handle lwsw
WB
Write Mux ← ALU MEM data
RegFile Write Enable

