Files
Share_Li/前端感知系统通信协议 (ICD) V2.0.md
2025-12-08 10:08:30 +00:00

39 KiB
Raw Blame History

tags, aliases, date created, date modified
tags aliases date created date modified
**前端感知系统通信协议 (ICD) V2.0**
星期一, 十二月 8日 2025, 9:01:09 上午 星期一, 十二月 8日 2025, 6:08:02 晚上

前端感知系统通信协议 (ICD) V2.0

文档编号: FES-SW-ICD-002

版本: V2.0 (FPGA-Adapted)

适用架构: Host (CPU/GPU) <-> Device (Pure Logic FPGA)

物理链路: 10Gbps Ethernet (UDP/IP)


0. 设计变更与迁移指南 (Design Change Log)

0.1 变更综述 (Executive Summary)

V2.0 协议并非 V0.1 的简单增量更新,而是基于 “软件定义雷达 (SDR)”“异构计算适配 (Heterogeneous Computing)” 理念的架构级重构。本次迭代的核心目标是解决 V0.1 在高带宽吞吐瓶颈软硬件强耦合可靠性机制缺失三大方面的系统性缺陷。

V2.0 引入了 RFC 标准化报文头混合对齐策略微单位整数物理层以及 RMA 维护通道,确保系统能够支撑 10Gbps 线速传输,并具备向后兼容的长期演进能力。

0.2 详细变更对照表

1. 架构与拓扑设计 (Architecture & Topology)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
拓扑依赖 强耦合 (IP Binding)
依赖 IP 地址 (192.168.0.x) 区分阵面。
完全解耦 (Logical SourceID)
新增 SourceID 字段,支持 DHCP 及动态组网。
支持即插即用离线数据分析pcap无需依赖环境 IP 表。
传输单元 MTU 1500 (Standard)
未明确定义,默认为标准帧。
MTU 9000 (Jumbo Frame)
强制开启巨型帧。
将 CPU 中断频率降低 6 倍,消除 10Gbps 吞吐下的系统调用瓶颈。
维护通道 无 (None)
仅支持预定义命令。
RMA Protocol
引入 OpCode 0xFF,支持内存/寄存器直接读写。
实现波形文件的动态下载与任意寄存器的带外调试,无需修改协议固件。

2. 数据结构与内存布局 (Data Structure & Memory)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
报文头对齐 非对齐 (15 Bytes)
奇数长度头部,导致 Payload 内存错位。
自然对齐 (32 Bytes)
强制 8 字节对齐,填充至 Cache Line 边界。
适配 FPGA 256-bit 总线与 CPU AVX 指令集,实现零拷贝 (Zero-Copy) DMA。
字节对齐 1-Byte Packed
紧凑排列,无填充。
Hybrid Alignment (混合策略)
控制面紧凑,数据面/关键字段强制对齐。
在节省带宽与降低 CPU 访问开销(避免非对齐异常)之间取得最佳平衡。
校验算法 XOR / Sum
抗干扰能力弱,无法检测双位翻转。
CRC-32C (Castagnoli)
硬件加速指令级校验。
极大地降低漏检率,特别是在雷达高功率发射环境下的突发误码检测。
扩展性 无预留
新增字段需破坏现有结构。
预留保留区 (Reserved)
控制面预留 60+ 字节,且置于 CRC 保护下。
确保协议升级时旧版固件不崩溃,支持向后兼容。

3. 物理量定义与精度 (Physics & Precision)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
频率定义 索引码 (uint8)
0=15.5GHz, Step=10MHz。
范围锁定,无法捷变。
绝对物理值 (uint64)
单位Hz。
例:15,500,000,000
解耦硬件支持任意波段Ku/Ka、任意步进的频率捷变与抗干扰策略。
角度定义 量化整数 (int16)
LSB=0.0025°。
存在量化噪声GPU 需转换。
微单位整数 / 浮点接口
传输层:int32 (\mu^\circ)。
应用层:double (Deg)。
消除量化误差:精度提升至 10^{-6} 度,满足 AI 波束成形算法的高精度需求。
增益控制 量化步进 (uint16)
LSB=0.5dB。
依赖硬件非线性特性。
物理增益 (int32/float)
单位mdB / dB。
FPGA 查表映射。
算法闭环:后端直接下发期望增益,底层自动校准,简化业务逻辑。
回波归一化 无 (None)
仅传 ADC 原始值 (Int16)。
后端无法计算 RCS。
Scale Factor (float)
随包下发物理归一化因子。
数据自描述GPU 可直接还原真实电压/功率,无需同步查询增益状态。

4. 可靠性与时序控制 (Reliability & Timing)

