﻿# 硬件集成与部署

## 概述

量化FPGA系统不仅需要优秀的逻辑设计，还需要可靠的硬件平台、精确的时钟同步和稳妥的运维方案。本章讨论从板卡选型到机柜部署的全链路。

---

## 1. FPGA 板卡与加速卡选型

### 1.1 主流方案对比

| 方案 | 代表型号 | FPGA 芯片 | 网络接口 | 延迟特点 | 适用场景 |
|------|---------|----------|---------|---------|---------|
| **PCIe 加速卡** | Xilinx Alveo U250/U280 | Virtex UltraScale+ | 2× QSFP28 (100G) | 最低 | 头部机构全硬件方案 |
| **智能网卡** | Silicom FB2/FB4 | Intel Stratix 10 / Xilinx | 2-4× SFP28 (25G) | 很低 | 网卡+FPGA一体，省空间 |
| **集成网卡** | Solarflare X2522-PLUS | Xilinx (内嵌) | 2× SFP28 | 低 | 用 Onload 软件栈，FPGA 可选 |
| **SoC 方案** | Xilinx Zynq UltraScale+ | ARM+FPGA | 需外接 PHY | 中 | 嵌入式软核+可编程逻辑 |
| **开发板** | Xilinx VCU118 / KCU116 | Virtex/Kintex | 需扩展 | N/A | 原型验证、算法研发 |

### 1.2 选型关键维度

| 维度 | 关键指标 | 建议 |
|------|---------|------|
| **逻辑资源** | LUT/FF/BRAM/DSP 数量 | 行情解码约需 50K LUT，全系统约需 200-400K LUT |
| **收发器** | GTY/GTH 数量与速率 | 至少 2 个 10G/25G 收发器（行情+报单） |
| **PCIe** | Gen3/4/5, Lane 数 | Gen3×8 足以支撑行情+统计带宽 |
| **片上内存** | BRAM + URAM 总量 | 订单簿全在片上约需 10-20 MB |
| **功耗** | 满载功耗 | 数据中心机柜通常限 75W/卡 |
| **散热** | 被动/主动散热 | 交易所机房通常要求被动散热 |

### 1.3 国内常用配置

```bash
典型头部私募配置：
┌─────────────────────────────────────────────────┐
│ 机柜 1U 服务器                                   │
│ ┌─────────────┐  ┌─────────────┐                │
│ │ FPGA Card 1 │  │ FPGA Card 2 │                │
│ │ (上交所行情) │  │ (深交所行情) │                │
│ │ Alveo U250  │  │ Alveo U250  │                │
│ └──────┬──────┘  └──────┬──────┘                │
│        │ PCIe Gen3×8     │ PCIe Gen3×8           │
│ ┌──────┴─────────────────┴──────┐                │
│ │        CPU (Xeon)             │                │
│ │   策略引擎 / 参数管理 / 监控   │                │
│ └───────────────────────────────┘                │
│                                                   │
│ ┌───────────────────────────────┐                 │
│ │    Solarflare X2522 NIC       │                 │
│ │    (备用软件路径 + 管理网口)    │                 │
│ └───────────────────────────────┘                 │
└─────────────────────────────────────────────────┘
```
---

## 2. Colocation 网络拓扑

### 2.1 典型机柜内连接

```bash
            交易所撮合引擎
                  │
     ┌────────────┼────────────┐
     │            光纤           │
     │            │             │
     ▼            ▼             ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 多播 SPAN │ │ TAP 交换机 │ │ 直连光纤 │
│ (多客户)  │ │ (单客户)  │ │ (最短)  │
│ 5-50m    │ │ 2-10m    │ │ 1-5m   │
└────┬────┘ └────┬────┘ └────┬────┘
     │           │           │
     ▼           ▼           ▼
  FPGA NIC    FPGA NIC    FPGA NIC
  (延迟中等)  (延迟低)    (延迟最低)
```
### 2.2 跨市场连接

