跳转到内容

FPGA 零基础学习路线

选读路线:学习路线总览 → FPGA(选读)。可按兴趣或项目需要随时开始。

本文面向没有 FPGA、HDL 和数字电路经验的读者。开始前必须确定开发板、FPGA 型号和主工具链:AMD/Xilinx 器件使用 Vivado,Intel/Altera 器件使用 Quartus。跨厂商综合属于可选比较;完整 HLS 主线使用 AMD/Xilinx 器件与 Vitis HLS。

这不是一张知识清单,也不要求把所有知识学完再开始做项目。走完主线后,应该能够:

  1. 用硬件思维描述一个需求,而不是把 HDL 当成另一种 C 语言。
  2. 独立编写、仿真和综合一个中小型 RTL 模块。
  3. 完成引脚与时钟约束,把设计下载到开发板并验证。
  4. 阅读时序报告,处理常见的时钟、复位、跨时钟域和接口问题。
  5. 用 HLS 把一个小型 C/C++ 算法生成 RTL,完成 C 仿真、C/RTL 协同仿真、报告分析和 IP 集成。
  6. 把一个完整项目拆成模块、接口、验证和调试任务,并留下别人能接手的文档。
  • 先仿真,后上板。 仿真里没有解释清楚的问题,上板后通常只会更难查。
  • 一次只增加一个变量。 新模块先单独验证,再接入已有系统。
  • 以掌握程度为准。 “看完了”不代表“会了”,能解释、能复现、能定位问题才算完成。
  • 保留证据。 每个模块至少保存源码、测试平台、约束文件、关键波形和一段结果说明。
  • 先学通用 RTL,再学厂商工具。 Verilog 源码应尽量避免无必要的厂商绑定,工程文件、约束和厂商 IP 分开保存。完成主工具链验收后,再决定是否用另一套工具做兼容性比较。
  • HLS 不能代替 RTL 基础。 先理解时钟、并行、流水线和接口,再使用 HLS;否则很难判断生成结果是否合理。

Vivado 和 Quartus 面向不同厂商的器件,开发板必须使用与板载 FPGA 匹配的工具。开始前按下面的顺序确定环境:

  1. 盘点可用开发板、器件、下载器和许可证,选择一种主线板卡。
  2. 使用对应主工具完成仿真、综合、实现、约束、下载和片上调试。Vivado 使用 XDC;Quartus 的引脚分配与时序约束分别进入 QSF、SDC 等文件。
  3. 主线验收通过后,可把同一组通用 Verilog 模块放到另一套工具中比较语法、资源推断和报告差异。没有第二种器件时,不要求实际上板。
  4. 若执行完整 HLS 主线,主线板卡应选择受当前 Vitis HLS 与 Vivado 支持的 AMD/Xilinx 器件。HLS 输出作为 Vivado IP 集成。

Intel HLS Compiler 已停止发展,不再作为新项目的入门工具。Intel/Altera 方向若要学习高级综合,应先确认实际 FPGA 加速卡、BSP、Linux 环境和 Quartus Prime Pro 版本是否满足 oneAPI FPGA Support Package 的要求,再单独学习相关流程。它不能直接替代本路线的 Vitis HLS 内容。

学习目标是理解完整流程,不是背界面。应能在主工具中找到器件选择、源文件、约束、综合、实现、资源报告、时序报告和片上调试入口。

阶段 核心问题 通过标准
0. 认识 FPGA FPGA 在解决什么问题? 能解释 FPGA、MCU 和 CPU 的基本区别
1. 数字电路基础 组合逻辑和时序逻辑有什么区别? 能从波形解释输出为何变化
2. HDL 与仿真 怎样描述并验证硬件? 自动检查正常与异常输入
3. 工具链与上板 代码怎样变成板上的电路? 能独立完成综合、实现、下载和引脚约束
4. 常用模块与接口 模块之间怎样可靠传递数据? 各模块先独立验证,再完成联调
5. 时序与可靠性 为什么仿真正确,上板却不稳定? 能读懂报告并修复至少一个人为制造的问题
6. HLS(AMD/Xilinx 主线) C/C++ 算法怎样变成可用的 RTL IP? 通过协同仿真并能解释延迟、II 和资源开销
  • 先完成阶段 0~2,建立硬件思维、数字逻辑和可验证的 Verilog 基础,再进入工具链和上板实验。
  • 阶段 3~5 按“工具流程—真实接口—时序与调试”的依赖关系推进,每个阶段都要留下可复现工程和验证证据。
  • Verilog、接口和时序验收全部通过后,才进入阶段 6 的 HLS;没有合适器件和工具链时,改做更深入的 RTL 项目。
  • FPGA、MCU、CPU 各自适合做什么。
  • “程序按顺序执行”和“电路并行工作”的区别。
  • RTL、仿真、综合、布局布线、生成比特流、下载之间的关系。
  • 查阅芯片手册、开发板原理图和引脚表的基本方法。

