1. 课程导论与开发环境搭建

各位同学,欢迎来到这门课。我是你们的讲师,一个在数字电路和FPGA领域摸爬滚打了十几年的工程师。今天咱们不聊虚的,直接进入正题——第一章,也是你迈入RISC-V世界的第一步。

这一章的目标很明确:让你把开发环境跑起来,亲眼看到自己的RISC-V软核在FPGA上打印出“Hello World”。听起来是不是挺酷?别急,我们一步步来。

1.1 RISC-V指令集架构概览

RISC-V是什么?简单说,它是一个开放的、免费的指令集架构(ISA)。不像ARM或x86,你得交高昂的授权费。RISC-V从诞生起就属于所有人。

我个人第一次接触RISC-V是在2015年,当时伯克利大学发布了第一版规范。说实话,第一反应是“又一个玩具架构”。但当我仔细看完它的设计哲学——精简、模块化、可扩展——我意识到这东西可能会改变行业。事实证明,我没看走眼。

核心要点: RISC-V采用“基础指令集 + 可选扩展”的模块化设计。基础指令集(RV32I)只有不到50条指令,但足以实现一个完整的操作系统。扩展指令集(如M扩展用于乘除法、F扩展用于单精度浮点)按需添加,不用的就不实现,节省硬件资源。

为什么这对我们做FPGA软核很重要?你想想看,FPGA的逻辑资源是有限的。如果指令集过于庞大复杂,你的软核会吃掉大量LUT和BRAM,留给用户逻辑的空间就少了。RISC-V的精简特性,让它天然适合在FPGA上实现。

下表列出了RISC-V几个常用扩展及其用途:

扩展名称 指令数量 主要功能 FPGA软核建议
RV32I 47 整数运算、分支、访存 必选,基础核心
RV32M 8 乘除法指令 建议实现,提升性能
RV32F 26 单精度浮点运算 按需,资源消耗较大
RV32C 46 压缩指令(16位) 推荐,减少代码体积
Zicsr 6 控制状态寄存器访问 必选,中断和异常需要

我的建议: 初学者先从RV32I开始,跑通基础流水线。等你对架构熟悉了,再逐步添加M扩展和C扩展。一口吃不成胖子,做处理器设计尤其如此。

1.2 FPGA开发板选型:Xilinx Artix-7

工欲善其事,必先利其器。选一块合适的FPGA开发板,能让你少走很多弯路。

这门课我选用的是Xilinx Artix-7系列。为什么是它?三个理由:

  • 性价比高: Artix-7是Xilinx 7系列中的低功耗、低成本型号,一块板子几百块钱就能拿下。相比Virtex或Kintex,它更适合个人学习和原型验证。
  • 资源适中: 以XC7A35T为例,它有33280个逻辑单元、1800Kb BRAM、5个时钟管理单元。实现一个五级流水线的RISC-V软核绰绰有余,还能留出空间加一些外设。
  • 生态成熟: Vivado对Artix-7支持非常好,社区资料丰富。遇到问题,网上随便一搜就有答案。

我在项目中用过好几款Artix-7的板子,比如Nexys Video、Arty A7。个人比较推荐Arty A7,它自带USB-JTAG、UART转USB、DDR3内存,接口齐全,价格也合理。

避坑指南: 我曾经买过一块某宝上的“高性价比”FPGA板,结果发现它的晶振精度不够,导致UART通信老是丢数据。折腾了两天才找到原因。所以,开发板尽量选大厂出品,比如Digilent、Xilinx官方评估板。省下的时间,远比省下的钱值钱。

1.3 Vivado与Verilog开发环境安装

接下来,咱们把开发工具装好。Vivado是Xilinx的官方IDE,支持从设计输入、综合、布局布线到比特流生成的完整流程。

安装步骤其实不复杂,但有几个坑我得提前告诉你:

  1. 下载Vivado WebPACK版本: 这是免费的,功能对Artix-7完全够用。别下Vivado HLx或Vivado ML Enterprise,那些是收费的,而且你根本用不上。
  2. 安装路径不要有中文: Vivado对中文路径支持很差,我曾经因为把安装目录放在“D:\开发工具\Vivado”下,结果综合时报了一堆莫名其妙的错误。改成全英文路径后,问题消失。
  3. 选择安装组件: 安装时勾选“Vivado”和“Vitis”(Vitis是SDK的升级版,用于编写和调试RISC-V的C程序)。其他如DocNav、PetaLinux按需安装,不装也行。
  4. 安装时间: 做好心理准备,Vivado完整安装需要30-60分钟,取决于你的电脑配置。去泡杯咖啡,或者看看文档,别干等着。

