From 81d2c8be515015a5250a0385326524006f701fe5 Mon Sep 17 00:00:00 2001 From: Klein Date: Mon, 8 Dec 2025 09:51:02 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 前端感知系统通信协议 (ICD) V2.0.md | 638 +++++++++++++++++++++++++++++ 1 file changed, 638 insertions(+) create mode 100644 前端感知系统通信协议 (ICD) V2.0.md diff --git a/前端感知系统通信协议 (ICD) V2.0.md b/前端感知系统通信协议 (ICD) V2.0.md new file mode 100644 index 0000000..b184dc8 --- /dev/null +++ b/前端感知系统通信协议 (ICD) V2.0.md @@ -0,0 +1,638 @@ +--- +tags: [] +aliases: + - "**前端感知系统通信协议 (ICD) V2.0**" +date created: 星期一, 十二月 8日 2025, 9:01:09 上午 +date modified: 星期一, 十二月 8日 2025, 5:47:25 下午 +--- + +# **前端感知系统通信协议 (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$ 微单位整数”** 的透明转换层。 + - 上层算法业务代码应始终操作 `double` 或 `float` 类型的物理值,严禁在业务逻辑中直接硬编码整数魔数。 +- **字节序 (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 DMA** 和 **GPU 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) + +```plaintext +| 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 MTU(9000 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),左侧为起始偏移量。 + +```Plaintext + 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** 带来的对齐效果。 + +```mermaid +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)** + +此视图按照业务逻辑对字段进行分组,便于上层应用开发理解各参数的物理归属。 + +```mermaid +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)** + +```Plaintext + 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 模式)**: + + ```Plaintext + [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 或自增 ID),DACS 在响应时必须原样回传该令牌。这使得上层软件能够采用高效的**异步 Promise/Future 模式**,无需阻塞等待 IO,彻底消除了并发请求下的乱序匹配风险。 +3. **显式状态 (Explicit Status)**: 引入 `Status` 字段。DACS 不再仅仅是“沉默的执行者”,而是具备了反馈能力。针对地址越界、写保护或硬件超时等异常情况,能明确返回错误码,极大降低了系统集成的调试难度。 + +### **5.2 RMA 专用头 (RMA Specific Header)** + +该头部紧随通用报文头之后,长度固定为 **16 Bytes**。 + +#### **5.2.1 RFC 风格比特视图 (Bit View)** + +```Plaintext + 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-32C**(Offset 124)。 + + - DACS 收到包后,**硬件计算** CRC。若校验失败,**直接静默丢弃**,不回 NACK(防止 NACK 风暴)。SPS 会因超时自动重传。 + +2. **高速数据包**: 依赖链路层(Ethernet FCS)校验。 + + - 应用层不额外增加 CRC 字段,以节省 FPGA 逻辑资源并降低 PCIe 带宽开销。链路层校验错误的包会被网卡(NIC)直接丢弃,SPS 软件层通过 Sequence ID 即可感知丢包。 + +--- + +## **附录: 关键改进对比** + +|**特性**|**V1.0 (旧版)**|**V2.0 (新版)**|**优势**| +|---|---|---|---| +|**角度定义**|`int16` (0.0025° LSB)|`double` (IEEE 754)|消除量化误差,支持软硬件解耦| +|**频率定义**|`uint8` (Index)|`uint64` (Hz)|支持任意频率捷变| +|**校验算法**|XOR / CRC-16|**CRC-32C**|极高的错误检出率,抗突发干扰| +|**数据对齐**|1-Byte Packed|**Header/Payload 分离**|开启 CPU Zero-Copy 和 GPU Direct Access| +|**MTU**|1500 (默认)|**9000 (Jumbo)**|CPU 中断负载降低 6 倍| +|**波形加载**|固化/有限参数|**RMA 动态加载**|支持任意复杂波形 (AI 生成波形)|