1. FPGA 是什么
1.1 FPGA 的基本概念
FPGA 的全称是 Field Programmable Gate Array,翻译过来就是'现场可编程门阵列'。
这个名字听起来有点拗口,但其实很好理解。
我们可以把 FPGA 想象成一块'电子积木',你可以根据自己的需求,把这些积木搭建成不同的电路结构。
与我们常用的单片机 (如 STM32) 不同,单片机是通过软件编程来实现功能的,而 FPGA 是通过硬件配置来实现功能的。
简单来说,单片机是'软件定义功能',而 FPGA 是'硬件定义功能'。
这就好比单片机是一个多面手,可以通过不同的程序来完成不同的任务;而 FPGA 则是一个变形金刚,可以直接变成不同的硬件电路。
1.2 FPGA 与其他器件的对比
在数字电路设计领域,除了 FPGA,还有 ASIC(专用集成电路)、CPLD(复杂可编程逻辑器件) 等选择。
ASIC 的性能最好、功耗最低,但开发成本极高,而且一旦流片就无法修改。
CPLD 相对简单,适合小规模的逻辑设计。
而 FPGA 则处于两者之间,既有较高的灵活性,又能提供不错的性能。
举个实际的例子,在我之前做汽车电子项目时,需要实现一个复杂的 CAN 总线协议转换功能。
如果用 STM32 来做,虽然可以实现,但实时性可能无法保证;如果设计专用 ASIC,成本太高且开发周期太长。
最后我们选择了 FPGA 方案,既保证了实时性,又能在后期根据需求灵活调整。
2. FPGA 的内部结构原理
2.1 可编程逻辑单元 (CLB)
FPGA 的核心是由大量的可编程逻辑单元 (CLB, Configurable Logic Block) 组成的。
每个 CLB 就像一个小型的逻辑电路模块,包含查找表 (LUT, Look-Up Table)、触发器 (FF) 和多路选择器等基本元件。
查找表 LUT 是 FPGA 最基本的逻辑单元,它本质上是一个小型的存储器。
比如一个 4 输入的 LUT,就是一个有 16 个存储单元的小 RAM,可以实现任意 4 输入的逻辑函数。
当你写 Verilog 或 VHDL 代码时,综合工具会把你的逻辑表达式转换成 LUT 的配置数据。
举个简单的例子,假设我们要实现一个 2 输入的与门:
module and_gate( input wire a, input wire b, output wire y );
assign y = a & b;
endmodule
这个简单的与门逻辑,在 FPGA 中就会被映射到一个 LUT 中。
LUT 内部会存储真值表:当输入为 00、01、10 时输出 0,当输入为 11 时输出 1。
2.2 可编程互连资源
如果说 CLB 是 FPGA 的'神经元',那么可编程互连资源就是连接这些神经元的'神经网络'。
FPGA 内部有大量的布线资源,包括局部互连线、全局互连线和长线等。
这些互连线通过可编程开关矩阵连接,可以根据需要建立不同 CLB 之间的连接关系。
这就好比你在设计 PCB 时需要走线连接不同的芯片,只不过 FPGA 是在芯片内部通过可编程的方式来'走线'。
这种灵活的互连能力,使得 FPGA 可以实现各种复杂的电路结构。
2.3 输入输出模块 (IOB)
FPGA 的外围是输入输出模块 (IOB, Input/Output Block),负责与外部电路进行信号交互。
现代 FPGA 的 IOB 功能非常强大,不仅支持多种电平标准 (如 LVTTL、LVCMOS、LVDS 等),还支持可编程的驱动强度、上拉下拉电阻、输入延迟等特性。
在实际应用中,IOB 的配置非常重要。
比如我在做高速数据采集项目时,需要配置 IOB 为 LVDS 标准,以支持高速差分信号传输:
module lvds_interface( input wire lvds_p, // LVDS 正端
input wire lvds_n, // LVDS 负端
output wire data_out );
// FPGA 会自动将差分信号转换为单端信号
assign data_out = lvds_p;
endmodule
2.4 专用硬件资源
除了通用的 CLB 和互连资源,现代 FPGA 还集成了很多专用硬件资源,比如块 RAM(BRAM)、DSP 切片、时钟管理单元 (CMT)、高速串行收发器 (GTX/GTH) 等。