不使用“代码跑到这一行”来解释 RTL 行为,能够说清楚哪些逻辑同时工作、哪些值只在时钟边沿更新。

  1. 二进制、十六进制、有符号数和位宽。
  2. 布尔代数、真值表、与或非、编码器、译码器和多路选择器。
  3. 组合逻辑与时序逻辑。
  4. 锁存器、触发器、寄存器和计数器。
  5. 时钟、复位、使能、建立时间、保持时间和亚稳态的直观含义。
  6. 有限状态机的状态、转移条件和输出。
  • 能根据需求画出框图或状态图,再开始写 HDL。
  • 能指出一个输出是组合逻辑结果还是寄存器输出。
  • 能解释为什么机械按键不能直接作为可靠的时钟输入。

阶段 2:学习 HDL,但先只学可综合子集

Section titled “阶段 2:学习 HDL,但先只学可综合子集”

主线使用 Verilog,先掌握可综合 RTL。SystemVerilog 可以用于测试平台或后续进阶,但不能替代本阶段的基础 Verilog 内容。

  • 模块、端口、参数和位宽。
  • 连续赋值与过程块。
  • 阻塞赋值与非阻塞赋值的使用规则。
  • if、case、循环和生成语句。
  • 组合逻辑默认赋值,避免意外推导锁存器。
  • 同步复位与异步复位的差异。
  • 状态机的写法与默认状态处理。
  • 测试平台、时钟与复位激励、自动检查和超时退出。
  • 能在看综合结果之前,通过仿真发现功能错误。
  • 能解释常见的锁存器、多驱动、位宽截断和阻塞/非阻塞赋值问题。
  • 修改参数后,测试仍能自动运行并给出明确结果。

阶段 3:走通主工具链,再完成第一次上板

Section titled “阶段 3:走通主工具链,再完成第一次上板”
  1. 建立工程并选择正确器件。
  2. 添加同一份 Verilog 源码和测试平台。
  3. 运行仿真与综合,查看警告、资源占用和时序摘要。
  4. 保存工具版本、器件型号、工程生成方法和报告。

主工具验收通过后,可将不含厂商 IP 的基础 Verilog 放入另一套工具,比较位宽、复位、存储器推断和非标准语法的处理。比较结果不能替代主工具中的实现、约束和上板验收。

与开发板匹配的工具要继续完成

Section titled “与开发板匹配的工具要继续完成”
  1. 根据原理图完成时钟、按键和 LED 的引脚约束。
  2. 运行实现并生成配置文件。
  3. 下载到开发板,记录预期现象与实际现象。
  4. 使用 Vivado ILA 或 Quartus Signal Tap 观察至少一个内部信号。
  • 换一台电脑后,按照 README 可以在对应工具中重新生成并下载设计。
  • 基础 Verilog 可以通过主工具综合,没有未解释的警告;做了跨工具比较时,差异已有记录。
  • 能区分 RTL 仿真错误、约束错误、下载问题和板级连接问题。
  • 对工具输出的警告逐项判断,不把“成功生成比特流”等同于“设计正确”。

建议按下面的顺序学习,每次只引入一种新问题。

  • 两级同步器。
  • 消抖。
  • 单脉冲和长按处理。
  • 频率、周期和占空比。
  • 参数范围与边界值。
  • 波特率计数。
  • 起始位、数据位、停止位。
  • 发送和接收状态机。
  • 写入、读取、满、空和数据有效。
  • 吞吐率、延迟和背压的基本概念。
  • 同步 FIFO;异步 FIFO 放到跨时钟域阶段再学习。

根据后续项目需要二选一,不必一开始全部学习。

这一阶段决定设计是“偶尔能跑”还是“能够可靠工作”。

  • 主时钟约束和 I/O 时序约束的作用。
  • 建立时间、保持时间、时钟偏差和时序裕量。
  • 关键路径、流水线与资源/延迟之间的取舍。
  • 复位释放的可靠性。
  • 单比特控制信号的同步。
  • 多比特数据、握手和异步 FIFO 的选择依据。
  • 不要在普通逻辑中随意生成和使用新时钟;优先使用时钟使能。
  • 会查看时序摘要和最差路径,而不只看功能仿真。
  • 能判断一个跨时钟域信号应该使用同步器、握手还是异步 FIFO。
  • 能写出问题现象、根因、修改方案和验证结果。

