一.混合架构总体设计
总体架构图(无 MUX 架构 - MII 直接挂 FPGA):架构选择理由: PHY 的 MII 总线只接 FPGA,STM32 不占用 ETH MAC 外设。STM32 通过 FMC→DPRAM→FPGA 透传访问网络,避免 MII 总线冲突,消除 SAFEOP→OP 切换风险,SDO 路径统一。

二.分工模式

关键设计原则
原则 1:FPGA 只做"硬实时"任务
凡是"非周期"或"协议复杂"的,统统交给 SOEM。FPGA 只负责"在每个 2ms 周期必须发生、且时序必须精确到 ns"的事。
原则 2:SOEM 只做"软实时"任务
协议处理、SDO 配置、应用逻辑,由 SOEM 在 STM32 上运行。STM32 中断响应 ~100ns 是可接受的,因为这些任务不在 Sync0 关键路径上。
原则 3:DPRAM 作为唯一数据通道
STM32 与 FPGA 之间不使用 SPI/UART,而使用 FMC 总线映射的双端口 RAM。原因:FMC 访问 ~20ns,SPI 访问 ~1μs,差 50 倍。32 轴 PDO 数据 ~700 字节,FMC 一周期内可读完。
关键澄清:三层帧归属
核心澄清: OP 模式下,周期 PDO 帧不是 STM32 构造的,是 FPGA 自己构造的。这正是本方案的核心设计------STM32 是"大脑"(决策+协议),FPGA 是"手脚"(定时+收发+装配),DPRAM 是"神经"(数据通道)。
OP周期内的详细分工

为什么不能让 STM32 构造 OP 帧

注意OP 期间,FPGA 不只是定时发送,而是独立完成完整的帧装配、发送、接收、解析、数据落盘全流程,STM32 只负责"喂数据"和"吃数据"。这样才能保证 100ns 抖动。
三.工作流程时序
阶段1: FPGA DC同步 (ARM上电后触发)
ARM写 REG_DC_START=1
→ FPGA ECAT_DC.v 启动
→ 读各从站0x0918/0x0920 (纳秒级时间戳)
→ 计算传播延迟 EscRecTime3 = EscRecTime1 - EscRecTime2
→ 写0x0910 偏移补偿
→ sync_done=1, 释放后续模块复位
阶段2: ARM伺服初始化 (SOEM, sync_done后启动)
ec_config_init() → 扫描32轴, 分配站地址
ec_config_map() → 配置SM/FMMU/PDO (C代码改伺服只改这里)
ec_configdc() → SOEM跳过DC(FPGA已做), 只配Sync0寄存器
ec_SDOwrite() → 下发伺服参数(模式/齿轮比等)
ec_writestate(OP) → 推进所有从站到OP态
控制字6→7→15 → 逐轴使能
阶段3: FPGA周期运行 (OP后自动启动)
cycle_trigger(2ms) → 发LRW帧(含ref_sys_time)
→ 解析响应(状态字+编码器) → 写共享RAM
→ ARM读共享RAM, 计算轨迹, 写目标位置到共享RAM
→ FPGA下周期读取目标位置, 嵌入LRW帧发送