从一块 FPGA 开始,亲手造一颗 CPU:RISC-V 五级流水线实战全记录
在一块 Xilinx FPGA 上,用 Verilog 从零实现一个完整的 RISC-V 五级流水线 CPU。包含取指、译码、执行、访存、写回五大阶段,并解决真实数据冒险与控制冒险的可运行核心。
为什么是 RISC-V + FPGA?
- 开放免费:没有授权费,文档齐全,连寄存器编码都写得明明白白。
- 简洁清晰:RV32I 只有 40 多条指令,没有 x86 那样层层嵌套的历史包袱。
- 模块化扩展:基础整数指令够用,后续想加浮点、压缩指令、向量扩展,都可以一步步来。
FPGA 就像一块'数字黏土',改个逻辑,重新综合,几分钟后就能烧录验证。ILA(集成逻辑分析仪)可以抓取内部任意信号波形,这种透明度在真实芯片里根本不可能实现。
五级流水线:让 CPU'并行'起来的秘密
现代 CPU 靠的不是单条指令跑得飞快,而是让多条指令同时处于不同阶段,像工厂流水线一样源源不断地出货。
拆解五大阶段
| 阶段 | 对应操作 | 类比 |
|---|---|---|
| IF(Instruction Fetch) | 根据 PC 读取指令 | 店员去仓库拿食谱 |
| ID(Instruction Decode) | 解码指令,读取寄存器值 | 看懂食谱,准备好原料 |
| EX(Execute) | ALU 运算或地址计算 | 开始揉面、发酵 |
| MEM(Memory Access) | 访问内存(load/store) | 把成品放进/拿出烤箱 |
| WB(Write Back) | 写结果回寄存器 | 把做好的面包摆上货架 |
理想情况下,每个时钟周期都有一个新任务进入流程,也有一个成品离开。吞吐率接近每周期一条指令。
关键指标:
- 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

