3、硬件加速与FPGA:FPGA在高频交易中的应用、硬件描述语言基础、FPGA与CPU协同

各位同学,今天我们来聊聊高频交易里最硬核的一块——FPGA。说实话,很多做软件出身的朋友一听到FPGA就头大,觉得那是硬件工程师的活。但我要告诉你,在高频交易这个领域,不懂FPGA,你就永远只能吃别人剩下的汤。

为什么?因为CPU的时钟频率已经卡在4-5GHz上不去了,而FPGA可以轻松跑到几百兆赫兹,并且它的处理延迟是纳秒级的。你想想看,在微秒定胜负的交易世界里,这差距有多大。

FPGA在高频交易中的应用

FPGA在高频交易里到底能干什么?我总结下来,主要有三个场景:

  • 行情解析:把交易所发过来的二进制行情数据,直接在FPGA里解析成结构化的订单簿数据。CPU处理一个UDP包可能要几微秒,FPGA只需要几十纳秒。
  • 信号生成:把交易策略的逻辑烧进FPGA里,让它根据行情变化直接生成买卖信号。省去了数据从网卡到CPU再到内存的来回折腾。
  • 订单发送:把交易指令直接通过FPGA发送到交易所的网关。我记得有个项目,客户要求订单从策略决策到发出不能超过500纳秒,不用FPGA根本不可能。

核心观点:FPGA不是用来替代CPU的,而是用来做CPU做不了的事——极低延迟的确定性处理。

我在项目中遇到过一家做市商,他们用FPGA做期权定价。CPU算一次要3微秒,FPGA只要80纳秒。你想想看,同样一个策略,别人比你快40倍,这还怎么玩?

硬件描述语言基础

说到FPGA开发,就绕不开硬件描述语言。目前主流的有两种:Verilog和VHDL。我个人习惯用Verilog,语法更像C语言,上手快一些。

但这里有个坑,我必须提醒你:写Verilog不是在写软件,而是在画电路。很多新手把Verilog当C语言写,结果综合出来的电路乱七八糟。

来看一个最简单的例子——一个D触发器:

module d_flip_flop (
    input  wire clk,    // 时钟
    input  wire rst_n,  // 复位,低有效
    input  wire d,      // 数据输入
    output reg q        // 数据输出
);

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        q <= 1'b0;
    else
        q <= d;
end

endmodule

注意看,这里用的是 <= 非阻塞赋值,而不是 = 阻塞赋值。为什么?因为硬件里所有寄存器是并行更新的,不是像软件那样顺序执行。我曾经见过一个同事,把所有赋值都写成阻塞的,结果仿真没问题,上板子就跑飞了。嗯,这个坑我踩过。

再来看一个稍微复杂点的——4位计数器:

module counter_4bit (
    input  wire        clk,
    input  wire        rst_n,
    input  wire        en,
    output reg [3:0]   count
);

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        count <= 4'b0000;
    else if (en)
        count <= count + 1'b1;
end

endmodule

这个计数器在高频交易里有什么用?我告诉你,行情时间戳的生成、UDP包的序号校验、还有各种定时器的实现,都离不开它。

个人经验:刚开始学FPGA时,建议用仿真工具(比如ModelSim)先跑一遍,看看波形对不对。别一上来就烧板子,烧坏了心疼。

FPGA与CPU协同

好了,现在你知道了FPGA能做什么,也知道了怎么用Verilog写点基础逻辑。但实际系统中,FPGA和CPU是协同工作的。说白了,FPGA负责快但笨的活,CPU负责慢但聪明的活。

典型的架构是这样的:

FPGA与CPU协同架构 网络接口 10G/25G/100G FPGA 行情解析 信号生成 订单发送 时间戳 数据过滤 CPU 策略逻辑 风险管理 订单管理 日志记录 监控告警 共享内存 DDR4/HBM 数据流:网络 → FPGA(预处理)→ CPU(策略)→ FPGA(发送)→ 网络

这个图你看懂了吗?数据从网络进来,先到FPGA做预处理,然后通过PCIe或者共享内存传给CPU做策略决策,决策结果再回到FPGA发出去。整个链路里,FPGA负责把最耗时的网络协议解析、数据过滤、时间戳打标这些活干了,CPU只做最核心的策略计算。

FPGA和CPU之间的通信方式,我常用的有三种:

通信方式 延迟 带宽 适用场景
PCIe DMA ~1μs 批量数据传输
共享内存(DDR) ~100ns 小数据量高频交互
GPIO/SPI ~10ns 控制信号、状态同步

避坑指南:我曾经在一个项目里,FPGA和CPU之间用了PCIe DMA,结果发现每次DMA传输的启动开销太大,导致整体延迟反而比共享内存还高。后来改成共享内存+轮询的方式,延迟降了80%。所以,别迷信技术指标,要看你实际的使用场景。

最后,我想说一句:FPGA开发的门槛确实比纯软件高,但回报也大。你想想看,当你的竞争对手还在用CPU处理行情时,你已经用FPGA把延迟降到了纳秒级,这种优势是碾压性的。

嗯,今天就先聊到这里。下一节我们会深入讲FPGA上的行情解析实现,包括UDP协议栈的硬件化、订单簿的并行构建这些硬核内容。到时候我会带你们手写一个简单的行情解析器。

课后思考:如果你现在有一个交易策略,延迟要求是10微秒,你觉得用FPGA还是CPU更合适?为什么?


专注资料整理