从零开始学习 AMD FPGA 编程与设计 – wiki词典


从零到英雄:AMD FPGA 编程与设计终极入门指南

现场可编程门阵列(FPGA)是数字世界的“变形金刚”。它们不像 CPU 或 GPU 那样被固定了硬件功能,而是提供了一片可由你自定义配置的数字逻辑海洋。通过“编程”FPGA,你实际上是在设计自己的专用数字电路。AMD(通过其收购的 Xilinx 公司)是 FPGA 领域的绝对领导者。

本指南将带你踏上从零开始学习 AMD FPGA 设计的旅程,从基本概念到亲手点亮第一颗 LED 灯,并为你指明后续的学习方向。


第一章:基石 —— 什么是 FPGA?为何选择 AMD?

1.1 什么是 FPGA?

FPGA (Field-Programmable Gate Array) 是一种集成电路,其内部包含了大量的可编程逻辑块、存储器和互连资源。与 CPU 按顺序执行指令不同,FPGA 可以实现真正的硬件级并行计算。你可以将它想象成一块数字乐高积木板,你可以用 Verilog 或 VHDL 这样的硬件描述语言(HDL)来“搭建”任何你想要的数字电路,比如一个专用的图像处理器、一个网络交换机,甚至一个自定义的 CPU。

FPGA 的核心优势:
* 并行性: 能够同时处理成千上万个任务,非常适合视频处理、网络加速和高性能计算。
* 灵活性: 可以在设计完成后随时重新编程,实现不同的功能,硬件迭代速度快。
* 高性能: 专用电路的执行效率远高于通用处理器,且延迟极低。

1.2 为什么选择 AMD (Xilinx) FPGA?

AMD(Xilinx)是 FPGA 的发明者,拥有最广泛的产品线和最成熟的生态系统。
* 强大的开发工具: Vivado Design Suite 是业界领先的 FPGA 开发环境,集成了从设计、仿真到实现和调试所需的一切工具。
* 丰富的产品系列:
* Spartan/Artix: 面向成本敏感和低功耗应用,是初学者的绝佳选择。
* Kintex/Virtex: 提供更高的性能和资源,用于通信、数据中心等高端领域。
* Zynq UltraScale+ MPSoC: 这是革命性的产品,它将 FPGA(可编程逻辑,PL)与强大的 ARM 处理器(处理系统,PS)集成在同一芯片上,让你能够实现软硬件协同设计。
* 庞大的社区与文档: 你可以轻松找到海量的教程、参考设计和活跃的开发者社区。


第二章:准备工作 —— 你的 FPGA 军火库

在开始之前,你需要准备好硬件和软件。

2.1 硬件:你的第一块 FPGA 开发板

选择一块合适的开发板至关重要。对于初学者,推荐选择文档齐全、社区支持广泛、搭载了常用外设(如 LED、按键、开关)的板卡。

初学者友好型 AMD FPGA 开发板推荐:
1. Digilent Arty A7: 搭载 Artix-7 FPGA,性价比高,资源适中,非常适合学习纯 FPGA 设计。
2. Digilent Basys 3: 同样基于 Artix-7,专为教学设计,外设丰富,上手简单。
3. Digilent Zybo Z7: 如果你想探索 SoC(片上系统),这块板子搭载了 Zynq-7000 系列芯片,集成了 ARM 处理器和 FPGA,是学习软硬件协同设计的利器。

2.2 软件:AMD Vivado ML Edition

Vivado 是 AMD FPGA 的官方集成开发环境(IDE)。你需要下载并安装它。

  1. 访问 AMD 官网: 前往 AMD Vivado ML Edition 下载页面
  2. 选择版本: 下载 Vivado ML Standard 版本。这是一个完全免费的版本,支持包括 Artix-7 和 Zynq-7000 在内的大多数中低密度芯片,对初学者来说功能绰绰有余。
  3. 安装: Vivado 的安装包非常大(数十 GB),请确保有足够的磁盘空间和稳定的网络。安装过程中,请勾选你所使用的 FPGA 型号(例如 Artix-7 和 Zynq-7000 系列)。