变更维度 V0.1 / V1.0 (Legacy) V2.0 (Current) 设计动机与技术收益
幂等性 缺失
ACK 丢包会导致指令重复执行(如电机步进 2 次)。
SeqID 去重
FPGA 缓存 Last_SeqID,重复包仅回 ACK 不执行。
防止状态过冲:确保控制指令在不可靠网络下的绝对确定性执行。
超时策略 激进 (未定义/短)
易受 OS 调度抖动影响触发重传。
宽松 (20ms)
适配 Windows/Linux 非实时核调度。
减少网络风暴:避免因系统卡顿导致的虚假超时与不必要的重传。
丢包处理 无规范
直接拼接或补零。
相干补零 (Coherent Zero-Pad)
严格补复数零 (0+j0)。
保障信号完整性:防止时域数据缺失导致的脉冲压缩相位错位与测距误差。
自闭环调度 开环 (Open Loop)
发多少脉冲依赖“停止”指令。
Pulse Count (自闭环)
指令携带脉冲数FPGA 计数自动停止。
消除网络延迟风险:防止因网络拥塞导致的发射机“长发”事故。

5. 字段级优化细节 (Field Optimization)

  • 废弃 (Deprecated): Bit-fields (位域) —— 调试困难易引发竞态条件。V2.0 全面改为 uint8 枚举。
  • 废弃 (Deprecated): FreqCode (频率码) —— 扩展性极差。
  • 新增 (New): Token (事务令牌) —— 支持异步非阻塞驱动模型。
  • 新增 (New): ADC Status (状态字) —— 实时标记饱和与链路质量。
  • 新增 (New): Sample Offset (采样偏移) —— 支持超长脉冲乱序重组。

1. 总则与约束 (General Provisions)

1.1 协议设计哲学:微单位整数 (Micro-Unit Integer)

