4. FPGA开发基础与工具链
好,咱们正式开始动手。上一章我们把开发环境和工具链都搭好了,现在该去拿真正的“食材”——蜂鸟E203的源码了。
这一步看起来简单,不就是 git clone 一下嘛。但我见过不少新手在这栽跟头——版本选错、子模块没拉全、目录结构搞混,后面编译一堆莫名其妙的错误。咱们今天就把这事做扎实。
4.1 从GitHub获取源码
蜂鸟E203是开源项目,代码托管在 GitHub 上。我个人习惯用 SSH 方式克隆,但如果你没配 SSH key,用 HTTPS 也一样。
打开终端,进到你准备放项目的目录。比如我放在 ~/workspace/riscv 下:
cd ~/workspace/riscv
git clone https://github.com/SI-RISCV/e200_opensource.git
等等,先别急着敲回车。这里有个坑——直接克隆默认分支,拿到的可能是最新开发版,不一定稳定。我建议你指定一个经过验证的版本。
4.2 源码版本选择
蜂鸟E203有几个主要版本。我整理了一张表,方便你对照:
| 版本标签 | 特点 | 推荐场景 |
|---|---|---|
v1.0 |
初始发布版,结构简单 | 学习核心架构 |
v1.1 |
修复了部分时序问题 | 基础移植练习 |
v1.2 |
增加了调试接口支持 | 需要调试功能时 |
v1.3 |
最新的稳定版 | 本课程推荐 |
我个人推荐用 v1.3。为什么?因为我在 v1.0 上遇到过一些时序收敛问题,折腾了好几天。v1.3 在这方面做了不少优化,而且文档也更全。
克隆完成后,切换到 v1.3 标签:
cd e200_opensource
git checkout v1.3
git describe --tags 查看。我每次打开旧项目都会先跑一下这个命令,避免搞混。
4.3 工程文件初步浏览
好,现在源码到手了。咱们先别急着编译,花几分钟看看这个项目的“骨架”。
用 tree -L 2 或者直接在文件管理器里看,顶层目录大概是这样的:
e200_opensource/
├── doc/ # 文档
├── fpga/ # FPGA相关文件
├── rtl/ # RTL源码(核心)
├── sim/ # 仿真环境
├── software/ # 软件代码
├── tools/ # 辅助工具
└── README.md # 项目说明
咱们重点关注几个目录:
- rtl/ —— 这是心脏。所有 Verilog 代码都在这里。蜂鸟E203的处理器核心、总线、外设,全在这。
- fpga/ —— 咱们移植工作的主战场。里面有针对不同开发板的约束文件和顶层模块。
- sim/ —— 仿真脚本和测试用例。调试的时候会用到。
- software/ —— 裸机程序和启动代码。验证硬件是否跑得通。
你想想看,一个 RISC-V 处理器项目,代码量其实不大。蜂鸟E203的 RTL 代码总共也就几千行,比那些商业 IP 清爽多了。这也是我选它做教学的原因——你能真正看懂每一行代码。
4.4 核心目录深入
咱们再往 rtl 目录里看一眼:
rtl/
├── e203_core.v # 处理器核心顶层
├── e203_cpu.v # CPU 模块
├── e203_exu.v # 执行单元
├── e203_ifu.v # 指令取指单元
├── e203_lsu.v # 加载存储单元
├── e203_mem.v # 存储器接口
└── ...
看到这些文件名,你应该能猜到它们各自负责什么。取指、执行、访存、写回——经典的五级流水线结构。不过蜂鸟E203做了一些简化,实际是两级流水,但概念是相通的。
fpga 目录下,你会看到类似这样的结构:
fpga/
├── constrs/ # 约束文件 (.xdc, .sdc)
├── dc/ # Design Compile 脚本
├── mcs/ # 配置文件
└── top/ # 顶层模块
这里我要多说一句。很多初学者拿到项目,第一件事就是打开顶层模块开始改。我的建议是——先看约束文件。为什么?因为约束文件决定了你的设计能不能在 FPGA 上跑起来。我曾经在一个项目里,花了两天找时序问题,最后发现是约束文件里一个时钟周期写错了。
.xdc 或 .sdc 文件。确认时钟频率、引脚分配、时序例外。这能帮你避免 80% 的后期问题。
4.5 验证源码完整性
最后一步,确认你拿到的源码是完整的。蜂鸟E203依赖一些子模块,比如 riscv-tools 和 fpu。如果没拉全,编译会报错。
运行以下命令:
git submodule update --init --recursive
这个命令会拉取所有子模块。我建议你养成习惯,每次克隆完项目都跑一遍。别问我怎么知道的——当年我第一次编译蜂鸟,卡在“找不到某个头文件”的错误上,折腾了半天才发现是子模块没更新。
到这里,源码获取和初步浏览就完成了。你手里现在应该有了一份完整的、版本正确的蜂鸟E203源码。下一节,咱们就要开始真正的移植工作了。