FPGA基础回顾:架构与核心资源

做低延迟交易系统,FPGA 是绕不开的核心武器。但说实话,很多人一上来就追着时序优化、流水线设计跑,反而把 FPGA 最基础的东西给忽略了。今天咱们就踏踏实实把 FPGA 的底子过一遍。

我个人习惯,不管项目多急,第一件事一定是先搞清楚芯片里到底有什么。你想想看,连手头的工具都不了解,怎么指望它帮你赚钱?

FPGA 的整体架构

FPGA 说白了就是一块可以无限重配的芯片。它不像 ASIC 那样流片出来就焊死了,而是通过 SRAM 查找表来实现任意逻辑功能。

一个典型的 FPGA 内部包含三大块:

  • 可编程逻辑块(CLB):这是干活的主力,里面塞满了 LUT 和 FF
  • 可编程互连资源:把各个逻辑块连起来的“高速公路”
  • 硬核 IP:比如块 RAM、DSP、PLL,这些是厂家帮你优化好的硬电路

我在项目中遇到过最坑的事,就是有人把块 RAM 当普通寄存器用,结果布线资源被占满,时序一塌糊涂。嗯,这里要记住:FPGA 不是大海,资源是有限的

核心观点:FPGA 的灵活性和确定性延迟,是它能在交易系统中干掉 CPU 的根本原因。CPU 有缓存未命中、分支预测失败,FPGA 没有这些幺蛾子。

查找表(LUT)—— 最灵活的“真值表”

LUT 是 FPGA 最基础的逻辑单元。它本质上就是一个可配置的 RAM,输入地址,输出结果。

举个例子,一个 4 输入 LUT 可以实现任意 4 输入的逻辑函数。你给它烧入真值表,它就能干活。

// 一个简单的 4 输入 LUT 实现
// 输入:a, b, c, d
// 输出:y = (a & b) | (c & d)

// 在 Verilog 中,这其实就是:
assign y = (a & b) | (c & d);

// 综合工具会自动把它映射到 LUT 里

我曾经调试过一个诡异的问题:同样的代码,在 A 家芯片上跑得好好的,换到 B 家就出错了。查了半天,原来是两家 LUT 的输入数量不一样,导致综合结果不同。所以,跨平台移植一定要重新验证

小技巧:在低延迟设计中,尽量用 LUT 实现简单逻辑,别动不动就上块 RAM。LUT 的延迟是固定的,通常只有几百皮秒,比块 RAM 快得多。

触发器(FF)—— 时序的基石

触发器就是 FPGA 里的“记忆单元”。它负责在时钟沿到来时,把输入数据锁存住。

每个 CLB 里都有一堆 FF,通常和 LUT 配对使用。LUT 负责组合逻辑,FF 负责时序逻辑。

我记得有一次做 tick-to-trade 系统,数据路径上需要 10 级流水线。我一开始用了 10 个 FF 串起来,结果发现时序跑不过。后来改成 5 级流水线 + 5 级 LUT 延迟,反而过了。为什么?因为 FF 的 setup/hold 时间会吃掉一部分时序余量。

注意:FF 不是越多越好。每多一级流水线,就多一个时钟周期的延迟。在交易系统里,1 纳秒的延迟可能就是几百万的损失。

块 RAM(BRAM)—— 大容量存储

当你要存几千个订单簿数据时,LUT 和 FF 就不够用了。这时候块 RAM 上场。

块 RAM 是 FPGA 内部的专用存储硬核,容量从 18Kb 到 36Kb 不等(不同厂家有差异)。它支持双端口读写,非常适合做乒乓缓冲。

特性 块 RAM 分布式 RAM(LUT 实现)
容量 大(18Kb+) 小(几百 bit)
延迟 1-2 时钟周期 组合逻辑延迟
功耗 较低 较高
适用场景 大缓冲区、FIFO 小寄存器文件

我建议在交易系统中,订单簿的深度缓存用块 RAM,而行情快照的临时存储用分布式 RAM。这样既保证了容量,又控制了延迟。

DSP 单元—— 数学运算加速器

做金融计算,免不了要算价格、算波动率、算各种指标。如果全用 LUT 搭乘法器,那资源消耗会吓死人。

DSP 单元就是 FPGA 里的“数学协处理器”。它内置了乘法器、加法器、累加器,可以在一个时钟周期内完成乘加运算。

举个例子,计算 a * b + c

// 用 DSP 单元实现乘加
// 假设 a, b, c 都是 18 位有符号数
wire [35:0] result;
assign result = a * b + c;

// 综合工具会自动推断使用 DSP 单元

我曾经踩过一个坑:在 Xilinx 的芯片上,DSP 单元默认是流水线化的,有 2-3 级寄存器。如果你不手动配置,它会自动插入流水线,导致延迟增加。所以,做低延迟设计时,一定要检查 DSP 的配置选项

关键点:DSP 单元在低延迟交易中的价值,不是算得快,而是算得准。它的延迟是确定性的,不会像 CPU 那样受缓存影响。

时钟管理—— 心脏的节拍

没有时钟,FPGA 就是一滩死水。时钟管理包括 PLL(锁相环)和 MMCM(混合模式时钟管理器)。

PLL 可以倍频、分频、移相。在交易系统中,我们经常需要把网卡的 156.25MHz 时钟倍频到 FPGA 的 312.5MHz,或者产生一个 90 度相移的时钟来采样数据。

我个人的经验是:时钟域交叉(CDC)是 FPGA 设计中最容易出 bug 的地方。网卡过来的数据是网卡时钟域,FPGA 内部逻辑是另一个时钟域。如果不做同步处理,亚稳态会让你怀疑人生。

避坑指南:我曾经在一个项目中,因为偷懒没做 CDC 同步,结果系统跑着跑着就随机出错。查了三天,最后发现是跨时钟域的寄存器出现了亚稳态。从那以后,我所有跨时钟域信号都强制用两级 FF 同步。

知识体系总览

下面这张图,是我自己总结的 FPGA 核心资源关系图。你可以把它当作一个快速参考:

FPGA 核心资源关系图 FPGA 芯片 可编程逻辑块 (CLB) LUT + 触发器 (FF) 块 RAM (BRAM) 大容量存储、FIFO、双端口 DSP 单元 乘法器、加法器、累加器 时钟管理 (PLL/MMCM) 倍频、分频、移相、时钟域 可编程互连 可编程互连 可编程互连 可编程互连 注:所有资源通过可编程互连网络连接,实现任意逻辑功能

这张图把 FPGA 的五大核心资源串起来了。你想想看,CLB 负责逻辑运算,BRAM 负责数据存储,DSP 负责数学计算,PLL 负责时钟管理——它们通过互连网络协同工作,这就是 FPGA 的全部秘密。

我的建议:刚开始学 FPGA 时,别急着写代码。先花一天时间,把芯片手册里的资源分布图看明白。知道 LUT 在哪、BRAM 在哪、DSP 在哪,布线的时候心里就有底了。

好了,这一章的内容就到这里。FPGA 的基础架构其实不复杂,但每个细节都值得深挖。下一章我们会聊网卡和 FPGA 怎么握手,那才是低延迟交易系统的重头戏。


专注资料整理