HLS 主线使用 Vitis HLS。输入是适合硬件综合的 C/C++,输出是 RTL IP。仍要处理时钟、复位、接口、吞吐率和资源约束。

  • 已通过 Verilog、仿真、时序和接口阶段的验收。
  • 能写简单的 C/C++ 函数、循环、数组和测试程序。
  • 能解释组合逻辑、寄存器、流水线、延迟和并行度。
  1. 先写普通 C/C++ 参考模型和自动检查的测试程序。
  2. 运行 C 仿真,确认算法和边界输入正确。
  3. 运行 C 综合,阅读延迟、启动间隔(II)、资源和时钟估计。
  4. 分别尝试 PIPELINE、UNROLL、ARRAY_PARTITION 或 DATAFLOW。每次只改变一个因素,并保存报告。
  5. 运行 C/RTL 协同仿真,确认生成的 RTL 与 C/C++ 参考模型一致。
  6. 导出 Vivado IP,接入一个包含时钟、复位、输入输出和数据有效信号的 RTL 顶层。
  7. 完成综合或上板验证,比较 HLS 估计与 Vivado 实现结果。
  • C 仿真和 C/RTL 协同仿真都能自动判断成功或失败。
  • 能解释延迟与 II 的区别,也能指出某条 HLS 指令为什么改变资源或吞吐率。
  • HLS IP 能接入 Vivado RTL 工程,没有未说明的时钟、复位或接口假设。
  • 能说清楚手写 RTL 和 HLS 的取舍,而不是简单判断哪一种“更快”。

Intel HLS Compiler 已停止发展,只在维护既有工程时保留相关知识。新项目应评估 Intel oneAPI Base Toolkit、FPGA Support Package、目标加速卡 BSP 和对应 Quartus Prime Pro 版本。oneAPI FPGA 流程使用 SYCL/DPC++,硬件和软件前置条件与 Vitis HLS 不同,不纳入本路线的零基础必做项。

如果只有 Intel/Altera 普通开发板,阶段 6 改为更深入的 RTL、时序和接口内容,不为了保留“HLS”章节强行引入不匹配的工具。

  • 独立完成计数器、PWM 和状态机。
  • 测试平台可以自动报告成功或失败。
  • 独立建立工程、添加约束、生成比特流并下载。
  • 能通过 LED、串口或逻辑分析工具观察结果。
  • 完成 UART 和一种板外接口。
  • 能处理边界情况,而不是只验证一次理想通信。

节点四:能使用 HLS 生成并集成 IP

Section titled “节点四:能使用 HLS 生成并集成 IP”
  • 完成 C 仿真、C 综合和 C/RTL 协同仿真。
  • 能阅读延迟、II 和资源报告,并用一次受控实验说明优化指令的影响。
  • HLS IP 已接入 RTL 系统,接口与复位行为有文档说明。
  • 把 HDL 当作顺序执行的软件语言。
  • 只上板试,不写测试平台。
  • 为了“分频”随意在逻辑中产生许多新时钟。
  • 忽略所有综合警告和时序报告。
  • 一开始就调用大量 IP,却不知道接口、时钟和复位如何工作。
  • 把 HLS 当作普通 C/C++ 编译器,忽略并行度、存储访问、位宽和接口。
  • 只看 HLS 的 C 仿真,不做协同仿真和实现后的报告对比。
  • 只保存工程目录,没有记录器件型号、工具版本、约束和复现步骤。

每个验收节点重点检查以下内容:

  • 需求是否已经转成框图、接口表或状态图。
  • 仿真是否覆盖复位、边界值、连续输入和异常输入。
  • 上板前是否已经通过独立模块仿真。
  • 约束是否完整,警告和时序报告是否已经阅读。
  • HLS 优化是否有前后报告,功能是否经过协同仿真复核。
  • 调试时是否一次只改变一个因素,并记录证据。
  • README 能否让下一位成员复现。
  • 实验室现有 FPGA 开发板、芯片型号和数量。
  • 主线板卡对应的 Vivado 或 Quartus 版本、下载器和许可证。
  • 是否执行完整 Vitis HLS 阶段;若执行,必须有受支持的 AMD/Xilinx 器件和 Vitis HLS 环境。
  • 若做跨工具比较,第二套工具和器件是否可用;不可用时明确标为选修。
  • 可复用的工程模板、约束文件和下载说明。

以上项目未确定时,不进入工具链、约束、上板或 HLS 阶段。

开发板确定后,再补充对应器件手册、开发板原理图、引脚表和经过团队验证的工程模板。