第一章:FPGA基础与开发环境

各位同学好,我是你们的FPGA讲师。今天咱们聊聊FPGA的根基——芯片架构、硬件描述语言,还有Vivado这个吃饭的家伙。

说实话,我刚开始接触FPGA时,也被那些LUT、FF、BRAM搞得一头雾水。但别怕,这些东西说白了就是一堆可以反复配置的逻辑单元。你想想看,FPGA就像一堆积木,你想搭什么电路就搭什么电路。

1.1 FPGA芯片架构:从宏观到微观

FPGA内部到底长什么样?我习惯把它分成三个层次来看。

1.1.1 可编程逻辑块(CLB)

这是FPGA的核心。每个CLB里包含几个Slice,每个Slice又有LUT(查找表)和FF(触发器)。

  • LUT:本质上是一个小型的RAM。输入4-6个信号,输出一个结果。我在项目中常用它来实现组合逻辑。
  • FF:存储一位数据。时序逻辑全靠它。
  • 进位链:做加法时用的,比如计数器、累加器。

关键点:一个Slice里通常有4个LUT + 8个FF。但不同厂商的架构略有差异。Xilinx的7系列和UltraScale就不太一样。

1.1.2 互连资源

逻辑块之间怎么连?靠的是可编程互连。说白了就是一堆开关矩阵和导线。我曾经在调试一个高速接口时,发现时序不满足,最后发现是互连路径太长导致的。嗯,这里要注意:布局布线时,互连延迟往往比逻辑延迟还大。

1.1.3 专用硬核

FPGA里不光有通用逻辑,还有专用硬核:

  • BRAM:块RAM,容量从18Kb到36Kb不等。我习惯用它做FIFO或缓存。
  • DSP48:数字信号处理单元。做乘法、乘加运算时,比用LUT搭快得多。
  • MMCM/PLL:时钟管理。生成不同频率的时钟。
  • 高速收发器:用于PCIe、SATA、以太网等高速串行通信。

个人经验:做图像处理时,BRAM和DSP48是消耗大户。我建议你提前估算好资源,别等到综合报错才慌。

1.2 硬件描述语言:Verilog vs VHDL

写FPGA程序,你得会一门硬件描述语言。Verilog和VHDL是主流。我个人更偏爱Verilog,语法简洁,上手快。但VHDL在军工、航天领域用得更多。

1.2.1 Verilog基础

先看一个简单的D触发器:

module d_flip_flop (
    input  wire clk,
    input  wire rst_n,
    input  wire d,
    output reg  q
);

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        q <= 1'b0;
    else
        q <= d;
end

endmodule

注意几点:

  • always @(posedge clk) 表示时钟上升沿触发。
  • <= 是非阻塞赋值,用于时序逻辑。
  • rst_n 低电平有效复位。

我曾经犯过一个低级错误:在组合逻辑里用了非阻塞赋值,结果仿真和实际行为对不上。排查了一整天,最后发现是赋值方式用错了。

1.2.2 VHDL基础

同样的D触发器,用VHDL写:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity d_flip_flop is
    Port ( clk   : in  STD_LOGIC;
           rst_n : in  STD_LOGIC;
           d     : in  STD_LOGIC;
           q     : out STD_LOGIC);
end d_flip_flop;

architecture Behavioral of d_flip_flop is
begin
    process(clk, rst_n)
    begin
        if rst_n = '0' then
            q <= '0';
        elsif rising_edge(clk) then
            q <= d;
        end if;
    end process;
end Behavioral;

VHDL的语法更严谨,但写起来也啰嗦。我个人建议:初学者从Verilog入手,等熟悉了再学VHDL。

避坑指南:我曾经在混合使用Verilog和VHDL时,因为端口类型不匹配(wire vs std_logic)导致综合失败。建议一个项目尽量只用一种语言。

1.3 Vivado开发环境搭建与使用

Vivado是Xilinx的官方工具,功能强大但也很吃资源。我建议你的电脑至少16GB内存,否则跑综合时容易卡死。

1.3.1 安装与配置

  1. 去Xilinx官网下载Vivado WebPACK(免费版够用)。
  2. 安装时选择“Vivado HL WebPACK”,勾选“Design Tools”和“Devices”。
  3. 安装路径不要有中文,否则会报错。
  4. 安装完成后,设置环境变量:source /opt/Xilinx/Vivado/2023.1/settings64.sh

小技巧:我习惯在.bashrc里加一行alias,这样每次打开终端直接输入vivado就能启动。

1.3.2 创建工程

打开Vivado,点击“Create Project”。选择器件时,我建议你根据实际板卡来选。比如我常用的Xilinx Artix-7 XC7A35T,或者Zynq-7000系列。

工程创建后,你会看到这些窗口:

  • Sources:管理设计文件。
  • IP Catalog:调用官方IP核。
  • Tcl Console:命令行操作。
  • Flow Navigator:综合、实现、生成比特流。

1.3.3 综合与实现

写好了代码,点击“Run Synthesis”。综合完成后,查看资源利用率报告。如果LUT或BRAM超标,就得优化代码了。

实现(Implementation)包括布局和布线。这一步最耗时,也最容易出问题。我曾经有一个设计,综合只用了30秒,但布局布线跑了2小时还没完。最后发现是时钟约束没写对。

核心流程:RTL设计 → 功能仿真 → 综合 → 实现 → 时序仿真 → 生成比特流 → 下载到板卡。

1.4 本章知识体系

下面这张图概括了FPGA开发的核心逻辑:

FPGA开发知识体系 FPGA芯片架构 硬件描述语言 Vivado开发环境 CLB/LUT/FF BRAM/DSP48 互连资源 Verilog VHDL 组合/时序逻辑 工程管理 综合/实现 时序约束 三者结合:从芯片理解到代码实现再到工具使用

这张图展示了FPGA开发的三个支柱:芯片架构是硬件基础,硬件描述语言是表达方式,Vivado是实现工具。三者缺一不可。

1.5 实战建议

学FPGA,光看书没用。我建议你:

  1. 买一块开发板,比如Nexys A7或Zybo Z7。
  2. 从点亮LED开始,逐步做计数器、UART、VGA显示。
  3. 遇到问题先看官方文档,再查论坛。

重要提醒:不要一上来就做复杂项目。我见过太多人想一步到位做图像处理,结果连时序约束都没搞懂。踏踏实实从基础做起,才是最快的路。

好了,第一章就到这里。记住:FPGA的世界里,没有捷径,只有不断实践。


可可精品资料库