第三章:第一次亲密接触 —— “Hello, World!” 之点亮 LED

我们将通过 FPGA 世界的“Hello, World!”—— 点亮一颗 LED 灯,来走完整个 FPGA 开发流程。这个简单的项目会让你熟悉从代码编写到硬件部署的全过程。

假设你使用的是 Arty A7 开发板。

步骤 1: 创建 Vivado 工程

  1. 打开 Vivado。
  2. 点击 Create Project,进入工程创建向导。
  3. 为你的工程命名(例如 led_blinky)。
  4. 选择 RTL Project,并勾选 Do not specify sources at this time
  5. Default Part 步骤,选择 Boards 标签页,然后搜索并选择你的开发板型号(例如 Arty A7-35T)。如果找不到你的板卡,你需要先从开发板厂商官网(如 Digilent)下载并安装板卡定义文件。
  6. 点击 Finish 完成创建。

步骤 2: 编写 HDL 代码 (Verilog)

FPGA 设计的核心是使用硬件描述语言。Verilog 是其中最流行的一种。

  1. Sources 窗口中,右键点击 Design Sources -> Add Sources
  2. 选择 Add or create design sources,点击 Next
  3. 点击 Create File,文件类型选择 Verilog,命名为 led_blinky.v
    4t. 双击打开 led_blinky.v,输入以下代码:

``verilogtimescale 1ns / 1ps

module led_blinky(
input wire clk, // 输入时钟 (开发板上的 100MHz 时钟)
output reg led // 输出到单个 LED
);

// 创建一个计数器,用于分频
reg [26:0] counter = 0;

// 时钟分频逻辑:100MHz / 2^27 ≈ 0.74Hz
localparam DIVIDER = 27'd50000000; // 0.5s

always @(posedge clk) begin
    if (counter >= DIVIDER - 1) begin
        counter <= 0;
        led <= ~led; // 翻转 LED 状态
    end else begin
        counter <= counter + 1;
    end
end

endmodule
``
**代码解读:**
*
module led_blinky(…): 定义了一个名为led_blinky的模块,它有一个输入clk和一个输出led
*
input wire clk:clk是来自开发板晶振的输入时钟信号。
*
output reg led:led是连接到物理 LED 的输出信号。reg表示它在一个always块中被赋值,会生成一个触发器。
*
reg [26:0] counter: 我们定义了一个 27 位的寄存器作为计数器。
*
always @(posedge clk): 这是一个时序逻辑块。块内的代码会在时钟信号clk` 的每一个上升沿执行。
* 我们用计数器对 100MHz 的主时钟进行分频。当计数器数到特定值时,就翻转一次 LED 的电平(从亮到灭,或从灭到亮),然后计数器清零。这样就实现了 LED 的闪烁。

步骤 3: 添加物理约束 (XDC 文件)

你的 Verilog 代码定义了“做什么”(逻辑功能),但 FPGA 并不知道 led 这个信号应该连接到板子上的哪个物理引脚。XDC (Xilinx Design Constraints) 文件就是用来告诉 FPGA 这种映射关系的。

  1. Sources 窗口中,右键点击 Constraints -> Add Sources
  2. 选择 Add or create constraints,点击 Next
  3. 点击 Create File,命名为 constraints.xdc
    4t. 查阅你的开发板参考手册,找到 LED 的引脚编号。对于 Arty A7,其中一个 LED (LD4) 连接到 H5 引脚,板载时钟是 E3
  4. 双击打开 constraints.xdc,输入以下内容:

“`xdc

Onboard 100MHz Clock

set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }];
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { clk }];

LED

