1. 课程导学与开发环境搭建:FPGA与RISC-V概述、Vivado/Vitis安装、RISC-V工具链配置、第一个Hello World工程
1.1 为什么是FPGA + RISC-V?
做FPGA开发十几年了,我见过太多工程师在“软硬协同”上栽跟头。要么是纯逻辑设计,跑个状态机累得半死;要么是纯软件,完全不知道硬件能怎么加速。直到RISC-V出现,这个局面才真正被打破。
RISC-V是个开源指令集架构。说白了,就是你可以自己“拼”一个CPU出来。而且它是模块化的——想要乘法器就加M扩展,想要原子操作就加A扩展。这在FPGA上特别合适,因为FPGA本身就是可编程的硬件。
我个人习惯把FPGA + RISC-V的组合叫做“乐高模式”:
- FPGA:提供可编程逻辑资源,你想加什么外设就加什么
- RISC-V软核:提供通用计算能力,跑控制逻辑、协议栈
- 两者结合:硬件加速 + 软件灵活,这才是嵌入式系统的终极形态
核心观点:FPGA是“骨骼”,RISC-V是“大脑”。骨骼决定你能做什么,大脑决定你做得有多聪明。
1.2 课程全景图:30章到底学什么?
先给你看看整个课程的知识体系。我把它分成四个阶段:
1.3 开发环境搭建:工欲善其事,必先利其器
搭建环境这件事,我踩过的坑比走过的路还多。记得第一次装Vivado,下载了整整8个小时,结果安装到一半报错说磁盘空间不够……嗯,从那以后我装任何EDA工具都会先检查三遍磁盘。
1.3.1 硬件要求
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | Intel i5 / AMD Ryzen 5 | Intel i7 / AMD Ryzen 7 |
| 内存 | 16 GB | 32 GB |
| 硬盘 | 256 GB SSD | 512 GB NVMe SSD |
| 操作系统 | Windows 10 / Ubuntu 20.04 | Windows 11 / Ubuntu 22.04 |
| FPGA开发板 | Artix-7系列 | Kintex-7 / Zynq系列 |
⚠️ 重要提醒:Vivado 2023.1及以上版本不再支持Windows 10 1809之前的版本。我曾经在客户的老机器上折腾了整整一天,最后发现是系统版本不兼容。建议安装前先查一下兼容性列表。
1.3.2 Vivado安装步骤
- 下载安装包:从Xilinx官网下载Vivado HLx WebPACK或Design Edition。我个人习惯用WebPACK,因为免费且功能足够。
- 运行安装程序:双击xsetup.exe,选择“Vivado HL Design Edition”
- 选择组件:至少勾选以下内容:
- Vivado HL System Edition
- Vitis Application Development
- Device Support for 7 Series / UltraScale
- 安装路径:建议不要有中文和空格,比如
C:\Xilinx\Vivado\2023.1 - 等待安装:这个过程大概需要30-60分钟,取决于你的网络和磁盘速度
💡 我的小技巧:安装时把杀毒软件关掉,尤其是Windows Defender的实时保护。不然安装速度会慢一倍以上。这是我在一次项目赶工时发现的——关了之后安装时间从55分钟降到了28分钟。
1.3.3 RISC-V工具链配置
RISC-V工具链有两种选择:一种是官方提供的GCC工具链,另一种是SiFive提供的Freedom Studio。我个人更推荐GCC工具链,因为更灵活,也更容易集成到自动化流程中。
配置步骤如下:
# 1. 安装依赖
sudo apt-get update
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
# 2. 克隆RISC-V GNU工具链
git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain
# 3. 配置并编译(这步需要较长时间)
./configure --prefix=/opt/riscv --enable-multilib
make -j$(nproc)
# 4. 添加环境变量
echo 'export PATH=$PATH:/opt/riscv/bin' >> ~/.bashrc
source ~/.bashrc
# 5. 验证安装
riscv64-unknown-elf-gcc --version
🔑 关键点:编译工具链时加上 --enable-multilib 参数,这样就能同时支持RV32和RV64。我见过很多新手只编译了RV64,结果后面做小规模设计时发现用不了RV32,又得重新编译一遍。
1.4 第一个Hello World工程
好了,环境搭好了,我们来写第一个程序。这个程序很简单:在FPGA上跑一个RISC-V软核,让它通过UART打印"Hello World"。
1.4.1 创建Vivado项目
- 打开Vivado,点击 Create Project
- 项目名称:
hello_world_riscv - 选择 RTL Project,勾选 Do not specify sources at this time
- 选择开发板:我用的 Nexys A7-100T(Artix-7系列)
- 点击 Finish
1.4.2 添加RISC-V软核IP
这里我用的是VexRiscv,一个用SpinalHDL写的RISC-V软核。它支持RV32IM,性能不错,而且配置灵活。
// 顶层模块:hello_world_top.v
module hello_world_top (
input wire clk_100mhz,
input wire rst_n,
output wire uart_tx
);
// 实例化VexRiscv软核
vexriscv_wrapper #(
.CPU_FREQUENCY(50000000) // 50MHz
) u_cpu (
.clk (clk_100mhz),
.rst (~rst_n),
.uart_tx (uart_tx)
);
endmodule
1.4.3 编写C代码
// main.c
#include <stdio.h>
#include "platform.h"
void uart_send_string(const char *str) {
while (*str) {
uart_send_char(*str++);
}
}
int main() {
// 初始化UART
uart_init(115200);
// 打印Hello World
uart_send_string("Hello World from RISC-V!\r\n");
uart_send_string("FPGA + RISC-V is awesome!\r\n");
while (1) {
// 空循环,保持程序运行
}
return 0;
}
1.4.4 编译与下载
# 编译C代码
riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -O2 -o hello.elf main.c
# 生成二进制文件
riscv64-unknown-elf-objcopy -O binary hello.elf hello.bin
# 将二进制文件转换为FPGA可用的格式
# 这里用Vivado的mem格式
riscv64-unknown-elf-objcopy -O verilog hello.elf hello.hex
💡 调试小技巧:如果UART没有输出,先检查波特率是否匹配。我遇到过好几次,明明代码没问题,结果发现是串口助手的波特率设错了。另外,记得检查FPGA的时钟频率——VexRiscv默认跑50MHz,如果你的开发板时钟是100MHz,需要加个PLL分频。
1.5 常见问题与避坑指南
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Vivado安装失败 | 磁盘空间不足 / 系统版本不兼容 | 预留至少50GB空间,检查系统版本 |
| 工具链编译报错 | 依赖库缺失 / 网络问题导致克隆不完整 | 重新安装依赖,使用 git submodule update --init --recursive |
| UART无输出 | 波特率不匹配 / 引脚约束错误 | 检查XDC文件,确认UART引脚分配正确 |
| 程序跑飞 | 堆栈设置错误 / 中断向量表未初始化 | 检查链接脚本,确保堆栈地址正确 |
⚠️ 我曾经踩过的坑:有一次在客户现场演示,结果程序死活跑不起来。查了三个小时,最后发现是FPGA的复位信号极性搞反了——我用的开发板是高电平复位,但VexRiscv默认是低电平复位。从那以后,我每次做新板子都会先确认复位极性。
1.6 本章小结
这一章我们做了三件事:
- 理解了FPGA + RISC-V的组合为什么是未来的趋势
- 搭建了完整的开发环境(Vivado + RISC-V工具链)
- 跑通了第一个Hello World工程
说实话,第一次看到UART打印出"Hello World"的时候,我还是挺激动的。虽然只是一个简单的程序,但它意味着你已经在FPGA上拥有了一个可编程的CPU核心。后面的事情,就看你想象力有多大了。
📌 记住:环境搭建是门槛最高的部分。一旦跨过这个门槛,后面的路就会越来越顺。如果遇到问题,别慌——先检查环境变量,再检查引脚约束,最后检查代码逻辑。90%的问题都出在这三个地方。