1. 交易系统概览:FPGA在低延迟交易中的角色、系统架构、延迟指标定义

1.1 为什么是FPGA?——我在交易系统里看到的真相

做高频交易的人,最怕什么?说白了,就是怕比别人慢。

你想想看,在纳秒级的竞争里,谁先拿到行情,谁先算出信号,谁先发出订单,谁就赚钱。CPU再快,也得走操作系统、走协议栈、走内核调度。这一套下来,几十微秒就没了。而FPGA呢?它不走这些弯路。

我个人习惯把FPGA比作「一条直通的高速公路」。数据从网口进来,直接在硬件里完成解析、计算、决策,然后从网口出去。没有中断,没有调度,没有缓存拷贝。嗯,就是这么直接。

我在项目中遇到过一件事:某家交易所的行情接口升级,CPU方案要改驱动、改协议栈、改应用层,折腾了两周。FPGA这边呢?改了几行RTL代码,重新综合一下,半天搞定。这就是硬件可编程的魅力。

核心观点:FPGA在交易系统中的角色,就是「把延迟做到物理极限」。它不负责复杂逻辑,只负责快。

1.2 系统架构长什么样?——一张图讲清楚

下面这张图,是我自己画的。你看完就明白FPGA在整个交易链路里站什么位置了。

网络接口 10G/25G/100G FPGA 处理流水线 行情解析 → 信号计算 → 策略决策 → 订单生成 (纯硬件流水线) 交易接口 FIX/OUCH/自定义 监控 & 统计模块 延迟测量、丢包检测 管理通道 PCIe / 千兆网 / UART 主机 CPU 配置 / 监控 图例: 网络层 FPGA核心处理 交易接口 监控模块 管理通道 数据流方向:左 → 右(网络 → FPGA → 交易所)

这张图里,FPGA是绝对的核心。它夹在网络接口和交易接口中间,所有数据都经过它。我习惯把FPGA内部拆成三块:

  • 行情解析模块:从网络包中提取交易所的行情数据。这一步最坑,因为不同交易所的协议不一样,有的用二进制,有的用XML。我曾经被某家交易所的「自定义UDP封装」坑了一周——他们的校验和算法居然和标准不一样。
  • 信号计算模块:算各种指标,比如价差、均线、波动率。这里要注意,FPGA不适合做复杂的浮点运算,但做定点数加减乘除,那是它的强项。
  • 策略决策模块:根据信号决定要不要下单。这个模块延迟要求最高,通常只有几个时钟周期。

我的建议:刚开始设计架构时,别急着写代码。先把数据流图画清楚。我见过太多人上来就写RTL,写到一半发现模块间握手协议没定义好,回头改架构,白白浪费两周。

1.3 延迟指标定义——你到底要测什么?

做低延迟交易,你得先搞清楚「延迟」到底指什么。很多人一上来就说「我的系统延迟是1微秒」,但问他从哪到哪,他答不上来。这就尴尬了。

我一般把延迟拆成三个层次:

延迟类型 定义 典型值(FPGA方案) 测量方法
线缆延迟 光信号在光纤中传输的时间 约5ns/米 物理测量
网卡延迟 从网口到FPGA内部的时间 10-50ns 内部计数器
处理延迟 FPGA内部从输入到输出的时间 100-500ns 仿真 + 实测
端到端延迟 从行情到达网口到订单发出网口 200-1000ns 回环测试

这里我要强调一点:处理延迟不是固定的。它取决于你的流水线深度、时钟频率、以及数据是否发生了背压(backpressure)。

注意:千万不要只看「平均延迟」。在高频交易里,最大延迟(max latency)才是要命的。一次100ns的抖动,可能就让你错过一笔交易。我见过一个团队,平均延迟做到300ns,但最大延迟到了2μs,结果实盘时频繁丢单。后来发现是某个模块的FIFO满了,触发了反压。

1.4 延迟的「坑」在哪里?——我踩过的雷

做FPGA低延迟设计,有几个地方特别容易翻车。我一个个说:

  1. 时钟域同步:跨时钟域处理不好,延迟直接翻倍。我曾经为了省一个FIFO,用了双触发器同步,结果亚稳态导致数据错位,查了三天才找到原因。后来老老实实用了异步FIFO。
  2. 复位策略:全局复位信号走太远,导致复位释放时间不一致。我建议用局部复位,每个模块自己管自己。
  3. BRAM vs LUT:查表用BRAM延迟小,但容量有限。用LUT实现小FIFO延迟更可控。这个取舍,得看你的资源余量。
  4. 综合选项:Vivado里有个「retiming」选项,默认是关的。打开后能自动优化路径延迟,但会多耗一些资源。我一般都会打开。

一句话总结:FPGA低延迟设计,本质上是「用确定性换速度」。你牺牲了灵活性,换来了可预测的、极致的延迟表现。

1.5 调试工具怎么选?——我的工具箱

做低延迟调试,光靠仿真不够。你得有趁手的家伙。我常用的几样:

  • ChipScope / ILA:抓内部信号,看时序。我习惯在每个关键模块出口都挂一个ILA,方便定位问题。
  • 内部计数器:在代码里埋时间戳计数器,精度能到1个时钟周期。这个比ILA更灵活,适合长期监控。
  • 回环测试:把FPGA的发送和接收短接,测端到端延迟。这是最准的方法。
  • 逻辑分析仪:抓FPGA和外部芯片的通信。我遇到过DDR3初始化时序不对,就是靠逻辑分析仪抓出来的。

小技巧:调试时别贪多。一次只改一个变量,改完测一次。我见过有人同时改了时钟频率和流水线深度,结果出问题了,根本不知道是哪个引起的。嗯,调试是个耐心活。

好了,这一章就聊这么多。FPGA在交易系统里的角色,说白了就是「快」。但快不是全部,你得知道快在哪里,怎么测,怎么调。后面几章,我会一个个拆开来讲。


公众号:蓝海资料掘金营,微信deep3321