安装完成后,打开Vivado,新建一个工程。选择你的开发板型号(比如xc7a35ticsg324-1L),然后就可以开始写Verilog了。

我的习惯: 我会在工程目录下建几个子文件夹:src放Verilog源文件,sim放仿真文件,constrs放约束文件,ip放IP核。这样工程结构清晰,后期维护起来不头疼。

1.4 RISC-V工具链(GCC)搭建

有了硬件开发环境,我们还需要软件工具链——也就是编译器、汇编器、链接器,用来把C代码编译成RISC-V的机器码。

RISC-V的GCC工具链是开源的,官方维护的版本叫riscv-gnu-toolchain。搭建方式有两种:

  • 方式一:从源码编译(不推荐) 下载源码,配置,编译,安装。这个过程非常耗时,而且容易出错。我第一次编译时,因为缺少某个依赖库,卡了整整一天。
  • 方式二:使用预编译二进制包(强烈推荐) SiFive、芯来科技等公司都提供了预编译好的工具链,下载解压就能用。省时省力,何乐而不为?

我建议你使用SiFive提供的Freedom Studio,它集成了RISC-V GCC工具链、调试器和示例工程。下载后解压到任意目录,把bin目录添加到系统环境变量PATH中。

验证安装是否成功:打开终端,输入riscv64-unknown-elf-gcc --version。如果能看到版本信息,说明工具链已经就绪。

关键参数说明: 编译RISC-V程序时,常用的GCC选项包括:-march=rv32im(指定指令集架构)、-mabi=ilp32(指定ABI)、-O2(优化等级)。这些参数直接影响生成的机器码质量和大小。

1.5 第一个Hello World程序(串口打印)

环境都搭好了,咱们来写第一个程序。目标:在FPGA上运行一个RISC-V软核,通过串口打印出“Hello World!”。

整个流程分三步:

  1. 硬件设计: 用Verilog实现一个最简单的RISC-V处理器(比如单周期CPU),挂载UART外设。
  2. 软件编写: 用C语言写一个Hello World程序,通过UART发送字符串。
  3. 下载运行: 将硬件比特流下载到FPGA,将软件二进制加载到处理器内存,观察串口输出。

这里我给出一个最简单的C代码示例:

// hello.c
#define UART_BASE 0x10000000

void uart_putchar(char c) {
    volatile char *uart = (volatile char *)UART_BASE;
    *uart = c;
}

void uart_puts(const char *str) {
    while (*str) {
        uart_putchar(*str++);
    }
}

int main() {
    uart_puts("Hello World!\n");
    while (1);
    return 0;
}

编译命令:

riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -O2 -nostdlib -T link.ld -o hello.elf hello.c

其中link.ld是链接脚本,定义了代码段、数据段的起始地址。这个脚本需要和你的硬件设计中的内存映射一致。

编译完成后,用riscv64-unknown-elf-objcopy将ELF文件转换成二进制文件,然后通过Vivado的Vitis或自定义loader加载到FPGA的BRAM中。

我曾经踩过的坑: 第一次运行Hello World时,串口什么也没输出。检查了半天,发现是UART的波特率设置错了。我的硬件UART是115200bps,但串口助手设置成了9600。所以,记得检查硬件和软件的波特率是否一致。

当你在串口助手中看到“Hello World!”的那一刻,恭喜你——你已经成功搭建了完整的RISC-V开发环境,并且让一个真实的处理器在FPGA上跑了起来。这是你成为RISC-V架构专家的第一步。

本章知识体系

为了让你更直观地理解本章的内容结构,我画了一张图:

第一章知识体系结构图 第一章:课程导论与开发环境搭建 RISC-V软核开发入门 RISC-V指令集架构 FPGA开发板选型 Vivado + Verilog RISC-V GCC工具链 RV32I基础 模块化扩展 Artix-7 资源评估 Vivado安装 Verilog工程 GCC编译 链接脚本 最终目标:串口打印 Hello World!

这张图展示了本章的四个核心模块:RISC-V架构、FPGA开发板、开发环境、工具链。它们最终汇聚到同一个目标——让你的第一个Hello World程序跑起来。

好了,第一章的内容就到这里。环境搭好了,工具装好了,第一个程序也跑通了。接下来,我们会深入处理器的内部,从单周期CPU开始,一步步构建一个完整的RISC-V软核。准备好了吗?