```bash
  ┌─ 上海期货大厦 ─┐          ┌─ 深圳交易所大厦 ─┐
  │  行情 → FPGA   │          │  行情 → FPGA     │
  └───────┬────────┘          └────────┬─────────┘
          │                            │
          │ 微波/毫米波链路 (8-10ms)     │
          │                            │
          ▼                            ▼
  ┌─────────────────────────────────────────┐
  │     上海数据中心（策略引擎）               │
  │   跨市场决策 + 订单路由                   │
  └─────────────────────────────────────────┘
```
**跨市场延迟预算**：
| 链路 | 延迟 | 说明 |
|------|------|------|
| 微波 (上海↔深圳) | ~8 ms | 受天气影响，可用性 99.9% |
| 毫米波 (上海↔深圳) | ~5 ms | 更高带宽，受雨衰影响大 |
| 光纤 (上海↔深圳) | ~12 ms | 最稳定，延迟较高 |
| 期货本地机房 | 25-250 ns | 光纤几米到几十米 |

---

## 3. 时钟同步

### 3.1 PTP (IEEE 1588) 精度

| 方案 | 同步精度 | 实现方式 | 成本 |
|------|---------|---------|------|
| PTP 软件实现 | ±1-10 μs | linuxptp 守护进程 | 免费 |
| PTP 硬件打时戳 | ±50-100 ns | NIC 硬件 PTP 支持 | 中 |
| **PTP + FPGA 硬件打时戳** | **±10-50 ns** | FPGA 逻辑 + PPS | 高 |
| GPS/GNSS 驯服时钟 | ±10-20 ns | 外部 GPSDO | 高 |
| 原子钟 | ±1 ns | 铷/铯钟，机柜内 | 极高 |

### 3.2 PTP 部署架构

```bash
          ┌──────────────┐
          │ Grandmaster   │  ← 交易所主时钟 (GPS/GNSS 驯服)
          │ Clock (GMC)  │
          └──────┬───────┘
                 │ PTP 报文（多播）
    ┌────────────┼────────────┐
    │            │            │
    ▼            ▼            ▼
┌───────┐  ┌───────┐  ┌───────┐
│PTP Slave│ │PTP Slave│ │PTP Slave│
│ (FPGA)  │ │ (FPGA)  │ │ (FPGA)  │
│ ±30ns   │ │ ±30ns   │ │ ±30ns   │
└───────────┘ └───────────┘ └───────────┘
```
**FPGA PTP 硬件实现要点**：
```verilog
module ptp_slave (
    input wire clk_250mhz,      // 4ns 分辨率
    input wire ptp_packet_rx,   // PTP 报文到达信号
    input wire [79:0] ptp_data,  // PTP 时间戳数据
    output reg [79:0] local_time, // 本地同步后的时间
    output reg        time_valid
);
    // 1. 硬件记录 Sync/Follow_Up/Delay_Req/Delay_Resp 四个时间戳
    // 2. 计算 offset = (t2-t1) - (t4-t3) / 2
    // 3. PI 控制器平滑调整本地时钟频率
    // 4. 输出同步后的时间
endmodule
```

### 3.3 多节点时间偏差

```bash
FPGA-1 (上海行情)         FPGA-2 (深圳行情)         FPGA-3 (报单网关)
      │                         │                         │
      ├──── PTP 同步 (±30ns) ───┤                         │
      │                         │                         │
      └─────────────────────────┴──── PTP 同步 (±30ns) ───┘
                                                          │
      全局时间偏差 ≤ ±50 ns                                │
```
---

## 4. 高可用设计

### 4.1 双机热备

```bash
                    行情光纤
                       │
              ┌────────┼────────┐
              │  光分路器/镜像  │
              └────────┼────────┘
                    ┌──┴──┐
                    │     │
               ┌────▼─┐ ┌─▼────┐
               │FPGA-A│ │FPGA-B│
               │主系统 │ │备系统 │
               └──┬───┘ └──┬───┘
                  │         │
               ┌──▼─────────▼──┐
               │  心跳 + 切换   │
               │  (CPU 协调)   │
               └───────┬───────┘
                       │
                   订单光纤
```
| 机制 | 切换时间 | 说明 |
|------|---------|------|
| 心跳检测 | 每 1-10 μs | FPGA 间专用心跳信号线 |
| 主备裁决 | < 10 μs | 心跳超时 → 备升主 |
| 状态同步 | 实时 | 订单簿状态每 tick 同步到备机 |
| 撤单保护 | < 1 μs | 切换后立即撤光所有挂单（安全起见） |

### 4.2 故障场景与应对

