第二章: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和单片机在开发流程上到底有什么不同。你想想看,一个是在写软件,一个是在画电路,这能一样吗?