第二章:FPGA是什么?——从门电路到查找表(LUT),理解FPGA的底层架构

好,咱们正式开始聊FPGA。

很多从单片机转过来的朋友,第一次接触FPGA时都会有个困惑:这东西到底是个啥?说白了,它既不是CPU,也不是GPU,而是一块可以让你“画电路”的芯片。

我当年第一次听到“现场可编程门阵列”这个名字时,也是一头雾水。但后来我明白了,你不需要记住这个绕口的名字。你只需要记住一句话:FPGA就是一堆可以随意连接的基本逻辑单元

2.1 从最基础的门电路说起

咱们先回忆一下数字电路的基础。与门、或门、非门,这些是最基本的逻辑单元。

比如一个两输入与门:

输入A | 输入B | 输出Y
  0   |   0   |   0
  0   |   1   |   0
  1   |   0   |   0
  1   |   1   |   1

在单片机里,这些门电路是固定的。芯片设计好之后,与门就是与门,你改不了。但在FPGA里,情况完全不同。

核心思想:FPGA不直接使用固定的门电路,而是用一种叫“查找表(LUT)”的东西来模拟任何逻辑功能。

2.2 什么是查找表(LUT)?

查找表,英文叫Look-Up Table,简称LUT。你可以把它想象成一个“真值表存储器”。

举个例子。一个2输入的LUT,它有2个输入引脚和1个输出引脚。这个LUT内部其实是一个小型的SRAM,里面存了4个bit的数据(因为2个输入有4种组合)。

当输入信号变化时,LUT直接去查这个“小表格”,然后输出对应的值。

我画个图帮你理解:

输入A ──┐
        ├──> LUT (4x1 SRAM) ──> 输出Y
输入B ──┘

内部存储的内容(由用户配置):
地址(AB) | 存储值
  00     |   0
  01     |   1
  10     |   1
  11     |   0

你看,只要改变这4个存储bit的值,这个LUT就能实现任意2输入的逻辑功能。想当与门?存成“1000”。想当或门?存成“1110”。想当异或门?存成“0110”。

我个人习惯:把LUT理解成一个“万能逻辑盒子”。你往里面塞不同的“真值表”,它就能变成不同的门电路。这就是FPGA“可编程”的根源。

2.3 从LUT到逻辑单元(Logic Cell)

一个LUT还不够用。实际FPGA里,会把LUT和触发器(Flip-Flop)打包在一起,形成一个更完整的单元,叫做逻辑单元(Logic Cell)或逻辑块(Logic Block)。

典型的逻辑单元包含:

  • 一个4输入或6输入的LUT
  • 一个可编程的触发器(可以配置成D触发器或锁存器)
  • 一些多路选择器(MUX)用于信号路由
  • 进位逻辑(用于加法器等算术运算)

我举个例子,Xilinx 7系列FPGA里的一个Slice(包含4个逻辑单元):

每个Slice包含:
├── 4个6输入LUT(每个LUT有64bit SRAM)
├── 8个触发器
├── 进位链
├── 多路选择器
└── 分布式RAM(可配置)

嗯,这里要注意:不同厂家的叫法不一样。Xilinx叫Slice,Altera(现Intel)叫Logic Element(LE)。但本质都一样——都是LUT加触发器的组合。

2.4 可编程互连资源

光有逻辑单元还不够。你得能把它们连起来。这就是可编程互连资源(Programmable Interconnect)干的事。

你可以把FPGA想象成一个城市:

  • 逻辑单元是“建筑物”
  • 互连资源是“道路”
  • 可编程开关是“红绿灯”

通过配置这些“红绿灯”,你可以让信号走不同的路线,把不同的逻辑单元连接起来,形成复杂的数字电路。

我曾经踩过一个坑:在设计一个高速计数器时,没有注意互连延迟。结果布线后时序不满足,计数器跑不到目标频率。后来我手动调整了布局约束,把相关的逻辑单元放近一些,才解决问题。所以,互连资源不是无限的,也不是等延迟的

2.5 现代FPGA的完整架构

现在的FPGA已经远不止LUT和触发器了。一个典型的现代FPGA包含:

资源类型 功能说明 我的经验
逻辑单元(LUT+FF) 实现通用逻辑 大部分设计消耗在这里
块RAM(BRAM) 存储数据,容量大 我常用它做FIFO或缓存
DSP Slice 乘法器、累加器 做数字信号处理必备
锁相环(PLL) 时钟生成与管理 每个设计都得用
高速收发器 SerDes,高速串行通信 PCIe、以太网都靠它
I/O资源 与外部芯片通信 电平标准要选对

你看,FPGA已经不是一个单纯的“门阵列”了。它是一个集成了各种硬核资源的平台。

2.6 为什么LUT比门电路更灵活?

你可能会问:直接用门电路不好吗?为什么要绕一圈用LUT?

原因很简单:LUT是可重配置的

在ASIC(专用集成电路)里,门电路是固定的。一旦流片,功能就锁死了。但在FPGA里,你可以在几毫秒内重新配置LUT的内容,从而改变整个芯片的功能。

我举个例子。假设你需要一个复杂的逻辑函数:

Y = (A & B) | (C & D) | (E & F)

如果用门电路实现,你需要3个与门和1个或门,还要考虑布线。但用LUT实现,只需要一个6输入LUT,把真值表算好存进去就行了。

说白了,LUT是用存储空间换逻辑灵活性。这也是FPGA为什么比ASIC“慢”但“灵活”的根本原因。

总结一下:

  • FPGA的核心是LUT(查找表)
  • LUT本质是一个小SRAM,存的是真值表
  • LUT + 触发器 = 逻辑单元
  • 逻辑单元 + 互连资源 = 可编程的“数字电路画板”
  • 现代FPGA还集成了BRAM、DSP、PLL等硬核资源

好了,这一章咱们把FPGA的底裤都扒干净了。下一章,我会带你看看FPGA和单片机在开发流程上到底有什么不同。你想想看,一个是在写软件,一个是在画电路,这能一样吗?