第一章:FPGA基础与开发环境

各位同学好,我是老张。在低延迟交易这个圈子里摸爬滚打了十几年,今天咱们来聊聊FPGA订单簿处理引擎的第一课——基础与开发环境。

说实话,很多人一上来就急着写代码,结果连FPGA内部长什么样都没搞清楚。我当年也犯过这个错,后来吃了不少苦头才补回来。所以这一章,咱们把地基打牢。

1.1 FPGA架构简介

FPGA,说白了就是一块可以反复编程的芯片。跟CPU那种固定指令集不同,FPGA的硬件电路是你说了算。你想想看,这多适合做高频交易?

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

  • 可编程逻辑块(CLB)——这是干活的主力,由查找表(LUT)和触发器(FF)组成
  • 块RAM(BRAM)——片上存储,速度极快,适合做订单簿的缓存
  • DSP切片——专门做乘加运算,处理价格计算时特别好用
  • I/O引脚——跟外界通信的通道,比如接网卡、接内存
  • 时钟管理——PLL、MMCM这些,用来产生稳定的时钟信号

核心要点:FPGA的并行能力才是它的杀手锏。CPU一次只能处理一条指令,FPGA可以同时处理成千上万个逻辑单元。做订单簿匹配时,这个优势就体现出来了。

我在项目中遇到过一件事:用CPU做订单簿深度计算,延迟在微秒级。换成FPGA后,直接压到纳秒级。差距就是这么明显。

下面这张图是我自己画的FPGA内部结构,你看一眼就明白了:

FPGA 内部架构简图 I/O 引脚(与外部通信) 可编程逻辑块(CLB) LUT + 触发器 实现组合逻辑和时序逻辑 订单簿状态机、比较器 块RAM(BRAM) 片上存储 订单簿深度缓存 价格档位数据 DSP 切片 乘加运算 价格计算 成交量统计 时钟管理(PLL/MMCM) 产生稳定时钟 可编程互联布线 连接所有模块 配置逻辑 加载比特流 注:实际芯片中CLB阵列更大,BRAM和DSP分布更均匀 订单簿处理主要使用CLB做逻辑,BRAM做缓存

1.2 Verilog/VHDL基础

写FPGA代码,主流就两种语言:Verilog和VHDL。我个人习惯用Verilog,因为语法更接近C语言,上手快。但VHDL在军工和航天领域用得更多,看你们团队传统。

咱们做订单簿引擎,最核心的就是状态机和流水线。我给你们看个最简单的例子——一个D触发器:

// Verilog 示例: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

个人经验:写Verilog时,always块里的赋值一定要用<=(非阻塞赋值),这是跟C语言最大的区别。我刚开始写的时候老是用=,结果仿真和实际跑出来完全不一样,查了两天才发现是这个问题。

再来个组合逻辑的例子——一个简单的加法器:

// Verilog 示例:加法器
module adder (
    input  wire [7:0] a,
    input  wire [7:0] b,
    output wire [8:0] sum
);

    assign sum = a + b;

endmodule

嗯,这里要注意:组合逻辑用assign,时序逻辑用always。这个区分清楚了,后面写订单簿的状态机才不会乱。

1.3 Xilinx/Intel开发工具链搭建

工具链这块,市面上两大阵营:Xilinx(现在叫AMD)和Intel(原Altera)。做低延迟交易,Xilinx的UltraScale+系列用得最多,Intel的Arria系列也不错。

我给你们列个对比表:

项目 Xilinx (AMD) Intel (Altera)
开发工具 Vivado Quartus Prime
仿真工具 Vivado Simulator / ModelSim ModelSim / Questa
常用芯片 Kintex-7, Virtex-7, UltraScale+ Cyclone V, Arria 10, Stratix 10
低延迟优势 GTY收发器,低抖动时钟 硬核浮点DSP,低功耗
学习曲线 中等偏难 相对平缓

避坑指南:我曾经在搭建Vivado环境时,因为版本不匹配折腾了一整天。记住:Vivado 2018.3以后才支持UltraScale+,Quartus 18.0以后才支持Arria 10。下载时一定要看Release Notes。

搭建步骤其实不复杂,我总结成四步:

  1. 下载安装——去官网注册账号,下载对应版本。Xilinx的Vivado大概30GB,Intel的Quartus大概15GB。记得留够硬盘空间。
  2. 配置License——Xilinx有免费的WebPACK版本,够咱们学习用。Intel也有免费的Lite版本。
  3. 创建工程——选芯片型号,添加源文件。我建议一开始用模板工程,别自己从头配。
  4. 跑个Hello World——写个LED闪烁程序,验证工具链通不通。这一步过了,后面就顺了。

我个人习惯用Vivado,因为它的IP Integrator工具做系统集成很方便。比如把DDR控制器、以太网MAC、订单簿引擎这些模块拖到一起,连线就完事了。

最后说一句:工具链只是手段,不是目的。别在装软件上花太多时间,重点是理解FPGA怎么工作。下一章咱们就开始写真正的订单簿代码了。

本章小结:FPGA的核心是并行和可编程,Verilog/VHDL是描述硬件行为的语言,工具链是连接设计和芯片的桥梁。这三样搞明白了,后面做订单簿引擎就水到渠成。


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