| 故障 | 检测 | 响应 |
|------|------|------|
| FPGA 逻辑错误 | 看门狗超时 | 自动重加载比特流 |
| PCIe 链路断开 | PCIe 错误中断 | CPU 降级到软件路径 |
| 光纤断连 | 光模块 LOS 信号 | 切换到备用光纤 |
| PTP 时钟失锁 | 时间偏差超阈值 | 报警 + 使用本地自由运行时钟 |
| 温度过高 | 板载温度传感器 | 降频 + 报警 |
| 电源故障 | 双路供电 | 无缝切换 |

---

## 5. 运维监控

### 5.1 关键监控指标

| 指标 | 采集方式 | 告警阈值 |
|------|---------|---------|
| FPGA 温度 | 板载 XADC | > 85°C |
| FPGA 功耗 | INA226 电流传感器 | > 额定值 120% |
| PCIe 链路速率/宽度 | lspci / FPGA 寄存器 | 降级 (Gen3→Gen2) |
| 光模块 RX 光功率 | DOM 数字诊断 | < -15 dBm |
| 光模块温度 | DOM | > 70°C |
| PTP 偏差 | FPGA 时间寄存器 | > ±100 ns |
| 硬件 FIFO 水位 | FPGA 寄存器 | > 80% |
| 行情丢包率 | 序列号间断检测 | > 0% |

### 5.2 FPGA 内部监控总线

```bash
┌────────────────────────────────────────────┐
│                  FPGA                       │
│                                             │
│  ┌─────────────┐    ┌──────────────────┐   │
│  │ 业务逻辑     │    │ 监控采集模块      │   │
│  │ (解码/决策/  │    │                  │   │
│  │  报单)      │    │ · 计数器 (吞吐)   │   │
│  │             │◀──▶│ · 延迟统计        │   │
│  │             │    │ · 错误计数        │   │
│  │             │    │ · FIFO 水位       │   │
│  └──────┬──────┘    └────────┬─────────┘   │
│         │                    │              │
│         └────────────────────┘              │
│                    │                        │
│               PCIe DMA                       │
└────────────────────┬───────────────────────┘
                     ▼
               CPU 监控进程
               (Prometheus / Grafana)
```
### 5.3 日志与审计

```bash
FPGA 内部环形缓冲区 (BRAM)：
┌──────────────────────────────────────────┐
│ [时间戳][事件类型][详情]  │ 环形缓冲,  │
│ [time  ][event    ][data]  │ 容量 1M    │
│ [time  ][event    ][data]  │ 事件记录   │
│ ...                          │            │
└──────────────────────────────────────────┘
         │ PCIe DMA (实时流)
         ▼
   CPU 侧存储 (SSD/NVMe)
   完整审计日志 + 行情回放
```
---

## 6. 部署检查清单

### 6.1 上线前检查

```bash
□ FPGA 比特流版本确认
□ 所有光模块发射/接收功率在范围内
□ PTP 同步精度 < ±50 ns
□ 双路电源切换测试通过
□ PCIe 链路 Gen3×8 确认
□ 风扇/散热正常（温度 < 60°C @满载）
□ 备用比特流已烧录到 Flash
□ 看门狗定时器已启用
□ 风控参数已从 CPU 下发并验证
□ 模拟行情回放：解码 0 错误
□ 模拟报单回放：格式 0 错误
□ 压力测试：3M msg/s 无丢包
□ 监控指标已接入 Prometheus
```
### 6.2 应急预案

```bash
场景 A：FPGA 单板故障
  1. 自动切换到备板（< 10 μs）
  2. 备板撤光所有挂单
  3. CPU 降级到软件路径
  4. 通知运维换板
场景 B：全网故障
  1. 立刻停止所有报单
  2. 通过带外管理口手动确认
  3. 联系交易所技术支持
场景 C：PTP 失锁
  1. 切换为本地自由运行时钟
  2. 仅在本地时钟误差 < 1μs 时继续交易
  3. 否则暂停报单
```
---

## 参考资料

1. IEEE 1588-2019 Precision Time Protocol Standard
2. Xilinx PG210 - 10G/25G Ethernet Subsystem
3. Xilinx UG909 - Partial Reconfiguration User Guide
4. Solarflare ef_vi User Guide - PIO/CTPIO
5. Xilinx Alveo U250 Data Sheet (DS962)
6. 上交所 Colocation 机房技术要求