为兼顾后端算法SPS对高精度的需求与前端硬件FPGA对整数运算的偏好V2.0 协议废弃了 V1.0 中低精度的量化因子(如 0.0025° LSB也放弃了 V2.0 初稿中激进的 IEEE 754 浮点直传方案,转而采用工业界成熟的 “微单位整数 (Micro-Unit Integer)” 策略。

  • 后端视角(高精度):软件驱动层负责将物理浮点数无损转换为微小单位的整数(例如将 45.123456^\circ 转换为 $45,123,456$)。这一精度(10^{-6} 量级)远超物理硬件极限,确保了数据在传输层不引入任何不可忽略的量化噪声。
  • 前端视角(纯整数)FPGA 将所有字段视为标准的定点整数Integer无需消耗逻辑资源去实现浮点运算单元FPU。波束解算与相位控制将全部通过高效的整数位移与乘加运算完成。

1.2 物理量数据类型定义

所有控制指令中的物理量必须遵循以下严格的类型与单位定义:

物理量分类 协议数据类型 基础单位 (Unit) 换算公式 (Software View) FPGA 处理逻辑 示例
频率 (Freq) uint64 Hz (赫兹) Val_{phy} = Val_{raw} 直接写入 DDS 频率控制字 (FCW) 15.5GHz \to 15,500,000,000
角度 (Angle) int32 $\mu^\circ$ (微度) Val_{phy} = Val_{raw} \times 10^{-6} 整数乘法 + 移位计算移相器状态 45.0° \to 45,000,000
增益 (Gain) int32 mdB (毫分贝) Val_{phy} = Val_{raw} \times 10^{-3} 查表 (LUT) 映射衰减器电压 30.5dB \to 30,500
时间 (Time) uint64 ns (纳秒) Val_{phy} = Val_{raw} \times 10^{-9} (sec) 直接与 PTP 计数器比较 1 秒 \to 1,000,000,000
带宽 (BW) uint64 Hz (赫兹) Val_{phy} = Val_{raw} 用于配置 DDC 抽取率 100MHz \to 100,000,000

1.3 基础架构约束

  • 适配器模式 (Adapter Pattern)
    • SPS 主机端的驱动层必须实现 “物理量 \leftrightarrow 微单位整数” 的透明转换层。
    • 上层算法业务代码应始终操作 doublefloat 类型的物理值,严禁在业务逻辑中直接硬编码整数魔数。
  • 字节序 (Endianness)
    • 统一采用 Little-Endian (小端模式),符合 x86 主机与大多数 ARM/FPGA 软核的内存布局习惯。
  • 物理链路与 MTU
    • 物理层10Gbps SFP+ 光纤以太网。
    • 传输层UDP/IP (IPv4)。
    • MTU强制开启 Jumbo Frames (9000 Bytes),以降低高带宽回波数据传输时的 CPU 中断频率。

1.4 混合对齐策略 (Hybrid Alignment)

为平衡传输带宽与处理效率,协议在不同平面采用不同的对齐策略:

  1. 控制平面 (SPS \to DACS)

    • 采用 1-Byte Packed (紧凑模式)
    • 理由控制指令数据量小FPGA 解析状态机FSM处理逐字节提取Shift-Register非常高效且无需关心 CPU 的缓存行对齐问题。
  2. 数据平面 (DACS \to SPS)

    • 采用 8-Byte Natural Alignment (自然对齐)
    • 理由:高通量回波数据必须适配主机 CPU/GPU 的内存访问特性。数据包头Header将填充至 Cache Line 边界,确保后续的原始 I/Q 载荷Payload起始地址严格对齐从而支持 Zero-Copy DMAGPU Direct Storage 技术。

2. 通用报文头 (Common Header)

设计原则:

所有 UDP 报文(包括控制、状态、回波数据及 RMA 维护包)均强制包含此标准头。该头部长度严格固定为 32 Bytes (256 bits),且内部关键字段均按 8-Byte 自然对齐 排列。这一设计不仅适配 64 位 CPU 的内存访问特性,更完美契合 FPGA 内部常见的 256-bit AXI-Stream 数据总线,确保硬件解析实现“零填充、零移位”的高效处理。

2.1 报文头结构定义

偏移 (Offset) 字段名 (Field Name) 数据类型 说明与约束
0 Magic Word uint32 协议同步魔数,固定为 0x55AA55AA
用于从二进制流中快速定位帧首,防止滑窗错误。
4 SeqID uint32 全局包序列号。发送端单调递增,接收端用于丢包检测与乱序重排。
8 Timestamp uint64 PTP 纳秒时间戳
统一使用 Unix Epoch (1970-01-01 00:00:00 ns),用于全系统时序对齐。
16 PayloadLen uint16 后续载荷 (Payload) 的有效字节长度。
不包含本 Header 的 32 字节。
18 PacketType uint16 报文类型标识:
0x01: Control (控制指令)
0x02: Status (状态遥测)
0x03: Data (回波数据)
0xFF: RMA (维护通道)
20 ProtoVer uint8 协议版本号
高 4 位为主版本,低 4 位为次版本。
当前 V2.0 对应 0x20
21 SourceID uint8 源设备逻辑 ID (拓扑解耦的关键)。
0x01: SPS (主控)
0x10: DACS-Broadcast
0x11~0x1F: DACS-Unicast
22 FrameFlags uint16 分帧标志位 (Bitmask)
用于处理跨 UDP 包的巨型数据帧重组。
Bit0: SOF (Start of Frame)
Bit1: EOF (End of Frame)
Bit2-15: Reserved (0)
24 Reserved uint8[8] 对齐填充
必须全填 0x00。确保 Header 总长为 32 字节,且后续 Payload 起始地址满足 8 字节对齐。

2.2 内存布局图解 (Memory Layout)

| 0      1      2      3      | 4      5      6      7      | (Byte Offset)
+-----------------------------+-----------------------------+
|         Magic Word          |           Seq ID            |
+-----------------------------+-----------------------------+
|                      Timestamp (Lo)                       |
+-----------------------------+-----------------------------+
|                      Timestamp (Hi)                       |
+-----------------------------+-----------------------------+
|  PayloadLen  |  PacketType  |  Ver | SrcID  | FrameFlags  | <--- 紧凑信息区
+-----------------------------+-----------------------------+
|                     Reserved (8 Bytes)                    |
+-----------------------------+-----------------------------+

2.3 关键字段语义详解

2.3.1 版本控制 (ProtoVer) —— 解决“协议锁死”

  • 机制:接收端解析器首先检查 ProtoVer
    • ProtoVer == 本地版本:正常全速解析。
    • ProtoVer > 本地版本进入兼容模式或报错防止将新版新增字段误读为乱码避免未定义的行为Undefined Behavior
  • 优势支持全系统的灰度发布。例如SPS 可以先升级到 V2.1,同时兼容旧版 V2.0 的 DACS 硬件,无需强制停机全网升级。

2.3.2 源标识 (SourceID) —— 解决“拓扑依赖”

  • 机制:彻底解耦 IP 地址。SPS 接收逻辑不再依赖 src_ip 进行设备区分。
  • ID 分配表
    • 0x01: Signal Processing System (SPS)
    • 0x11: DACS - Array 01 (Front)
    • 0x12: DACS - Array 02 (Left)
    • 0x13: DACS - Array 03 (Right)
  • 优势
    • 离线分析:在 Wireshark 脱机分析pcap 回放)时,即使没有 IP 环境信息,也能精确识别数据来源。
    • 动态部署:支持 DHCP 环境下的即插即用,硬件更换无需重新绑定 IP。