set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { led }];
“`

步骤 4: 综合、实现、生成比特流

这是将你的代码“翻译”成 FPGA 可识别的配置文件的过程。

  1. Run Synthesis (综合): 在 Vivado 左侧的 Flow Navigator 中点击 Run Synthesis。综合器会将你的 Verilog 代码转换成逻辑门级的网表。
  2. Run Implementation (实现): 综合成功后,点击 Run Implementation。实现工具会将网表中的逻辑单元合理地放置在 FPGA 芯片上,并规划好它们之间的布线。
  3. Generate Bitstream (生成比特流): 实现成功后,点击 Generate Bitstream。这将生成最终的 .bit 配置文件,它包含了配置 FPGA 内部所有逻辑和连线的全部信息。

步驟 5: 编程并验证

  1. 连接硬件: 使用 USB 线将你的 FPGA 开发板连接到电脑。
  2. 打开硬件管理器:Flow Navigator 中,点击 Open Hardware Manager
  3. 连接目标: 在顶部的绿色条幅中,点击 Open target -> Auto Connect。Vivado 会自动检测并连接到你的开发板。
  4. 下载比特流: 右键点击你的 FPGA 器件(例如 xc7a35t_0),选择 Program Device。在弹出的窗口中,确认 .bit 文件路径正确无误,然后点击 Program

几秒钟后,程序下载完成。如果一切顺利,你将看到开发板上的那颗 LED 开始以大约每秒一次的频率欢快地闪烁!


第四章:核心概念与进阶之路

点亮 LED 只是开始。要成为一名合格的 FPGA 工程师,你还需要掌握以下核心概念:

  1. 深入学习 HDL:

    • 组合逻辑 vs. 时序逻辑: 理解两者的区别以及如何在 HDL 中描述它们。
    • Testbench 编写与仿真: 在部署到硬件前,通过编写测试平台(Testbench)在 Vivado 仿真器中验证你的设计是否符合预期。仿真是 FPGA 设计中不可或缺的关键步骤!
    • 状态机设计: 学习如何设计有限状态机(FSM),这是实现复杂控制逻辑的基础。
  2. IP 核 (Intellectual Property Core) 的使用:

    • IP 核是预先设计好的、可复用的电路模块,例如 RAM、FIFO、FFT 模块等。
    • 学习使用 Vivado 的 IP Catalog,可以极大地加速你的开发进程。尝试使用 Clocking Wizard IP 来生成不同频率的时钟。
  3. 时序约束与分析:

    • 简单的设计或许可以忽略时序,但对于高速系统,正确的时序约束是保证设计稳定工作的关键。你需要告诉工具你的时钟频率是多少,以及输入输出信号的延迟要求。
  4. 软硬件协同设计 (Zynq):

    • 如果你使用的是 Zynq 开发板,下一步就是学习如何在 ARM 处理器(PS)上运行 Linux 或裸机程序,并通过 AXI 总线与 FPGA(PL)中的自定义逻辑进行交互。这需要使用 AMD Vitis 统一软件平台。
  5. 高级主题:

    • 高级语言综合 (HLS): 使用 C/C++ 来生成硬件逻辑,降低复杂算法的开发门槛。
    • 部分重配置: 在系统运行时,只更新 FPGA 的一部分区域,实现动态功能切换。

第五章:资源推荐

  • 官方文档: AMD/Xilinx 官网的用户指南 (UG) 和数据手册 (DS) 是最权威的信息来源。
  • 社区论坛: AMD Community FPGA Forum 是寻求帮助的最佳场所。
  • 在线课程: Coursera、Udemy 等平台上有许多优秀的 FPGA 入门课程。
  • GitHub: 搜索与你开发板相关的项目,阅读别人的代码是最好的学习方式之一。

结论

学习 FPGA 设计是一场充满挑战与回报的旅程。它要求你有扎实的数字逻辑基础和严谨的工程思维。不要畏惧 स्टार्टिंग 阶段的困难,从点亮一颗 LED 开始,通过不断的实践和学习,你将逐步解锁在硅片上创造世界的强大能力。记住,耐心、细致和大量的动手实验是通往成功的唯一路径。祝你玩得愉快!

滚动至顶部