2.3.3 帧标志 (FrameFlags) —— 解决“数据拼图”

  • 背景一个完整的相干处理间隔CPI回波数据可能高达数 MB远超 UDP MTU9000 Bytes必须拆分为数百个 UDP 包传输。
  • 逻辑定义
    • 单包帧 (Single Packet): 数据很小,一个包发完。
      • 设置 SOF=1, EOF=1
    • 多包帧 - 首包 (First Packet):
      • 设置 SOF=1, EOF=0
    • 多包帧 - 中间包 (Middle Packet):
      • 设置 SOF=0, EOF=0
    • 多包帧 - 尾包 (Last Packet):
      • 设置 SOF=0, EOF=1
  • 优势:接收端无需解析 Payload 内容即可在链路层判断帧边界。若发生中间丢包Sequence 跳变且无 EOF可立即丢弃当前半帧数据快速复位状态机防止错误数据污染后续流水线。

3. 控制平面 (Control Plane)

方向: Signal Processing System (SPS) \to Data Acquisition Control System (DACS)

协议: UDP Unicast

端口: 20000 (Base Port) + DACS_ID

报文总长: 固定 160 Bytes (32 Bytes Common Header + 128 Bytes Control Payload)

3.1 设计约束

  1. 手动对齐 (Manual Padding): 尽管协议定义允许紧凑排列,但在关键的 64-bit 浮点数之前显式插入填充字节,强制实现 4-Byte/8-Byte 伪自然对齐。这使得 ARM/x86 处理器能以单指令周期读取 double 字段,避免昂贵的非对齐访问异常。
  2. 末尾校验 (Tail Checksum): 校验字段 CRC32 被强制固定在载荷的最末尾Offset 124。这种布局确保了中间的大片保留区域Reserved均处于 CRC 保护范围内,且未来在保留区新增字段时不会破坏 CRC 的位置定义,完美保障向后兼容性
  3. 自闭环调度: 引入 Pulse Count 字段。FPGA 收到指令后,将严格执行指定数量的脉冲发射,完成后自动停止发射并转入空闲状态,消除因网络延迟导致的波束过时或“长发”风险。

3.2 载荷定义 (Control Payload)

相对偏移 (Offset) 字段名 (Field Name) 数据类型 单位 (Unit) 说明与物理定义
0 Command Mode uint8 - 工作模式
0: Standby (待机/静默)
1: Search (搜索)
2: Track (跟踪)
3: Calibrate (内/外校准)
1 Waveform ID uint8 Index 基础波形索引
指向 FPGA 内部 DDR 预存的波形表(如 LFM 基带数据)。
2 Reserved_Pad uint8[2] - 对齐填充
必须填 0x00。确保后续 Azimuth 从 Offset 4 开始。
4 Azimuth double Deg 方位角 (\theta)
IEEE 754 标准双精度浮点,范围 [-90.0, 90.0]
12 Elevation double Deg 俯仰角 (\phi)
IEEE 754 标准双精度浮点,范围 [-90.0, 90.0]
20 Center Freq uint64 Hz 载波中心频率
绝对物理值(如 15,500,000,000),直接控制本振 (LO)。
28 Bandwidth uint64 Hz 信号瞬时带宽
用于配置接收机 DDC 滤波器的抽取率与带宽。
36 Pulse Width uint32 ns 脉冲宽度 (\tau)
发射波形的有效持续时间,决定雷达盲区与平均功率。
40 PRF uint32 Hz 脉冲重复频率
决定最大无模糊距离。
44 Sample Points uint32 Count 快拍数 (Range Gates)
单次脉冲回波的 ADC 采样点数(如 4096
48 Pulse Count uint32 Count 驻留脉冲数 (N_{cpi})
本次 CPI 包含的脉冲总数。FPGA 计数达到此值后自动停止。
52 Gain Target float dB 期望增益
IEEE 754 单精度浮点。DACS 需将其映射为衰减器电压。
56 Wave_Param1 uint32 - 波形动态参数 1
例如 LFM 的调频斜率 (Slope) 或相位编码的初相。
60 Wave_Param2 uint32 - 波形动态参数 2
预留给特定波形的高级控制参数。
64 Reserved uint8[60] - 扩展保留区
必须全填 0x00处于 CRC 保护之下
124 CRC32 uint32 - 完整性校验
算法CRC-32C (Castagnoli)。
范围:覆盖 Offset 0 ~ 123 (共 124 字节)。

3.3 内存布局图解 (Memory Layout)

为了满足底层驱动开发Driver Development与 FPGA 逻辑校验的需求,本节提供载荷的RFC 标准比特视图Mermaid 现代化视图。所有多字节字段(uint16 / uint32 / uint64 / double)均遵循 Little-Endian (小端序) 排列。

3.3.1 RFC 标准比特视图 (Bit-Level View)

此视图主要用于核对字节偏移量Offset与字边界Word Boundary。每行代表 32-bit (4 Bytes),左侧为起始偏移量。

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Command Mode |  Waveform ID  |      Reserved_Pad (0x0000)    | 0x00
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Azimuth (IEEE 754 double)                 | 0x04
+                                                               +
|                       (8 Bytes Total)                         | 0x08
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Elevation (IEEE 754 double)                | 0x0C
+                                                               +
|                       (8 Bytes Total)                         | 0x10
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Center Freq (uint64)                    | 0x14
+                                                               +
|                       (8 Bytes Total)                         | 0x18
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Bandwidth (uint64)                     | 0x1C
+                                                               +
|                       (8 Bytes Total)                         | 0x20
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Pulse Width (uint32)    |           PRF (uint32)        | 0x24 / 0x28
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Sample Points (uint32)   |       Pulse Count (uint32)    | 0x2C / 0x30
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Gain Target (float)     |       Wave_Param1 (uint32)    | 0x34 / 0x38
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Wave_Param2 (uint32)    |    Reserved (Start 0x40…)   | 0x3C / 0x40
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
/                   Reserved (Total 60 Bytes)                   /
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         CRC32 (End)                           | 0x7C
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

3.3.2 可视化布局 (Mermaid Packet)

此视图直观展示了字段在 32-bit 宽度下的连续性,重点体现了 Reserved_Pad 带来的对齐效果。

packet-beta
title 128-Byte Radar Payload (32-bit Width)
0-7: "Cmd Mode (u8)"
8-15: "Wave ID (u8)"
16-31: "Reserved_Pad (u16)"
32-95: "Azimuth (double - 64 bits)"
96-159: "Elevation (double - 64 bits)"
160-223: "Center Freq (u64)"
224-287: "Bandwidth (u64)"
288-319: "Pulse Width (u32)"
320-351: "PRF (u32)"
352-383: "Sample Points (u32)"
384-415: "Pulse Count (u32)"
416-447: "Gain Target (float)"
448-479: "Wave_Param1 (u32)"
480-511: "Wave_Param2 (u32)"
512-991: "Reserved (60 Bytes)"
992-1023: "CRC32"

3.3.3 逻辑功能框图 (Functional Block)

此视图按照业务逻辑对字段进行分组,便于上层应用开发理解各参数的物理归属。

block-beta
  columns 4
  block:header:4
    CMD["Cmd (u8)"] ID["ID (u8)"] PAD["Pad (u16)"]
  end
  block:angles:4
    AZ["Azimuth (double - 8B)"]:2 EL["Elevation (double - 8B)"]:2
  end
  block:rf:4
    FREQ["Center Freq (u64 - 8B)"]:2 BW["Bandwidth (u64 - 8B)"]:2
  end

  PW["PulseWidth (u32)"] PRF["PRF (u32)"] SAM["Samples (u32)"] CNT["PulseCount (u32)"]
  GAIN["Gain (float)"] P1["Param1 (u32)"] P2["Param2 (u32)"] RES_START["Reserved…"]
  block:footer:4
    RES_BODY["…Reserved (60 Bytes)…"]:3 CRC["CRC32"]:1
  end

  style PAD fill:#f9f,stroke:#333,stroke-dasharray: 5 5
  style CRC fill:#f96,stroke:#333,stroke-width:2px
  style AZ fill:#bbf
  style EL fill:#bbf

3.3.4 关键字段说明

  • 对齐填充 (Reserved_Pad):
    • 位置: Offset 2-3 (2 Bytes)。
    • 作用: 强制将当前的写入指针推移至 Offset 4。这确保了随后的 Azimuth (double, 8 bytes) 能够从 4 字节边界 开始存储。这对于 ARM 架构(如 Zynq/MPSoC至关重要能防止非对齐访问Unaligned Access引起的总线异常或性能惩罚。
    • 值约束: 必须填 0x0000
  • 浮点数标准 (Azimuth / Elevation / Gain):
    • Double (64-bit): 遵循 IEEE 754 双精度标准,符号位在最高位。
    • Float (32-bit): Gain Target 使用单精度浮点,以节省空间,因为 0.1 dB 的精度对于增益控制已足够。
  • 末尾校验 (CRC32):
    • 位置: Offset 124 (最后 4 字节)。
    • 覆盖范围: Offset 0 ~ 123包含前面的 Reserved 区域)。
    • 封闭性: 这种设计使得整个 128 字节结构体是一个自包含的“安全胶囊”。任何对保留区的无意篡改(如内存越界写)都能被 CRC 检出。

根据您的深度审查结果与修正建议我重写了第四章“数据平面Data Plane”。

本次修订通过引入 RFC 标准视图与关键的物理辅助字段,彻底解决了原始数据“物理意义缺失”、“长脉冲组包困难”及“质量状态盲区”三大核心业务痛点。新的设计在严格维持 32 字节头部限制的同时,赋予了数据流**自我解释Self-Describing自我诊断Self-Diagnostic**的能力。

以下是重写后的第四章内容:


4. 数据平面 (Data Plane)

方向: Data Acquisition Control System (DACS) \to Signal Processing System (SPS)

协议: UDP Unicast

端口: 30000 (Base Port) + DACS_ID

报文结构: [Common Header (32B)] + [Data Specific Header (32B)] + [Padding (64B)] + [RAW Payload]

4.1 关键设计准则

  1. 物理闭环 (Physical Scaling): 引入 Scale Factor 字段。FPGA 端负责将当前的模拟增益 (MGC)、ADC 参考电压及数字截断位数综合为一个浮点归一化因子。后端 GPU 仅需执行简单的乘法 (Val * Scale) 即可还原真实的物理电压或功率值,彻底解耦了复杂的射频前端状态。
  2. 长脉冲支持 (Long Pulse): 引入 Sample Offset 字段。针对宽带 LFM 长脉冲产生的超大采样数据块(超过单帧 MTU 9000通过显式的偏移量指示确保后端能将乱序到达的 UDP 分片无误地重组到显存的正确位置。
  3. 质量感知 (Quality Aware): 引入 ADC Status 字段。实时标记当前脉冲是否存在 ADC 饱和Clipping或链路丢数使后端 DSP 算法能及时剔除无效数据,避免虚假目标生成。

4.2 数据专用头 (Data Specific Header)

该头部紧随通用报文头之后,长度固定为 32 Bytes。采用紧凑的布局设计,最大化信息密度。

4.2.1 RFC 风格比特视图 (Bit View)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------------------------------------------------------+
|                        CPI Index (4B)                         |
+---------------------------------------------------------------+
|                       Pulse Index (4B)                        |
+---------------------------------------------------------------+
|                       Sample Rate (4B)                        |
+---------------------------------------------------------------+
|                       Sample Count (4B)                       |
+---------------------------------------------------------------+
|                      Sample Offset (4B)                       |
+---------------------------------------------------------------+
|                      Scaling Factor (4B)                      |
|                       (IEEE 754 Float32)                      |
+---------------------------------------------------------------+
|          Channel Mask         |   Data Type   |   ADC Status  |
|           (16 bits)           |    (8 bits)   |    (8 bits)   |
+---------------------------------------------------------------+
|                            Reserved                           |
|                       (32-bit Alignment)                      |
+---------------------------------------------------------------+

4.2.2 字段语义详解

相对偏移 (Offset) 字段名 (Field Name) 数据类型 说明与业务逻辑
0 CPI Index uint32 相干处理间隔索引
宏观时间计数,标识当前数据属于哪一次波束驻留任务。
4 Pulse Index uint32 脉冲索引
微观时间计数,当前 CPI 内的第 N 个脉冲(从 0 开始)。
8 Sample Rate uint32 采样率 (Hz)
当前数据的 ADC 采样频率,用于时频变换参考。
12 Sample Count uint32 本包采样点数
当前 UDP 包 Payload 中包含的有效复数点数 (N)。
Payload 字节数 = $N \times 2 \times \text{通道数} \times \text{字节深}$。
16 Sample Offset uint32 采样偏移量
指示本包数据在完整脉冲回波序列中的起始位置(点数)。
首包为 0后续分片包以此递增。
20 Scale Factor float 物理归一化因子
IEEE 754 单精度浮点。
计算公式:$V_{phys} = \text{RawInt16} \times \text{ScaleFactor}$。
24 Channel Mask uint16 通道掩码
Bit0: \Sigma (和路/主通道)
Bit1: \Delta_{Az} (方位差)
Bit2: \Delta_{El} (俯仰差)
Bit3: Aux (辅助/旁瓣对消)
26 Data Type uint8 数据格式类型
0x00: Int16 (I/Q 交织, 标准格式)
0x01: Float32 (调试模式)
0x02: Int32
27 ADC Status uint8 ADC 健康状态字
Bit0: CH0 Saturation (饱和告警)
Bit1: CH1 Saturation
Bit7: Link Error (SerDes 链路失锁)
28 Reserved uint32 对齐保留
必须填 0x00。确保 Header 结束于 32 字节边界。

4.3 原始载荷 (Raw Payload)

  • 布局: 紧随 64 字节的 Padding 之后。

  • 内存对齐: 由于 Padding 的存在Payload 的起始地址相对于以太网帧头偏移量为 32+32+64 = 128 字节。这是 64-byte Cache Line 的整数倍,完美适配 CPU/GPU 的 DMA 突发传输要求。

  • 数据排列 (Int16 模式):

    [I0_Ch0][Q0_Ch0] [I0_Ch1][Q0_Ch1] … [I1_Ch0][Q1_Ch0] …
    
    • I/Q: 16-bit Signed Integer (Little Endian).
    • 多通道: 按点交织 (Point-Interleaved),即先排所有通道的第 0 点,再排第 1 点。这种排列最利于 GPU SIMD 并行读取。

5. 维护平面 (RMA Protocol)

方向: 双向 (SPS \leftrightarrow DACS)

协议: UDP Unicast

端口: 40000 (Base Port) + DACS_ID

报文结构: [Common Header (32B)] + [RMA Header (16B)] + [Data Payload]

5.1 关键设计准则

  1. 强制对齐 (Alignment Enforcement): RMA 头部长度被扩充并锁定为 16 Bytes。结合 32 Bytes 的通用头Payload 的绝对起始偏移量为 48 Bytes。这既是 8 字节的倍数也是 16 字节的倍数,确保 CPU AVX 指令集与 FPGA AXI 总线 DMA 引擎均能以最高效率进行突发读写。
  2. 异步事务 (Async Transaction): 引入 Token 字段。SPS 驱动层可为每个读写请求分配唯一的令牌(如 UUID Hash 或自增 IDDACS 在响应时必须原样回传该令牌。这使得上层软件能够采用高效的异步 Promise/Future 模式,无需阻塞等待 IO彻底消除了并发请求下的乱序匹配风险。
  3. 显式状态 (Explicit Status): 引入 Status 字段。DACS 不再仅仅是“沉默的执行者”,而是具备了反馈能力。针对地址越界、写保护或硬件超时等异常情况,能明确返回错误码,极大降低了系统集成的调试难度。

5.2 RMA 专用头 (RMA Specific Header)

该头部紧随通用报文头之后,长度固定为 16 Bytes

5.2.1 RFC 风格比特视图 (Bit View)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------------------------------------------------------+
|    OpCode (8) |   Target (8)  |   Status (8)  |  Reserved (8) |
+---------------------------------------------------------------+
|                         Token (32 bits)                       |
|               (Transaction ID for Async Match)                |
+---------------------------------------------------------------+
|                        Address (32 bits)                      |
|               (Target Memory/Register Offset)                 |
+---------------------------------------------------------------+
|                         Length (32 bits)                      |
|                     (Payload Size in Bytes)                   |
+---------------------------------------------------------------+
|                                                               |
|                     Data Payload (Variable)                   |
|                  (Start at Offset 48, Aligned)                |
|                                                               |
+---------------------------------------------------------------+

5.2.2 字段语义详解

相对偏移 (Offset) 字段名 (Field Name) 数据类型 说明与业务逻辑
0 OpCode uint8 操作码
请求 (Req): 0x01=Write, 0x02=Read
响应 (Resp): 0x81=Write Ack, 0x82=Read Resp
1 Target uint8 目标区域
0x00: FPGA Regs (32-bit MMIO)
0x01: Waveform DDR (Bulk Memory)
0x02: Flash (Firmware Update)
2 Status uint8 响应状态码 (仅响应包有效,请求包填 0)。
0x00: Success (成功)
0x01: Invalid Addr (地址无效/越界)
0x02: Write Protected (写保护)
0x03: Hardware Timeout (硬件超时)
0x04: Bad Length (长度非法)
3 Reserved uint8 对齐填充
必须填 0x00
4 Token uint32 事务令牌
由主机驱动生成建议单调递增。FPGA 必须在响应包中原样拷贝此字段,用于软件层的 Request-Response 匹配。
8 Address uint32 目标地址
对于寄存器 (Target=0x00),为寄存器偏移量。
对于 DDR/Flash为绝对字节地址。
12 Length uint32 载荷长度
单位:字节。
对于写操作Payload 的实际长度。
对于读操作:请求读取的长度。

5.3 典型交互流程 (Transaction Flow)

场景 1波形下载 (Write Waveform)

  1. SPS 发送:

    • OpCode: 0x01 (Write)
    • Target: 0x01 (DDR)
    • Token: 0x12345678
    • Address: 0x10000000
    • Length: 4096
    • Payload: [4KB Waveform Data…]
  2. DACS 响应:

    • OpCode: 0x81 (Write Ack)
    • Status: 0x00 (Success)
    • Token: 0x12345678 (原样返回)
    • Length: 0 (无 Payload)

场景 2并发状态轮询 (Async Read)

  1. SPS 发送请求 A (读温度): Token=101, Addr=0x10 (Temp Reg)

  2. SPS 发送请求 B (读电压): Token=102, Addr=0x20 (Volt Reg)

  3. DACS 响应 B (先返回): Token=102, Status=Success, Payload=[电压值]

    • 软件驱动层: 唤醒 Promise B 的回调。
  4. DACS 响应 A (后返回): Token=101, Status=Success, Payload=[温度值]

    • 软件驱动层: 唤醒 Promise A 的回调。

6. 校验与可靠性 (Reliability & Timing)

适用范围: 全系统 (SPS + DACS)

目标: 确保在 UDP 不可靠传输协议之上构建满足雷达战术指标的确定性Determinism与安全性Safety

6.1 控制平面:幂等性设计 (Idempotency)

风险: 由于 UDP ACK 丢包导致的 SPS 重传,可能使 DACS 重复执行增量指令(如“步进 1°”被执行两次变成 2°导致物理状态与软件状态失步。

修正: DACS (FPGA) 必须实现基于 SeqID 的指令去重逻辑。

6.1.1 FPGA 接收状态机逻辑

FPGA 内部需维护一个寄存器 Last_Executed_SeqID(初始化为 0。当收到新的控制指令PacketType=0x01 或 RMA=0xFF执行如下判定

  1. 新指令 (SeqID_{new} > SeqID_{last}):

    • 动作: 立即执行指令。
    • 更新: SeqID_{last} \leftarrow SeqID_{new}
    • 回复: 发送 ACK携带 $SeqID_{new}$)。
  2. 重传指令 (SeqID_{new} == SeqID_{last}):

    • 动作: 严禁执行Drop Payload。这表明上一条 ACK 丢失SPS 进行了重传。
    • 更新: 保持不变。
    • 回复: 重发 ACK(携带 $SeqID_{new}$)。
  3. 乱序旧指令 (SeqID_{new} < SeqID_{last}):

    • 动作: 直接丢弃。
    • 回复: 无需回复。

注意: 对于 SeqID 循环溢出Wraparound的情况FPGA 需处理 0 > 0xFFFFFFFF 的特例逻辑,或由 SPS 在会话建立时重置。


6.2 控制平面:重传与超时 (Retransmission Strategy)

现状: 通用操作系统Linux/Windows 非实时核)的线程调度抖动通常在 10ms~20ms 量级。过激的超时设置会导致虚假重传。

修正: 采用宽松的超时阈值,配合安全互锁机制。

6.2.1 计时器参数

参数项 推荐值 说明
Initial Timeout 20ms 初始等待时间。涵盖了 "RTT + FPGA 处理时间 + OS 调度抖动"。
Max Retries 3 次 最大重试次数。
Link Down Time 100ms 判定链路断开的总时间阈值 (20ms \times (1+3) + \Delta)。

6.2.2 故障处理流程

  1. SPS 发送: 发出指令,启动 20ms 计时器。

  2. SPS 等待:

    • 若收到 ACK 且 Ack.SeqID == Cmd.SeqID: 事务成功,清除计时器。
    • 若 20ms 超时: Retry_Cnt++重发指令SeqID 不变)。
  3. SPS 放弃:

    • Retry_Cnt > 3: 判定链路故障 (Link Down)。
    • 安全互锁 (Safety Interlock): SPS 必须立即停止后续波束调度,并向上层业务软件抛出 E_LINK_LOST 异常。若系统包含硬件看门狗DACS 应在 100ms 无指令后自动切断发射机高压。

6.3 数据平面:丢包处理 (Data Loss Handling)

风险: UDP 回波数据丢失会导致时间轴断裂。如果直接跳过丢失的数据块,会导致后续脉冲压缩(匹配滤波)输出的峰值位置偏移,从而产生巨大的测距误差。

修正: 必须采用 " 相干补零 (Coherent Zero-Padding)" 策略。

6.3.1 补零规范

当 SPS 检测到丢包(通过 SeqID 跳变或 Pulse/Offset 不连续)时,必须在接收 Buffer 中填充数据,填补空缺,维持时间轴对齐。

  • 填充内容: 复数零 (0 + j0)
    • I 路 = 0 (0x0000)
    • Q 路 = 0 (0x0000)
  • 填充长度: 严格等于丢失的采样点数 $N_{lost}$。
    • $N_{lost} = (Offset_{curr} - Offset_{prev} - Len_{prev}) / BytesPerSample$。

6.4 校验和 (Checksum)

为了在应用层确保数据完整性抵御链路误码Bit-flip和总线错误

  1. 控制/维护包: 强制开启 CRC-32COffset 124

    • DACS 收到包后,硬件计算 CRC。若校验失败直接静默丢弃,不回 NACK防止 NACK 风暴。SPS 会因超时自动重传。
  2. 高速数据包: 依赖链路层Ethernet FCS校验。

    • 应用层不额外增加 CRC 字段,以节省 FPGA 逻辑资源并降低 PCIe 带宽开销。链路层校验错误的包会被网卡NIC直接丢弃SPS 软件层通过 Sequence ID 即可感知丢包。