HSB FPGA 架构总体

1. 系统架构

本文分析 ./fpga/ 目录中数据采集部分的代码架构,覆盖:

  1. 如何兼容各家 FPGA(重点是 RoCEv2 网络通信支持在各平台上的差异)
  2. FPGA 平台相关代码的架构
  3. FPGA 平台无关代码的架构
  4. 平台无关代码 ↔ 平台相关代码的数据接口
  5. 平台无关代码 ↔ 传感器的数据接口

总览:目录与分层

复制代码
fpga/
├── nv_hsb_ip/                  ★ 平台无关 IP 核(NVIDIA Holoscan Sensor Bridge IP)
│   ├── top/HOLOLINK_top.sv        集成顶层(全部平台共用同一份)
│   ├── packetizer/                传感器数据重排/分包(Virtual Port)
│   ├── dp_pkt/                    数据平面报文头构造(RoCEv2 / CoE)
│   ├── roce/                      RoCE ACK 生成、ICRC 计算
│   ├── rx_parser/                 入站包分类、低速控制面、BOOTP/枚举
│   ├── sensor_tx/                 host→sensor 方向解包与流控
│   ├── eth_pkt/                   出方向 6 端口优先级仲裁
│   ├── routing_table/             bridge 模式二层学习桥
│   ├── ptp/                       IEEE 1588 PTP 从钟
│   ├── sys_init/                  上电寄存器初始化 + EEPROM 枚举
│   ├── lib_apb/ lib_axis/ misc/   APB 互连、AXIS 工具、CDC/FIFO 基础库
│   ├── reg_map/                   寄存器地址空间定义
│   └── ref_design/                可选传感器接口参考设计(i2s/imu/vsync/delayed_io)
├── terasic/s10_sensor_bridge/  ▲ 平台相关:Intel Stratix 10(2×100G,JESD204)
├── pynq/rfsoc-pynq/            ▲ 平台相关:AMD/Xilinx RFSoC PYNQ(1×100G,测试源)
├── lattice/cpnx100-eth-sensor-bridge/  ▲ Lattice CertusPro-NX(2×10G,LVDS 相机+I2S)
│   ├── cpnx100/                   主 FPGA
│   └── clnx17/                    伴随 CrossLink-NX(MIPI→LVDS 桥)
├── microchip/mfp200-eth-sensor-bridge/ ▲ Microchip PolarFire(2×10G,IMX477 MIPI)
├── nv_mipi_ref_design/         ▲ Lattice CertusPro-NX MIPI 参考设计(1×10G,2×MIPI)
├── nv_hsb_ip_simple_tb/        ● 平台无关 IP 的 UVM 风格测试平台
└── script/eeprom/              ● EEPROM 烧录工具(经 ECB/UDP 在线读写板载 EEPROM)

分层原则:所有协议处理(RoCEv2、UDP/IP、PTP、BOOTP 枚举、寄存器控制面)都收敛在 nv_hsb_ip 一份代码中;各平台目录只负责三件
事:①例化厂商以太网 MAC/PCS 并适配到统一 AXI-Stream;②例化传感器接收逻辑并适配到统一 AXI-Stream;③提供一份
HOLOLINK_def.svh 配置包。


0. 如何兼容各种 FPGA ------ 重点是 RoCEv2 支持的差异

0.1 兼容机制总述

兼容性靠三层设计实现:

  1. 同一份 IP 顶层 :所有平台都例化 fpga/nv_hsb_ip/top/HOLOLINK_top.svHOLOLINK_top,端口契约固定(见第 3 节)。
  2. 每平台一份配置包 HOLOLINK_def.svh :定义 package HOLOLINK_pkg,用 `define 宏 + localparam 数组声明本平台
    的时钟频率、接口数量、位宽、MTU、初始化寄存器序列等。HOLOLINK_top.sv 第 17 行 `include "HOLOLINK_def.svh"
    编译时由工程把对应平台的版本放在 include 路径上,实现"同代码、不同配置"。所有条件编译(ifdef)都基于这些宏,
    未定义某宏(如 SENSOR_TX_IF_INSTSPI_INSTI2C_INST)即裁剪掉对应模块与端口(HOLOLINK_top.sv:54-126)。
  3. 每平台一层"胶水逻辑" :把厂商以太网 IP 的用户接口统一适配为 HOLOLINK_top 的 AXI-Stream(HIF),把传感器物理
    层统一适配为 AXI-Stream(SIF)。这是各平台代码的主体差异。

0.2 RoCEv2 在各平台上的"同"与"不同"

相同点:RoCEv2 协议栈本身 100% 平台无关。

  • BTH/RETH 头构造、PSN/VA/buffer 轮转状态机:nv_hsb_ip/dp_pkt/dp_pkt_top.sv(opcode 仅 8'h2A RDMA_WRITE /
    8'h2B RDMA_WRITE_IMM,第 1146 行)。
  • ICRC(IB 不变域掩码 + CRC32):nv_hsb_ip/roce/roce_icrc.sv + roce/lfsr_hc.sv,CRC 多项式 0x04C11DB7
    DATA_WIDTH 参数化生成 8~512bit 并行 CRC(lfsr_hc.sv 头注释),因此 64bit 与 512bit 平台都能复用。
  • host→sensor 方向 ACK:nv_hsb_ip/roce/roce_ack.sv,由宏 SIF_TX_ROCE_RC_ENABLE 条件例化。

不同点(各平台真正的差异)在于 RoCEv2 之下的以太网 MAC 接入层与链路参数:

维度 Terasic S10 PYNQ RFSoC Lattice CPNX100 Microchip PolarFire Lattice MIPI ref
MAC/PCS Intel E-Tile 硬核 eth_100G(带 RS-FEC) Xilinx cmac_usplus:3.1(BD design_1 Lattice eth_10gb_mac + eth_10gb_pcs_* IP Microchip CORE10GMAC_C0 + PF_XCVR_ERM_C0 同 CPNX100
MAC 用户接口 Avalon-ST 512b → 需 avst_to_axis/axis_to_avst 转换 原生 AXI4-Stream 512b 直连 原生 AXI4-Stream 64b 直连 私有 SOP/EOP/BC 接口 → 需 MAC_to_AXIS 同 CPNX100
HOST_WIDTH 512 512 64 64 64
HOST_MTU 4096 4096 4096 1500(唯一) 4096
HIF_CLK_FREQ 201.416 MHz(E-Tile ÷64 钟经 PLL 二分频) 322.266 MHz(CMAC gt_txusrclk2 156.25 MHz 156.25 MHz(以 RX 恢复钟为参考的 CCC) 156.25 MHz
网口数 HOST_IF_INST 2 1 2 2 1
tuser 语义(MAC→IP) 6bit rx_error 归约或 CMAC 错误直送 FCS 错误@tlast 8bit tuser 只取 bit0 同 CPNX100
CoE (1722b) DISABLE_COE 1 关闭
Sensor→Host RoCE UC Write ✔(数据源是 ram_player 测试源)
Host→Sensor 通路 有(SENSOR_TX_IF_INST=1 有(I2S 下行) (未定义 SENSOR_TX_IF_INST
枚举/MAC 来源 EEPROM(I2C) 软 MAC 48'hCAFEC0FFEE00 EEPROM EEPROM EEPROM(预留软 MAC 宏)

几个值得注意的结论:

  • RoCEv2 用法是不对称的 :sensor→host 方向,FPGA 是 RoCE requester ,用 UC(Unreliable Connection)RDMA
    Write
    dp_pkt_top.sv:1146,无 ACK 期待);host→sensor 方向,FPGA 是 RoCE responder ,默认 UC Send ,定义
    SIF_TX_ROCE_RC_ENABLE 后改用 RC(Reliable Connection) 并由 roce_ack 生成 ACK/NAK/RNR。当前仓库中
    没有任何平台定义 SIF_TX_ROCE_RC_ENABLE (全仓库 grep 仅 HOLOLINK_top.sv 引用该宏),即所有在版平台
    host→sensor 均走 UC 无确认模式;Microchip 与 MIPI ref 甚至没有例化该方向。
  • 因为 MAC 用户接口不同,HIF 适配层是各平台特有的代码 :Terasic 的 rtl/misc/axis_to_avst.v/avst_to_axis.v
    (含 empty↔tkeep 换算、整总线字节序翻转、E-Tile 必需的整包 TX FIFO 与 402.8M→201.4M dcfifo 跨钟)、Microchip 的
    MAC_to_AXIS(SmartDesign 模块,SOP/EOP/字节计数 → tvalid/tlast/tkeep,tuser 位宽 1↔3、1↔8 适配在
    MAC_Hololink_top.v:305-317)、Lattice/Xilinx 则零转换直连。
  • MAC/PCS 寄存器初始化也是平台差异的一部分 :平台无关 IP 提供 sys_init 机制(按 HOLOLINK_def.svh 里的
    init_reg[] 数组上电自动发 APB 写),Lattice 用它写 22 条 PCS 均衡/MAC mode 寄存器(地址落在用户口
    0x1000_xxxx~0x4000_xxxx),Terasic 只写 2 条 stx_udp_port=0x12B7,PYNQ 只写 1 条。
  • Terasic 额外有 "Ethernet Adaptation Sequencing FSM"(eth_wrapper/eth_adapt_sequencer.sv)抢占 E-Tile AVMM 总线
    完成 100G AN/LT 自适应------纯平台相关。

0.3 兼容性的代价与约束

  • 平台无关 IP 对 HIF/SIF 的 AXI-Stream 语义有严格要求(见第 3、4 节),平台适配层必须保证:整包不带气泡地送给
    MAC(Terasic 用 SCFIFO 整包缓冲解决 E-Tile 的限制)、tuser 在 MAC 侧表示"本包有 FCS/错误"、tkeep 前导 1 连续。
  • 时钟频率通过 `HIF_CLK_FREQ / `APB_CLK_FREQ / `PTP_CLK_FREQ 宏告知 IP(用于 PTP/I2C 分频、定时器
    换算),SYNC_CLK_HIF_APB/SYNC_CLK_HIF_PTP 宏可声明时钟同源以省掉 CDC。
  • EXT_PTPBRIDGE_IF_INST 宏当前无任何平台使用(grep 证实只出现在 HOLOLINK_top.sv):所有平台都用 IP 内部
    PTP 从钟、都不是桥接模式。

1. FPGA 平台相关代码的架构

每个平台目录的共性结构:rtl/top/FPGA_top.*(顶层)+ rtl/top/HOLOLINK_def.svh(配置)+ build/(厂商工程

脚本/约束/IP 配置)。顶层职责:时钟复位 → 例化以太网 IP 并适配 HIF → 例化传感器接口并适配 SIF → 把

HOLOLINK_top 的用户 APB 口(o_apb_psel[REG_INST-1:0])分发给平台私有寄存器块 → 连接 SPI/I2C/UART/GPIO。

1.1 Terasic / Intel Stratix 10(fpga/terasic/s10_sensor_bridge/

  • 顶层 rtl/top/FPGA_top.v(906 行,面向 AD9986 MxFE 评估板)。
  • 以太网 :2×100G QSFP28。rtl/eth_wrapper/eth_100gb.v 例化 Intel E-Tile eth_100G(含 RS-FEC 重配置口);
    eth_top.sv 支持 ETH_25Gx4 宏切换 25G×4。E-Tile o_clk_pll_div64=402.83MHz → hif_pllhif_clk=201.4MHz 与
    ptp_clkfpga_clk_pll_mfg 出 100MHz apb_clk
  • HIF 适配 :RX = E-Tile AVST → dcfifo 跨钟 → avst_to_axisempty→tkeep 查找表 + 字节序翻转 + tuser=|error);
    TX = axis_to_avst(SOP 状态重建、$countones(tkeep) 求 empty)→ 跨钟 dcfifo → 256 深整包 SCFIFO。
    MAC/PCS 寄存器经 APB 窗口 + avmm_to_apbrtl/misc/avmm_to_apb.sv,带超时返回 32'hBADADD12)访问 E-Tile
    AVMM 重配置空间;自适应 FSM 上电抢占 AVMM 做 AN/LT。
  • 传感器jesd_topJESD_NUM_LANES=8,JESD204 收发 FMC SerDes);512bit(JESD_HIGH_PERF 时 1024)直连 SIF,
    tkeep 全 1、tuser=0(纯数据流,无行概念)。SIF_RX_PACKETIZER_EN='1,VP_COUNT=4、SORT_RESOLUTION=16。
  • 平台特色mailbox_top(Intel SDM Mailbox Client,用于 QSPI/RSU 远程更新)、clock_checker(对 JESD 参考钟做
    1Hz 频率容限检查)、general_purpose_regs(软件复位 AD9545 时钟芯片、FPGA 重配置)、I2C0=板载 EEPROM、
    I2C1=AD9545、SPI0=ADI、SPI1=HMC。
  • APB 用户口分配psel[0/1]=eth_top×2、[2]=mailbox、[4]=GP regs。

1.2 AMD/Xilinx RFSoC PYNQ(fpga/pynq/rfsoc-pynq/

  • 顶层 rtl/top/FPGA_top.sv(532 行)。bring-up/回环平台,无真实传感器
  • 以太网 :1×100G。rtl/eth_100gb/eth_100gb_top.sv 例化 Vivado block design design_1(由
    build/ip/bd_gen.tcl 生成:cmac_usplus:3.1 CAUI-4 + clk_wiz不含 Zynq PS ,纯 PL overlay 由 PYNQ 加载)。
    CMAC 用户口原生 AXI4-Stream 512b,与 HOLOLINK 点对点直连FPGA_top.sv:181-192)。CMAC 控制 FSM 处理
    ctl_rx_enable/ctl_tx_send_rfi/stat_rx_aligned 握手。gt_txusrclk2=322.27MHz 同时作 hif/sif 时钟(单时钟域)。
  • 传感器ram_player(nv_hsb_ip/data_gen)从 RAM 播放 512bit 测试数据作 sif_rx[0];def 中开了
    SIF_RX_DATA_GEN(IP 内建数据发生器复用开关);SIF_RX_PACKETIZER_EN='0 不使用 packetizer 。SIF TX 输出接两
    个 APB 可读软 ILA(s_apb_ila 等)用于调试 PTP 时间戳/帧计数。
  • 枚举 :唯一不用 EEPROM 的平台------ENUM_EEPROM 注释掉,顶层直接接 i_mac_addr=48'hCAFEC0FFEE00
    i_enum_vld=1FPGA_top.sv:425-433)。
  • APB 用户口分配[2]=PTP ILA、[3]=SIF ILA、[4]=ram_player,[0][1][5][6][7] 绑固定 ID 值。

1.3 Lattice CertusPro-NX(fpga/lattice/cpnx100-eth-sensor-bridge/

双 FPGA 板卡:cpnx100 (主)+ clnx17(CrossLink-NX 伴随)。

cpnx100rtl/top/FPGA_top.sv,897 行):

  • 以太网 :2×10G SFP+。rtl/eth_10gb/eth_10gb_top.sv 例化 Lattice eth_10gb_mac(原生 64b AXIS + APB 配置口)
    eth_10gb_pcs_0/1(SerDes PCS tile),MAC↔PCS 间为 XGMII。AXIS 与 HOLOLINK 直连,但用
    sys_ready = xgmii_rxval && xgmii_txrdy && xgmii_rx_blk_lock 门控 tvalid/tready(链路未就绪不发包)。clk_n_rst
    模块从 PCS 322.27MHz 用户钟综合出 hif 156.25M / apb 19.53M / ptp≈100.4M / adc 50M / PTP 同步的 24M 相机钟
  • 传感器 :3 路 RX + 1 路 TX:
    • cam_rcvrrtl/cam_rcvr/cam_rcvr.sv):11bit DDR LVDS(500MHz)解串成 88bit 字,与校准图案
      88'h005A55FEDCBA9876543210 比对出 o_rx_drdy;解出 {tuser[4:0], metadata[2:0], tdata[79:0]},经 80→64bit
      双时钟 axis_buffer 进 SIF,tuser[1:0] = {行末, bypass}。
    • 1×I2S RX(ref_design/i2s/i2s_top.sv,32bit AXIS,sif_rx[2]不开 packetizer)。
    • 1×I2S TX 用 sif_tx[0](主机下行音频)。
    • sif_event 汇总 SOF/帧尾/GPIO 事件。
  • APB 用户口分配REG_INST=8 全用完):[0..3]=PCS/MAC×2、[4/5]=cam_rcvr×2、[6]=vsync_gen+delayed_io
    (apb_switch 按 addr11 再分)、[7]=I2S。
  • init_reg 22 条:上电自动配置两片 PCS(loopback/均衡/迭代次数)与两片 MAC(mode/tx_ctl/rx_ctl/pkg_len/ipg)。

clnx17rtl/top/FPGA_clnx_top.sv):MIPI→LVDS 桥。

  • mipi_bridgertl/mipi_bridge/mipi_bridge.v):MIPI CSI-2 D-PHY RX(LMMI 配置接口)→ FIFO → 11bit DDR LVDS
    输出------即 cpnx100 两路 LVDS 相机数据的真正源头是 clnx17 转发的 MIPI 相机。
  • FPGA_spi_peri_ctrl_fsmrtl/spi/):SPI 从机 。cpnx100 侧 HOLOLINK 的 SPI0 作为主控经它读写 clnx17 寄存器
    (mipi_en/soft_rstn/LMMI),并在 spi_flash_fwd 模式把 SPI 透传到板载 QSPI Flash,实现主机远程升级 clnx17
    bitstream。因此 README 要求 cpnx100 与 clnx17 两个 bitfile 都烧录。

1.4 Microchip PolarFire(fpga/microchip/mfp200-eth-sensor-bridge/

  • 顶层 rtl/top/PF_ESB_top.v(412 行,SmartDesign 2025.1 生成风格;对应 Microchip AN5522,MPF200T)。
  • 以太网 :2×10GBase-R。rtl/MAC_Hololink/MAC_BaseR.v = CORE10GMAC_C0(10G MAC+PCS49)+ PF_XCVR_ERM_C0
    (SerDes)+ PF_TX_PLL_C0 + COREABC_C0(上电初始化 MAC 的软微控制器)+ MAC_to_AXIS 桥。PF_CCC_C1
    MAC0 的 RX 恢复钟为参考综合出 hif 156.25M / apb 19.53M / ptp 104.16M / 相机钟。
  • HIF 适配(四层级联,本平台最特殊)
    1. MAC_BaseR.vMAC_to_AXIS 把 SYS_MAC 的 SOP/EOP/EN/BC 接口转成标准 AXI4-Stream;
    2. MAC_Hololink_top.v:两片 MAC + tuser 位宽适配(HOLOLINK TX tuser 1bit 零扩展到 3bit;MAC RX tuser 8bit 取
      bit0);
    3. HoloLink_SD.v(SD=SmartDesign 画布):例化 wrapper + 6 个 BIBUF(I2C 开漏)+ PF_SPI IO macro;
    4. HOLOLINK_top_wrapper.v(手写):因 SmartDesign 不支持 SystemVerilog unpacked array 端口,把
      HOLOLINK_top 的数组端口摊平成 _0/_1 标量再拼回。
  • 传感器 :2×IMX477 MIPI CSI-2。rtl/IMX477_IF/IMX477_IF_TOP.v = CAM_IOD_TIP_TOP(PF_IOD_GENERIC_RX 4-lane
    D-PHY 解串 + LP 缓冲)→ mipicsi2rxdecoderPF_C0(Microchip CSI-2 解码 IP,出 FRAME_VALID/LINE_VALID/DATA)→
    HSB_AXIS(32→64bit + 跨钟),64bit AXIS + TUSER[1:0] 进 SIF。相机训练复位/使能由 HOLOLINK o_init_done
    动(初始化完成才放开相机)。两路都 SIF_RX_PACKETIZER_EN=0 (直通),无 SENSOR_TX,HOST_MTU=1500
  • 平台特色REG_INST=1,唯一用户 APB 口接 PF_SYSTEM_SERVICES_C0(主机远程读器件序列号/摘要);pps_stretch
    驱动 LED。

1.5 Lattice MIPI 参考设计(fpga/nv_mipi_ref_design/mipi_cpnx_ref_design/

  • 单网口 CertusPro-NX(HOST_IF_INST=1),以太网部分与 cpnx100 完全相同(eth_10gb_topsys_ready 门控)。
  • 传感器 :2×mipi_cam_rcvrrtl/mipi_cam_rcvr/mipi_cam_rcvr.sv)------原生软 MIPI CSI-2 D-PHY RX(4 lane,
    1250Mbps,mipi_rx_ip),支持多 Virtual Channel(o_axis_tidx 输出 VC 号);tuser[0]=嵌入式数据行(令
    packetizer bypass)、tuser[1]=行末;行数据 pad 到 64B。面向 Leopard GMSL2 载板:CAM_RST 实为 MAX96716 解串器
    power-down,POC(同轴供电)经 GPIO+I2C2 管理。
  • 两路都开 packetizer(VP_COUNT=1、NUM_CYCLES=3------RAW10/12 跨 3 拍重排);无 SENSOR_TX。
  • clk_n_rst 额外产 27.043MHz CAM_MCLK 与 24M PTP 相机钟;vsync_gen(PTP 帧同步)复用到 GPIO;APB psel[7]
    挂 8 端口 apb_switch 作扩展总线。

1.6 平台侧共同模式小结

职责 实现方式
时钟/复位 平台 PLL/CCC 从 SerDes 恢复钟或板载晶振产 hif_clk/apb_clk/ptp_clk,频率经 def 宏告知 IP
MAC 接入 厂商 IP → (按需)AXIS 适配 → i_hif_axis_*/o_hif_axis_*
MAC 配置 IP 的用户 APB 口 + 平台私有 APB 从机 + init_reg 上电自动写
传感器接入 物理层 IP(JESD/MIPI/LVDS/I2S/测试源)→ AXI-Stream → i_sif_axis_*
板级管理 EEPROM(I2C)或软 MAC;GPIO/SPI 由软件经 ECB 远程操控
调试 APB 软 ILA、clock_checker、SmartDebug 等

2. FPGA 平台无关代码的架构(fpga/nv_hsb_ip/

HOLOLINK_top.sv(1873 行)是集成顶层,内部按"每 host 一路数据平面 + 全局控制平面"组织。

2.1 顶层数据流

复制代码
                 ┌──────────────────────── HOLOLINK_top ─────────────────────────┐
 sensor AXIS ───►│ data_gen?(mux) → packetizer_top ×N_sen → dp_pkt_top ─┐        │
 (i_sif_axis_*)  │   (SIF_RX_DATA_GEN)   (VP 重排/分包)   (RoCE/CoE 头) │        │
                 │                                                      ▼        │
                 │  ┌──────────────────────── eth_pkt ×N_host (6口仲裁)│        │
                 │  │  0:dp_pkt(数据) 1:ptp 2:roce_ack 3:lso 4:pause    │        │
                 │  │  5:bridge                                        ├───────►│──► host MAC
                 │  └──────────────────────────────────────────────────┘ (o_hif_axis_*)
 host MAC ──────►│ rx_parser ×N_host ─┬─ is_stx ─► sensor_tx_pkt_proc ─► tx_stream_buffer ─► o_sif_axis_* ─► sensor
 (i_hif_axis_*)  │ (58B 头解析分类)   ├─ is_ptp ─► ptp_top (仅HIF0) ─► ptp_tx ─► eth_pkt[1]
                 │                    ├─ is_ecb/bootp/ping/arp/loopbk/roce_ecb ─► rx_ls_parser ─► lso ─► eth_pkt[3]
                 │                    ├─ RoCE RC 包 ─► roce_ack ─► eth_pkt[2]
                 │                    └─ is_btx(非本机) ─► bridge_pkt_proc (仅 BRIDGE_IF_INST)
                 │ APB: m_apb_m2s[4](ecb/sys_init/eeprom/evt_fsm) → apb_intc_top → 各模块 + 用户口 o_apb_*
                 └─────────────────────────────────────────────────────────────────┘

2.2 各模块职责

数据平面(sensor→host)

  • packetizer/packetizer_top.sv + packetizer.sv + virtual_port.sv + odd_even_gen.sv:每传感器一路。
    核心概念是 Virtual Port(VP) :把一路传感器输入拆成 VP_COUNT 条独立逻辑流,每条独立进入 dp_pkt_top
    一个端口、独立分配 QP/VA/PSN。odd_even_gen 把 Batcher 奇偶归并网络复用为可编程位块洗牌器 (按
    SORT_RESOLUTION 粒度、由配置 RAM 逐位控制交换),配合 NUM_CYCLES 跨拍重排,用于 MIPI RAW10/12 字节重排、
    lane 解交织等;SIF_RX_PACKETIZER_EN=0 时走 bypass 直通。三段配置 RAM(CLEAR/SORT/VP)由软件经
    pack_ram_addr/data 寄存器写入;帧尾可 pad 到 64B 对齐。virtual_port.svVP_SIZE 聚合写双时钟 FIFO,
    almost_full 反压传感器。o_sof 输出帧首脉冲供打时间戳。
  • dp_pkt/dp_pkt_top.sv(1680 行)+ dp_pkt.sv + dp_pkt_hdr.sv + dp_pkt_ts.sv:轮询仲裁各 VP(EOF 优先),
    读 per-VP 配置 RAM (512×32b,APB 窗口 0x0000_1000;内容含 dest_qp、rkey、VA、buf_inc/轮转、host
    MAC/IP/UDP port、VLAN、PSN、is_1722b、md_disable)与状态 RAM (frame_num/VA/PSN/buf_ptr),构造 5 种报文头
    dp_pkt_top.sv:1352-1356):
    1. RoCEv2 头 (70B:ETH+IP+UDP+BTH+RETH,opcode 0x2A)------数据包;
    2. RoCE + WR-IMM + 48B Metadata (opcode 0x2B)------帧尾元数据包:SOF PTP 时间戳、frame CRC32(dp_pkt.sv
      lfsr_hc 逐拍累计)、PSN、frame_num、buffer 槽位 buf_ptr、unsync 标志;
    3. RoCE + 4B WR-IMMmd_disable 时最后一包直接带 immediate);
    4. CoE/IEEE 1722b 头 (46B,EtherType 0x22F0is_1722b 配置位);
    5. CoE + Metadata
      DIS_COE(由平台 def 的 DISABLE_COE 宏推导)强制剔除 CoE 路径。PTP 时间戳由 dp_pkt_ts.sv 以每 VP 4 深
      时间戳 RAM 对齐 SOF→帧尾。输出经每 host 一个 roce_icrc 追加 ICRC(CoE 不加)。

RoCE 支持(roce/

  • roce_icrc.sv + lfsr_hc.sv:按 IB 规范计算 ICRC------剥以太网头、对"伪 LRH/IP TOS/TTL+校验和/UDP 校验和/BTH
    F/B/Rsrv 位"做置 1 掩码(axis_mask),CRC32 初值全 1、末拍按 tkeep 选字节数取反,axis_ftr 包尾追加 4B。
    被三处复用:dp_pkt 数据输出、roce_ack 的 ACK、rx_ls_parser 的 RoCE-ECB 响应。
  • roce_ack.sv(仅 SIF_TX_ROCE_RC_ENABLE 时例化):host→sensor RC 模式的 responder。per-QP PSN RAM(32 项
    {has_inited,has_nacked,msn,psn_next},按 dest_qp[7:1]-1 索引):首包/PSN 匹配→ACK(opcode 0x11,AETH 带
    MSN);PSN 超前→NAK PSN sequence error(每 QP 只发一次);PSN 落后→静默丢弃;!stx_ready→RNR NAK。AckReq 位
    (BTH a_rsv7[7])触发;错误包回咬数据通路整包丢弃。QP 上下文({rnr_timer, host_qp})由软件写 QP RAM
    (APB 窗口 0x0000_3000s_apb_m2s_ram[2],写广播到每 host 一份拷贝)。

入站解析(rx_parser/

  • rx_parser.sv(每 host 一路):axis_to_vec 抓前 58B(自动跳过 VLAN)→ 分类:RoCE/UDP 数据(is_stx)、
    RoCE-ECB、ECB、BOOTP(端口 12268)、loopback(端口 0x1000)、ICMP ping、ARP、PTP(EtherType 0x88F7)、
    非本机包(is_btx→bridge)。IPv4 校验和流水验证、FCS 错误(来自 MAC 的 tuser)丢包。o_dest_info 输出
    {dest_qp, dest_mac} 供 demux/桥查询。
  • rx_ls_parser.sv + arp_ping_pkt_proc.sv:低速控制面。ARP 请求→应答、ICMP echo→reply、loopback 原样回环;
    ECB/RoCE-ECB 交给 ecb/ecb_rdwr_ctrl.sv;四路(ECB/EVT/BOOTP/ARP_PING)仲裁后加 42B ETH/IP/UDP 头(IPv4 校验和
    增量计算)从 lso 口发出。
  • ecb/ecb_rdwr_ctrl.svEthernet Control Bus ------把 UDP/RoCE 命令包(WR_DWORD=0x04/RD_DWORD=0x14/
    WR_BLOCK/RD_BLOCK 等,见 ecb_pkg.sv)解析成 <addr32,data32> 对,驱动 APB masterm_apb_m2s[0]
    遍历全芯片寄存器空间。这是主机配置 FPGA 的唯一通道(Hololink 软件栈的寄存器读写都走它)。响应带序号/错误码;
    RoCE-ECB 响应先插 32B RoCE 头再算 ICRC。
  • bootp/bootp.svinit_done 后每个 PPS 对每 host 广播 BOOTP 请求:vend 域含 UUID(128b) + 296b
    enum_data(misc/dev_crc/dev_ver/board_sn/board_ver/board_id)+ PTP 时间 + 包计数;收到 reply(opcode==2)取
    ciaddr 作本机 IP。即"插上网线主机就能发现板卡"的枚举机制。

host→sensor(sensor_tx/

  • sensor_tx_pkt_proc.sv:去 54B 头(ETH+IP+UDP+BTH)+ 去 4B ICRC 尾,按 dest_qp[8:1] demux 到 N 路传感器。
  • tx_stream_buffer.sv:每 sensor 一个双时钟 FIFO(SIF_TX_BUF_SIZE),攒到 almost-full 才恒速放出,防突发;
    o_eth_pause 触发 pause_gen 生成 802.3x PAUSE 帧(quanta 可配)反压主机;o_stx_is_ready 反馈给 roce_ack
    做 RNR。

全局模块

  • ptp/ptp_top.sv(仅 HIF0):完整 IEEE 1588 从钟(ingress/parser/sync/dly/dpll/timer/egress),支持 1588
    E2E/gPTP/P2P profile;输出 o_ptp_sec/o_ptp_nanosec/o_pps,经 streaming_cdc 供 dp_pkt 时间戳、bootp、事件包
    使用。EXT_PTP 宏可改用外部 PTP(当前无平台使用)。
  • glb_ctrl/glb_ctrl_top.sv:版本寄存器(hsb_ver)、hsb_ctrl(bit3=软件系统复位 o_sw_sys_rst,高 32b 取反为
    32 路传感器复位 o_sw_sen_rst)、GPIO 三态控制。
  • ctrl_bus_evt/ctrl_bus_evt_int 把 32b 事件向量(i_sif_event[15:0] + uart_irq + spi/i2c busy + 内部事件)做
    边沿检测,逐 host 发 18B UDP 事件通知包;ctrl_bus_evt_fsm 是脚本引擎(1024×32b 脚本 RAM,支持
    NOP/POLL/WRITE/READ/JUMP/COMPARE),作为 APB master(m_apb_m2s[3])在事件触发时自动执行寄存器序列。
  • sys_init/sys_init.sv:上电按 init_reg[N] 逐条发 APB 写(初始化平台 MAC/PCS 等),完成置 sys_init_done
  • sys_init/eeprom_info.svifdef ENUM_EEPROM):经 I2C 外设读 256B EEPROM(MAC@byte68-73、SN@74-80、IP@60-63、
    board_ver@20-39,CRC-8 校验),dev_mac_addr[i]=eeprom_mac+ieeprom_dval && sys_init_done = init_done,此后
    HIF 才开始收包(o_hif_axis_tready=init_done_hif_clk)。
  • eth_pkt/eth_pkt.sv:每 host 6 端口优先级仲裁(索引 0 数据平面优先级最高),并负责 PTP 出口时间戳通知
    o_ptp_val)、VLAN 插入(tuser16:0)、包计数 o_pkt_inc
  • routing_table/ + bridge_pkt_proc.sv(仅 BRIDGE_IF_INST):二层学习型交换桥------CAM(64 深)学习 src MAC→
    端口,按 dest MAC 查表转发/广播,带 PTP 透明时钟(residence time 写入 correctionField)。当前无平台使用。
  • reset_gen/lib_apb/(APB 互连 apb_intc_top、寄存器块 s_apb_reg、RAM 块 s_apb_ram、CDC)、lib_axis/
    (axis_buffer/arb/mux/drop/insert/mask/hdr/ftr 等 AXIS 工具箱)、misc/(FIFO/CRC/仲裁器/CDC 基础库)。
  • ref_design/:可选传感器接口参考设计,被平台顶层直接例化:i2s_top(I2S 音频 RX/TX)、imu_top(I2C IMU 采
    样 + 8B PTP 时间戳前缀)、vsync_gen(PTP 对齐的帧同步脉冲 + GPIO 复用控制)、delayed_io(APB 可编程延时
    GPIO 脉冲,用于传感器上下电时序)。

2.3 寄存器/APB 地址空间(reg_map/regmap_pkg.sv + lib_apb/apb_intc_top.sv

32 位 APB 地址逐级解码:

复制代码
[31:28]  0           → Hololink 内部;  1..F → 用户口 o_apb_psel[REG_INST-1:0](每口 0x1000_0000 步距)
[27:24]  内部二级:0=Global  1=SIF  2=HIF  3=Peripheral  6=Bridge
  Global 0x00xx_xxxx: [23:12]=0 → glb_ctrl/ptp/ctrl_bus_evt/ecb
                      [23:12]=1 → dp_pkt 配置 RAM(每 sensor 64B 窗口)
                      [23:12]=2 → ctrl_bus_evt 脚本 RAM
                      [23:12]=3 → RoCE host QP RAM
  SIF    0x01xx_xxxx: [21]=RX/TX, [20:16]=sensor 通道, [11:8]=子模块(packetizer/data_gen/tx_buffer)
  HIF    0x02xx_xxxx: [20:16]=host 通道, [11:8]=子模块(rx_parser/eth_pkt/ctrl_evt/dp_pkt)
  Peri   0x03xx_xxxx: [11:9]=SPI/I2C/UART

每模块窗口 256B(0x00-0x7C RW ctrl、0x80+ RO status),非法地址读回 32'hBADADD12;APB 互连带 512 拍超时

watchdog。4 个 APB master 口:[0]=ECB(主机远程读写)、[1]=sys_init、[2]=eeprom_info、[3]=ctrl_bus_evt_fsm。


3. 平台无关代码 ↔ 平台相关代码的数据接口

接口契约即 HOLOLINK_top 的端口表(HOLOLINK_top.sv:19-149),分五组:

3.1 Host Interface(HIF)------ 平台以太网侧

systemverilog 复制代码
input  i_hif_clk;  output o_hif_rst;                       // 平台提供 hif 时钟;IP 输出同步复位
// RX(MAC → IP),每网口一路 AXI4-Stream,宽度 `HOST_WIDTH
input  [`HOST_IF_INST-1:0]   i_hif_axis_tvalid/tlast;
input  [`HOST_WIDTH-1:0]     i_hif_axis_tdata  [`HOST_IF_INST];
input  [`HOSTKEEP_WIDTH-1:0] i_hif_axis_tkeep  [`HOST_IF_INST];
input  [`HOSTUSER_WIDTH-1:0] i_hif_axis_tuser  [`HOST_IF_INST];   // 语义:本包 FCS/错误指示(@tlast 有效)
output [`HOST_IF_INST-1:0]   o_hif_axis_tready;                   // init_done 后才拉高
// TX(IP → MAC),同上反向
output o_hif_axis_tvalid/tlast/tdata/tkeep/tuser;  input i_hif_axis_tready;

平台适配层的责任:

  • 语义对齐tkeep 必须前导连续 1;tuser 必须是"整包错误"指示(IP 内部用它丢包);包长 ∈ 58B, `HOST_MTU`
    Terasic 在 avst_to_axis 里做 empty→tkeep 和字节序翻转;Microchip 在 MAC_Hololink_top 做 tuser 位宽适配。
  • 整包信用 :若 MAC 不允许包内反压中断(E-Tile),平台需整包缓冲(Terasic 的 u_eth_tx_pkt_fifo)。
  • 时序HOST_WIDTH/HIF_CLK_FREQ 必须匹配链路速率(64b@156.25M=10G;512b@201.4M 或 322.3M=100G)。
  • 链路未就绪时不得向 IP 注入包(Lattice 用 sys_ready 门控)。

3.2 Sensor Interface(SIF)------ 平台传感器侧

见第 4 节。

3.3 用户寄存器接口(APB)------ 平台私有逻辑挂载点

systemverilog 复制代码
input i_apb_clk;  output o_apb_rst;
output [`REG_INST-1:0] o_apb_psel;  output o_apb_penable/pwrite;  output [31:0] o_apb_paddr/pwdata;
input  [`REG_INST-1:0] i_apb_pready/pserr;  input [31:0] i_apb_prdata [`REG_INST-1:0];
  • REG_INST 个独立 APB slave 窗口,地址 [31:28]=窗口号(如 psel[0]0x1000_xxxxpsel[4]0x5000_xxxx)。
  • 平台把厂商 MAC/PCS 寄存器、相机接收器配置、vsync/delayed_io、ILA、mailbox 等挂到这些口上;主机软件经 ECB 即
    可读写它们(地址即完整 32b 地址)。sys_initinit_reg[] 也通过这个路径上电自动初始化平台寄存器。
  • apb_intc_top 的 watchdog 保证平台从机不挂死总线。

3.4 枚举 / 初始化接口

二选一(由 def 宏 `ENUM_EEPROM 决定):

  • EEPROM 模式 (Terasic/Lattice/Microchip/MIPI ref):无端口;IP 内部 eeprom_infoI2C0 读板载 EEPROM,
    dev_mac_addr[i]=eeprom_mac+i
  • 软枚举模式 (PYNQ):端口 i_mac_addr[HOST_IF_INST]i_board_sn[55:0]i_enum_vld 由平台绑定。
  • 输出 o_init_done(= EEPROM 有效 && init_reg 序列完成):平台用它放开传感器(Microchip 相机使能)或指示链路
    可用。

3.5 外设 / 控制 / 时钟接口

  • 外设 (按需 ifdef 裁剪):SPI(o_spi_csn/sck/sdio/oen,QSPI 兼容)、I2C(i_i2c_scl/sda + 开漏使能
    o_i2c_*_en,平台用 BIBUF/开漏缓冲落地)、UART(tx/rx/cts/rts)、GPIO(i_gpio/o_gpio/o_gpio_dir)。
  • 复位输出o_sw_sys_rst(主机软复位系统)、o_sw_sen_rst[31:0](主机软复位传感器,平台接相机复位脚)。
  • PTPi_ptp_clk/o_ptp_rst;默认输出 o_ptp_sec/o_ptp_nanosec/o_pps(平台用于 vsync_gen、时间戳显示、
    PPS LED);EXT_PTP 时改为输入。
  • 事件输入i_sif_event[15:0]------平台把传感器 SOF/帧尾/GPIO 中断等接入,IP 转成 UDP 事件包通知主机。

4. 平台无关代码 ↔ 传感器的数据接口

4.1 SIF RX(传感器 → 主机,数据采集主通路)

systemverilog 复制代码
input  [`SENSOR_RX_IF_INST-1:0] i_sif_rx_clk;   // 每路独立时钟域(JESD core clk / hif_clk / apb_clk 均可)
output [`SENSOR_RX_IF_INST-1:0] o_sif_rx_rst;
input  [`SENSOR_RX_IF_INST-1:0] i_sif_axis_tvalid/tlast;
input  [`DATAPATH_WIDTH-1:0]    i_sif_axis_tdata [`SENSOR_RX_IF_INST];   // 实际有效宽 = SIF_RX_WIDTH[i]
input  [`DATAKEEP_WIDTH-1:0]    i_sif_axis_tkeep [`SENSOR_RX_IF_INST];
input  [`DATAUSER_WIDTH-1:0]    i_sif_axis_tuser [`SENSOR_RX_IF_INST];   // 语义见下
output [`SENSOR_RX_IF_INST-1:0] o_sif_axis_tready;                       // packetizer FIFO almost_full 反压

契约要点

  • 帧格式 :一个 AXI 包 = 一个网络包 payload(≤HOST_MTU)。相机类传感器通常一行一包:tlast 标识行末,
    tkeep 标识末拍有效字节。JESD 类流式源则由平台自行切包(Terasic 直接给 tvalid/tlast 流)。
  • tuser 语义DATAUSER_WIDTH 平台可配 1~2):
    • tuser[0] = bypass packetizerpacketizer_top.sv:236 buf_bypass = buf_tuser[0]):MIPI 平台用它把"嵌入
      式数据行"原样直通,不做字节重排;
    • tuser[1] = End-of-Line / 帧或行结束 ,packetizer 据此做 64B 对齐 padding(packetizer_top.sv:332-342);
    • tuser[3:2] 在 packetizer 内部用作 Virtual Port 选择。
  • SOF :IP 自动从 tvalid 首拍生成 o_sof 脉冲(跨钟到 hif 域),dp_pkt_ts 用它锁存 PTP 时间戳,最终打进
    metadata 包------主机由此获得每帧的精确曝光时刻。
  • 宽度适配 :每路有效宽 SIF_RX_WIDTH[i]DATAPATH_WIDTH,packetizer 负责 DIN→HOST_WIDTH 的位宽转换与
    跨时钟(sif_rx_clk → hif_clk)。
  • 可选数据发生器SIF_RX_DATA_GEN 宏例化 data_gen(PRBS/RAM player),经 mux 替代真实传感器,用于
    bring-up(PYNQ 平台使用)。

4.2 SIF TX(主机 → 传感器,下行通路)

systemverilog 复制代码
input  [`SENSOR_TX_IF_INST-1:0] i_sif_tx_clk;  output o_sif_tx_rst;
output o_sif_axis_tvalid/tlast/tdata/tkeep/tuser [`SENSOR_TX_IF_INST];  input i_sif_axis_tready;
  • 主机用 UC Send / RC Write 把数据(如 I2S 音频、寄存器流)写到 dest_qp = (sensor_idx+1)<<1
    rx_parsersensor_tx_pkt_proc 去头去 ICRC→tx_stream_buffer 攒 burst 后恒速输出。
  • 流控:tx_stream_buffer 水位触发 pause_gen 发 802.3x PAUSE;RC 模式下不可用时回 RNR NAK。
  • 当前仅 Terasic(JESD 回环)、PYNQ(ILA 调试)、Lattice cpnx100(I2S 下行)使用。

4.3 传感器控制通道(与数据通路正交)

  • 寄存器控制 :传感器的配置(曝光、增益、MIPI 寄存器......)不走 SIF,而是平台把传感器挂到 IP 的 I2C/SPI 外设
    i2c_ctrl_fsm/spi_ctrl_fsm 支持多总线选择 o_bus_en),主机软件经 ECB→APB→I2C/SPI 完成读写。
  • 复位/使能o_sw_sen_rst[31:0](glb_ctrl 高 32b 取反)由主机软件控制;o_init_done 作上电使能。
  • 同步o_pps + o_ptp_sec/nanosec 供平台 vsync_gen 产生与时间戳对齐的帧同步脉冲,实现多相机 PTP 同步
    曝光;i_sif_event[15:0] 把传感器侧事件(帧开始/结束、GPIO 中断)上报主机。

4.4 参考传感器设计(nv_hsb_ip/ref_design/,平台可直接例化)

模块 接口 说明
i2s/i2s_top.sv SIF RX(32b AXIS)+ SIF TX I2S 音频采集/回放,含 MCLK/BCLK/LRCLK 生成
imu/imu_top.sv SIF RX I2C IMU 采样,每样本前缀 8B PTP 时间戳
vsync/vsync_gen.sv 纯 APB + GPIO PTP 对齐 vsync 脉冲 + GPIO 复用控制
delayed_io/delayed_io.sv 纯 APB + GPIO µs 级可编程延时 IO 脉冲(传感器上下电时序)

5. 辅助设施

  • nv_hsb_ip_simple_tb/ :平台无关 IP 的仿真测试平台。nv_hsb_ip_simple_tb.sv 顶层 + tb_lib/
    hololink_roce_helpers.svh 构造/校验 RoCE 包(BTH/RETH/ICRC),hololink_ecb_tasks.svh ECB 寄存器读写任务,
    hololink_sensor_stim.svh 传感器激励,hololink_monitors.svh 监视器)+ eeprom_i2c_model.sv(EEPROM 模型)。
    tb_pkg/hololink_tb_pkg.sv 定义了与 RTL 对应的报文格式常量(如 ROCE_OPCODE_RDMA_WRITE_FIRST=8'h2A
    ROCE_OPCODE_RDMA_WRITE_ONLY_IMMDT=8'h2B),是理解线上报文格式的最佳参考。
  • script/eeprom/eeprom_utility.py :经 ECB/UDP(端口 8192)在线读写板载 I2C EEPROM(MAC@byte68-73、
    SN@74-80),带 CRC 修复,用于产线烧录枚举信息。

6. 关键结论

  1. 兼容策略 = "一份协议 IP + 每平台一份 def 配置包 + 一层厂商胶合逻辑" 。RoCEv2/UDP/PTP/BOOTP/ECB 全部收敛在
    nv_hsb_ip,平台差异被压缩到 MAC 适配(AVST/AXIS/私有接口 → 统一 AXIS)、位宽/MTU/时钟宏、传感器物理层四
    件事上。
  2. RoCEv2 的平台差异不在协议而在接入层 :协议栈(dp_pkt/roce_ack/roce_icrc)全平台一致;差异体现在
    MAC 用户接口转换、HOST_WIDTH(64/512)、HOST_MTU(1500/4096)、HIF 时钟(156~322MHz)、是否有关闭 CoE
    DISABLE_COE)、有无 host→sensor 通路。当前所有平台 host→sensor 均为 UC(无 ACK),RC 模式
    SIF_TX_ROCE_RC_ENABLE+roce_ack)已实现但未被任何在版平台启用。
  3. 两个 AXI-Stream 契约是全部集成的关键 :HIF(以太网帧,tuser=包错误)与 SIF(传感器行/帧,tuser0=bypass、
    tuser1=行末)。满足契约即可接入任意新 MAC 或新传感器。
  4. 控制面完全建立在 ECB/APB 之上 :主机所有配置都经 ECB 包 → APB master → 32b 地址空间(Hololink 内部 +
    REG_INST 用户口),平台私有寄存器(MAC/PCS/相机/调试)因此天然对主机软件可见;init_reg 与 EEPROM 机制让
    板卡上电即可自举到"可被 BOOTP 枚举"的状态。

2. Holoscan Sensor Bridge FPGA 典型数据流分析 与 数据处理逻辑插入指南

本文分两部分:

  1. 典型数据流分析------以相机采集场景为例,端到端走一遍 FPGA 内部数据通路;
  2. 在 FPGA 内加入数据处理逻辑------放在哪个模块合适、以什么方式加入。

一、典型数据流分析

以最典型的相机采集场景(Lattice MIPI 参考设计:MIPI 相机 → 10G 以太网 → 主机)为例。

1. 上行主通路(sensor → host,数据采集)

复制代码
MIPI CSI-2  ─► mipi_cam_rcvr ─► HOLOLINK_top ─► MAC ─► SFP+ ─► 主机内存(GPU/CPU)
   D-PHY       [平台相关]        [平台无关]       [厂商IP]
阶段 模块 时钟域 做的事
① 物理层 mipi_cam_rcvr(平台) rx 钟→hif_clk D-PHY 解串→CSI-2 解码→按 Virtual Channel 分行,行 pad 到 64B;输出 64b AXIS:tuser[0]=嵌入式行、tuser[1]=行末
② 进 IP HOLOLINK_top 端口 i_sif_axis_* hif_clk 先过一个 data_gen 复用器fpga/nv_hsb_ip/top/HOLOLINK_top.sv:1401):SIF_RX_DATA_GEN 可用内部测试源替代真实传感器------这本身就是一个"数据流注入/旁路"的现成先例
③ 重排/分包 packetizer_top(每传感器 1 个) sif 钟→hif 钟 odd-even 归并网络做可编程字节重排 (RAW10/12 解包,NUM_CYCLES=3 跨 3 拍重组);按 Virtual Port 聚合成 HOST_WIDTH 宽字写入异步 FIFO;帧首拍产生 o_sof 脉冲 ;FIFO almost_full 经 o_sif_axis_tready 反压传感器
④ 打包 dp_pkt_top hif_clk 轮询仲裁各 VP → 读配置 RAM (软件预填:目的 MAC/IP/UDP 端口、dest_qp、VA、rkey、buffer 轮转)+ 状态 RAM (PSN、frame_num、buf_ptr)→ 构造 RoCEv2 头 70B (ETH+IP+UDP+BTH+RETH,opcode 0x2A)→ 按 pkt_len 定长拉取 payload → 逐拍累计 frame CRC32
⑤ 帧尾元数据 dp_pkt_top hif_clk 一帧最后一包之后发 metadata 包 (opcode 0x2B + WR-IMM + 48B):含 SOF 时刻的 PTP 时间戳dp_pkt_ts 在 SOF 时锁存)、frame CRC32、PSN、buffer 槽位 buf_ptr、unsync 标志
⑥ ICRC roce_icrc hif_clk 按 IB 规范对不变域置 1 掩码后算 CRC32,包尾追加 4B ICRC
⑦ 发送仲裁 eth_pkt(每网口 6 口优先级仲裁) hif_clk 端口 0=数据平面(最高优先级),1=PTP,2=RoCE ACK,3=低速控制回包,4=PAUSE 帧,5=bridge;兼做 VLAN 插入、包计数、PTP 出口时间戳
⑧ 上链路 平台 MAC 适配层 hif/eth 钟 o_hif_axis_* →(Lattice 直连 / Terasic 经 axis→AVST)→ MAC → SFP+

主机侧视角 :收到的就是标准 RoCEv2 RDMA WRITE------数据按 RETH 里的 VA/rkey 直接 DMA 进 GPU/CPU 内存(零拷贝),随后的 metadata 包告诉驱动"这一帧结束、在哪个 buffer 槽位、SOF 精确时刻、CRC 是否正确"。

2. 下行与控制通路(host → FPGA/sensor)

  • 数据下行 (如 I2S 音频):UDP/RoCE 包 → stx_udp_port(复位值 0x12B7)→ rx_parser 分类 → sensor_tx_pkt_proc 去 54B 头 + 4B ICRC 尾 → 按 dest_qp[8:1] demux → tx_stream_buffer(攒够水位后恒速放出)→ o_sif_axis_* → 传感器。
  • 寄存器控制 (传感器配置的真正通道):主机发 ECB 包(UDP 0x2000 或 RoCE-ECB)→ ecb_rdwr_ctrl 解出 <addr,data> 对 → APB master 遍历整个 32b 地址空间 → 命中 I2C/SPI 外设寄存器 → i2c_ctrl_fsm/spi_ctrl_fsm 完成传感器物理读写。
  • 枚举init_done 后每秒 BOOTP 广播(UUID + 板卡信息),主机据此发现板卡并分配 IP。
  • 事件上行i_sif_event[15:0](SOF/帧尾/GPIO 中断)→ ctrl_bus_evt_int 边沿检测 → UDP 事件包通知主机。

关键观察:数据面(AXIS 流)与控制面(ECB/APB 寄存器)完全正交------这决定了"加处理逻辑"的标准做法。


二、要加数据处理逻辑,放在哪里?

可选插入点对比

插入点 位置 时钟域/位宽 适合的处理 评价
A. SIF RX 之前(平台层) 传感器接收器 与 HOLOLINK_top.i_sif_axis_* 之间 sif_rx_clk,原生宽 像素级处理:debayer、格式转换、ROI 裁剪、抽稀、降采样、简单压缩 首选
B. 不写 RTL,纯配置 packetizer 软件写 pack_ram --- 位/字节重排、像素解包(RAW10→8)、lane 解交织、通道拆分 VP ★ 零成本,先评估这个
C. IP 内部 packetizer 之后 HOLOLINK_top.sv:1518pkt_rx_axis_* hif_clk,HOST_WIDTH,per-VP 包级处理:加密、哈希 需改共享 IP;且 dp_pkt 定长拉取,变长处理会被补零(unsync),不推荐
D. SIF TX 之后 o_sif_axis_* 与传感器驱动之间 sif_tx_clk 下行数据处理(音频混音、激励波形生成) 下行专用
E. 旁路监听 任意 AXIS 点 tap 一份 --- 调试抓包(PYNQ 的 s_apb_ila 即此模式) 只读

不要放的位置dp_pkteth_pkt 之间(会破坏 RoCE 头/ICRC 一致性)、MAC 适配层(那里是以太网帧语义,处理逻辑会牵扯两个时钟域和厂商接口)。

为什么 A 是首选

  1. 数据还是"传感器原生格式"(像素/样本语义最清晰);
  2. 包边界可以重新定义 ------处理改变了数据量(如 2:1 抽稀)后,你重新生成 tlast,packetizer 只认包 ≤ MTU,完全无感;
  3. 不动 nv_hsb_ip 共享代码,升级 IP 不冲突;
  4. 有现成先例:data_gen mux 就是 IP 预留的"数据源替换"点,你的处理模块相当于接收器的下游延伸。

三、加入方式(具体怎么做)

1. RTL:平台顶层里的"三明治"结构

FPGA_top 中把原来直连的线断开,插入处理模块:

systemverilog 复制代码
// ---- 原来:rcvr_axis_* 直接连 HOLOLINK 的 i_sif_axis_*[0]
// ---- 现在:中间夹一层
my_proc #(
  .W_DATA (64)
) u_my_proc (
  // 时钟:跟随接收器输出域(MIPI ref 中 sif_rx_clk=hif_clk;
  //       Terasic JESD 中 = jesd_core_clk)
  .i_clk           ( sif_rx_clk[0]      ),
  .i_rst           ( sif_rx_rst[0]      ),
  // APB 配置(apb_clk 域,见第 2 点)
  .i_apb_clk       ( apb_clk            ),
  .i_apb_rst       ( apb_rst            ),
  .i_apb_psel      ( apb_psel[5]        ),   // 选一个空闲窗口
  .i_apb_penable   ( apb_penable        ),
  .i_apb_paddr     ( apb_paddr          ),
  .i_apb_pwdata    ( apb_pwdata         ),
  .i_apb_pwrite    ( apb_pwrite         ),
  .o_apb_pready    ( apb_pready[5]      ),
  .o_apb_prdata    ( apb_prdata[5]      ),
  .o_apb_pserr     ( apb_pserr[5]       ),
  // 上游:来自接收器
  .i_axis_tvalid   ( rcvr_axis_tvalid   ),
  .i_axis_tdata    ( rcvr_axis_tdata    ),
  .i_axis_tkeep    ( rcvr_axis_tkeep    ),
  .i_axis_tlast    ( rcvr_axis_tlast    ),
  .i_axis_tuser    ( rcvr_axis_tuser    ),
  .o_axis_tready   ( rcvr_axis_tready   ),
  // 下游:送 HOLOLINK
  .o_axis_tvalid   ( proc_axis_tvalid   ),
  .o_axis_tdata    ( proc_axis_tdata    ),
  .o_axis_tkeep    ( proc_axis_tkeep    ),
  .o_axis_tlast    ( proc_axis_tlast    ),
  .o_axis_tuser    ( proc_axis_tuser    ),
  .i_axis_tready   ( proc_axis_tready   )
);
// HOLOLINK_top 例化处:i_sif_axis_*[0] 改接 proc_axis_*,sif_rx_clk[0] 不变

2. 必须遵守的 AXI 契约(否则会在仿真断言/联机时翻车)

fpga/nv_hsb_ip/top/HOLOLINK_top.sv:1731-1868axis_checker 断言,归纳如下:

  • 一包 ≤ HOST_MTU (4096 或 Microchip 的 1500)且 ≥ 58B;tlast 必须出现在包尾,tkeep 前导连续 1;
  • tuser[1]=行末/帧尾 :packetizer 开启时靠它做 64B 对齐 padding,处理逻辑要透传或重新生成;若你的输出希望跳过 packetizer 直通,置 tuser[0]=1fpga/nv_hsb_ip/packetizer/packetizer_top.sv:236buf_bypass);
  • 反压o_sif_axis_tready 来自 packetizer FIFO 的 almost_full,你的模块必须在 tready 拉低时稳住 tvalid/tdata(standard AXIS 规则);
  • 位宽 :输出 ≤ SIF_RX_WIDTH[i];若改宽度,同步改 HOLOLINK_def.svh 里的 SIF_RX_WIDTH/DATAPATH_WIDTH
  • 带宽:平均速率 < 链路预算;突发由 packetizer 的 2×MTU VP FIFO 吸收;
  • SOF 时间戳:IP 把"上一包 tlast 后的首个 tvalid"当帧首来打 PTP 时间戳------处理逻辑若丢弃/合并帧,注意保持这个首拍语义,主机端的时间戳才有意义。

3. 寄存器接口:两种现成风格

风格一(推荐,标准件) :用 fpga/nv_hsb_ip/lib_apb/s_apb_reg.sv,自带 APB→目标时钟域 CDC,约定 0x00--0x7C 为 RW 控制、0x80+ 为 RO 状态。vsync_gen 就是模板:

systemverilog 复制代码
logic [31:0] ctrl_reg [6];
logic [31:0] stat_reg [1];
s_apb_reg #(.N_CTRL(6), .N_STAT(1), .W_OFST(w_ofst)) u_reg_map (
  .i_aclk(apb_clk), .i_arst(apb_rst),
  .i_apb_m2s(apb_m2s_w), .o_apb_s2m(apb_s2m_w),
  .i_pclk(sif_rx_clk[0]), .i_prst(sif_rx_rst[0]),   // 注意:pclk 接数据域时钟
  .o_ctrl(ctrl_reg), .i_stat(stat_reg)
);
assign cfg_proc_en   = ctrl_reg[0][0];
assign cfg_threshold = ctrl_reg[1][15:0];
assign stat_reg[0]   = frame_cnt;                     // 自动出现在 0x80 偏移

风格二(简单寄存器)fpga/nv_hsb_ip/ref_design/delayed_io/delayed_io.sv 的手写 APB 译码(i_apb_m2s.psel && penable && pwrite 直接译地址),适合几个寄存器的小模块。

4. 拿到一个 APB 窗口

  • 平台 REG_INST 有空闲窗口直接用(如 PYNQ 的 psel[6]、Microchip 可把 REG_INST 从 1 改大);
  • 不够用时:①在 def 里把 REG_INST 加 1,新窗口地址自动是 0x(N+1)000_0000;②像 Lattice cpnx100 那样在窗口内再挂 apb_switch 二次分派(它的 psel[6] 就复用了 vsync + delayed_io);
  • 上电默认值:把初始化写进 def 的 init_reg[]sys_init 会自动配置(Lattice 用它初始化 PCS/MAC 就是这个机制);
  • 主机侧零改动:软件经 ECB 用完整 32b 地址即可读写你的寄存器。

5. 需要 PTP 时间 / 事件 / 触发时

  • 处理逻辑要打时间戳:用 HOLOLINK_top 输出的 o_ptp_sec/o_ptp_nanosec(注意在 i_ptp_clk 域,跨域用 streaming_cdc/reg_cdcfpga/nv_hsb_ip/ref_design/imu/imu_top.sv 给每个 IMU 样本加 8B PTP 前缀就是范例);
  • 要把处理事件(如"检测到异常帧")上报主机:接到 i_sif_event[15:0] 的某一位,ctrl_bus_evt 会自动发 UDP 事件包;
  • 需要主机触发复杂寄存器序列(如"收到触发后写 10 个寄存器"):不要写状态机,直接用 ctrl_bus_evt_fsm 的脚本 RAM。

6. 验证路径

  • 仿真:fpga/nv_hsb_ip_simple_tb 提供传感器激励(hololink_sensor_stim.svh)和 RoCE 包校验(hololink_roce_helpers.svh),把你的处理模块包进 tb 顶层即可端到端验证;
  • 上板:先开 SIF_RX_DATA_GEN 用 IP 内建数据发生器验证链路,再切真实传感器+你的处理;主机侧用普通 Hololink 应用接收,对比处理前后数据。

总结 :数据处理逻辑作为一个"带 APB 配置口的 AXIS 三明治模块"插在平台层的传感器接收器与 HOLOLINK_top 的 SIF RX 端口之间 ;遵守"tlast/tkeep/tuser 语义 + MTU + 反压"契约;配置寄存器走 s_apb_reg 挂到空闲 psel 窗口;若处理只是字节重排,直接配 packetizer 的 RAM 连 RTL 都不用写。

3. PTP 时钟

在 Holoscan Sensor Bridge(HSB)中,IEEE 1588 PTP 从钟(Slave Clock)的核心作用是将 FPGA 板的本地时间同步到主机(Host)的 PTP 主钟,从而实现亚微秒级(通常优于 100 ns)的跨设备时间对齐。


一、PTP 从钟的作用

1. 多传感器/多板卡时间同步

通过以太网 PTP 协议,所有下游 HSB 设备的本地时钟都与主机主钟对齐。这使得分布在网络中的多块 HSB 板卡(或同一板卡上的多路传感器)共享同一个时间基准。

2. 精确时间戳(Timestamping)

同步后的 PTP 时间用于标记关键事件:

  • 传感器接口事件:如 MIPI 数据帧的首数据到达时刻
  • 主机接口事件 :如帧末数据发送完成时刻
    这些时间戳随数据包发送到主机,可用于精确测量端到端延迟。

3. 生成同步 VSYNC 脉冲

在相机应用中,基于同步后的 PTP 时间可以生成 Vertical SYNC(VSYNC) 脉冲,对齐网络中多个相机的曝光起始时刻,实现多相机同步采集。


二、PTP 从钟的实现

1. 时钟域与 Timer 架构

PTP 模块运行在独立的 i_ptp_clk 时钟域,推荐频率为 95 MHz ~ 105 MHz ,且最好由恢复的以太网 PCS/MAC 时钟衍生,以减小抖动。

PTP Timer 的工作流程:

  1. 复位后 :Timer 从 0 秒、0 纳秒开始,每个时钟沿按 1/PTP_CLK_FREQ 纳秒递增(含 24-bit 小数纳秒精度)。例如 10G 应用中 PTP_CLK_FREQ = 100446545,每周期增量约 9.955 ns。

  2. 首次 SYNC :HSB 收到主机的 SYNC/FOLLOW-UP 消息后,将主机时间 T1 锁存为本地当前时间,Timer 在此基础上继续递增。

  3. 持续同步 :后续 SYNC 周期中,利用 T1~T4 四个时间戳计算 Offset Measurement(OFM)Mean Delay ,并动态调整 Timer 的增量值(即频率调整)。这补偿了板载晶振的漂移和温度变化。

2. 四时间戳同步机制(End-to-End)

时间戳 含义 说明
T1 主机发送 SYNC 时刻 主机硬件打戳
T2 HSB 收到 SYNC 时刻 HSB 硬件打戳
T3 HSB 发送 Delay_Req 时刻 HSB 硬件打戳
T4 主机收到 Delay_Req 时刻 主机硬件打戳

HSB 利用这四组时间戳计算:

  • OFM(Offset Measurement):主从时钟偏移
  • Mean Delay:平均网络往返延迟(并在滑动窗口中平滑异常值)

3. 延迟补偿

  • 交换机驻留时间(Switch Residence Time):网络中的透明时钟(Transparent Clock)会在 PTP 报文的 Correction Field 中追加驻留时间,HSB 解析该字段进行补偿。
  • 延迟不对称(Delay Asymmetry) :HSB IP 自动计算内部收发延迟不对称;对于外部 FPGA 厂商的 MAC/PCS IP 引入的不对称,可通过 PTP Delay Asymmetry 寄存器 编程补偿。

4. 外部 PTP 支持

若板卡已有独立的高精度 PTP 源,可在 HOLOLINK_def.svh 中定义 EXT_PTP,此时 HSB IP 会暴露外部 PTP 时间戳输入端口(如 i_pps),由外部模块提供 1PPS 和 PTP 时间。

5. 关键寄存器

PTP 状态可通过 APB 寄存器读取:

寄存器 地址偏移 说明
SYNC Timestamp 0x180 收到的 SYNC 时间戳
SYNC Correction Field 0x184 修正域值
PTP Status 0x188 同步状态位
OFM 0x18C 计算出的时钟偏移
Mean Delay 0x190 平均网络延迟
Increment Period 0x194 当前每周期增量值
Frequency Adjustment 0x198 频率调整值

三、VSYNC 同步输出(应用层)

基于同步后的 PTP 时间,HSB 提供 vsync_gen 模块,可配置生成固定频率(10/30/60/90/120 Hz)的 VSYNC 脉冲。该脉冲在下一个 PPS(Pulse Per Second) 沿开始生效,确保网络中所有相机的曝光起始时刻对齐到同一秒边界。


总结

维度 要点
作用 将 HSB 本地时钟同步到主机 PTP 主钟,实现 <1μs(通常 <100ns)的跨设备时间对齐;支撑精确时间戳和多相机 VSYNC 同步
实现核心 独立 PTP 时钟域的 Timer;基于 T1~T4 的 OFM + Mean Delay 计算;动态频率调整补偿晶振漂移
关键特性 支持 E2E/P2P 延迟机制、透明时钟修正、延迟不对称补偿、外部 PTP 输入、APB 寄存器调试接口
典型应用 多相机立体视觉、分布式传感器融合、医疗成像、机器人感知等需要精确时间对齐的场景

4. EEPROM 的作用

在 Holoscan Sensor Bridge 系统中,板载 EEPROM 烧录工具(通过 ECB/UDP 在线读写)的核心作用是为每块硬件板卡提供持久化的唯一身份标识,使主机能够在网络中正确枚举、识别和配置该设备。具体可以从以下几个层面理解:


1. 存储设备唯一标识信息

HSB IP 在启动时,会通过 I2C 接口从外部 EEPROM 读取两块关键数据:

EEPROM 地址 内容 说明
68--73 MAC 地址(48 bit) 以太网接口的唯一物理地址
74--80 Board Serial Number(56 bit) 板卡序列号

这些数据在 HSB IP 复位后自动加载,用于填充 BOOTP 枚举包,向主机宣告"我是谁"。


2. 支持网络枚举与设备发现

Holoscan 主机端(如 Jetson)依赖这些标识来管理多设备场景:

  • MAC 地址 :主机通过 MAC 地址匹配配置文件中的 mac_address 字段,建立与特定 HSB 设备的网络连接。
  • 序列号:用于区分同一网络中的多块同型号板卡,支持量产追踪。

如果没有 EEPROM(或 ENUM_EEPROM 未定义),则只能通过 RTL 输入端口硬编码这些信息,这在量产场景下不可行


3. 在线烧录的意义:免拆机、免 JTAG

fpga/script/eeprom/ 目录下的工具支持通过 ECB(Ethernet Control Bus)/UDP 在线读写 EEPROM,带来两个实际好处:

  • 量产烧录:产线无需打开机箱或连接 JTAG,只需通过网络即可为每块板卡写入唯一的 MAC 地址和序列号。
  • 现场维护:部署后若需更换或更新标识信息,可通过主机软件远程操作,无需物理接触硬件。

ECB 本身就是 HSB 控制平面的协议通道,用于寄存器访问、传感器配置等;复用该通道烧录 EEPROM,避免了额外的物理接口需求。


4. 与仿真/开发流程的对比

在仿真环境中,通常注释掉 ENUM_EEPROM,因为搭建 EEPROM 的 Bus Functional Model 比较繁琐;此时 MAC 地址和序列号直接通过输入端口传入。

但在真实硬件上,EEPROM 是必须的------它让 HSB IP 上电即可自给自足地完成网络身份初始化,无需依赖主机预先下发配置。


总结

EEPROM 烧录工具的本质作用是给每块 HSB 硬件板卡分配并固化唯一的网络身份(MAC + 序列号)。通过 ECB/UDP 在线烧录,使得量产部署和现场维护变得高效;而 HSB IP 启动时自动从 EEPROM 读取这些信息,则保证了设备即插即用、可被 Holoscan 主机正确识别和枚举。

5. RFSOC 射频数据面

RFSoC 4x2 (基于 Xilinx Zynq UltraScale+ RFSoC XCZU48DR)中,射频前端(RF-ADC/DAC)与 FPGA 可编程逻辑(PL)之间的数据接口完全由 Xilinx RF Data Converter IP (XRFDC) 提供,其数据平面采用 AXI4-Stream 协议。整个衔接的核心是:RF 采样数据通过 hardened RF-ADC/DAC 转换后,以 AXI-Stream 格式进入/离开 PL 逻辑。


一、整体架构与数据路径

1. RX 路径(ADC → PL)

复制代码
RF 模拟信号
    ↓
RF-ADC (ZU48DR 内置 8x ADC, 最高 5GSPS)
    ↓
XRFDC IP ( hardened + wrapper )
    ↓
m0_axis_tdata / m1_axis_tdata ...  (AXI4-Stream Master)
    ↓
你的处理逻辑 / FIFO / AXI DMA → DDR

2. TX 路径(PL → DAC)

复制代码
DDR / 波形生成器
    ↓
AXI DMA / 自定义逻辑
    ↓
s0_axis_tdata / s1_axis_tdata ...  (AXI4-Stream Slave)
    ↓
XRFDC IP
    ↓
RF-DAC (ZU48DR 内置 8x DAC, 最高 10GSPS)
    ↓
RF 模拟输出

二、RF Data Converter IP 的 AXI-Stream 接口信号

每个 ADC/DAC Tile 对应一组独立的 AXI-Stream 接口。以 ADC0DAC0 为例:

ADC 侧(Master,IP 输出数据)

信号 方向 说明
m0_axis_tdata[N:0] Output 采样数据。位宽取决于 Samples per AXI4-Stream 配置
m0_axis_tvalid Output 数据有效
m0_axis_tready Input PL 侧准备好接收(通常恒接 1,除非反压)
m0_axis_aclk Input AXI-Stream 时钟,由你提供,决定 PL 侧数据速率

DAC 侧(Slave,IP 接收数据)

信号 方向 说明
s0_axis_tdata[N:0] Input 待发送采样数据
s0_axis_tvalid Input PL 侧数据有效
s0_axis_tready Output DAC 侧准备好接收
s0_axis_aclk Input AXI-Stream 时钟

注意 :RFDC IP 的 AXI-Stream 接口没有 tlasttuser ,它是纯连续数据流。帧/包边界由采样计数或外部同步(如 sysref)管理。


三、关键参数:Samples per AXI4-Stream

这是衔接射频采样率与 AXI-Stream 时钟的核心参数。

参数 含义
ADC 采样率 RF-ADC 实际采样率(如 2000 MSPS)
Samples per AXI4-Stream 每个 axi_stream_clock 周期传输的采样点数(1/2/4/8)
AXI-Stream 时钟 PL 侧接口时钟(如 250 MHz / 300 MHz)

带宽平衡公式

复制代码
ADC_Sample_Rate = Samples_per_Clock × axi_stream_clock × (Decimation_Factor)

示例

  • ADC 采样率 = 2000 MSPS
  • Samples per AXI4-Stream = 4
  • axi_stream_clock 最低需要:2000 / 4 = 500 MHz(若无比特抽取)
  • 若启用 2x 抽取(Decimation),则 1000 / 4 = 250 MHz

四、时钟域划分(关键)

RFSoC 中有三个关键时钟,切勿混淆:

时钟 来源 作用
clk_adc0 / clk_dac0 RFDC PLL / 外部时钟 RF 采样时钟域,驱动 hardened ADC/DAC
m0_axis_aclk / s0_axis_aclk 用户 Clocking Wizard PL 数据时钟域,驱动 AXI-Stream 接口
s_axi_aclk 通常 100 MHz 配置时钟域,用于 AXI4-Lite 寄存器访问

axi_stream_clock 是 FPGA fabric 内部的数据流时钟,与 RF 采样时钟独立,但必须满足带宽匹配。


五、典型连接方式

方式 1:ADC → PL 处理 → DAC(实时环回)

在 Vivado Block Design 中,最简架构是:

复制代码
[RFDC ADC m0_axis] → [你的处理 IP (AXI-Stream)] → [RFDC DAC s0_axis]

用户实践证实,直接连线有时因时序/握手问题失败,插入一个缓冲/倍乘模块即可解决:

vhdl 复制代码
-- 极简 AXI-Stream 透传/处理接口示例
s00_axis_tready <= m00_axis_tready;
m00_axis_tvalid <= s00_axis_tvalid;
m00_axis_tdata  <= s00_axis_tdata * 2;  -- 示例:增益

方式 2:ADC → DDR(通过 AXI DMA)

复制代码
[RFDC ADC] → [AXI-Stream FIFO] → [AXI DMA S2MM] → [DDR4 via HP Port]
  • DMA 的 S2MM(Stream to Memory Mapped)接收 ADC 数据写入 DDR
  • 软件(PYNQ/Linux)从 DDR 读取样本做离线处理

方式 3:DDR → DAC(波形回放)

复制代码
[DDR via HP Port] → [AXI DMA MM2S] → [AXI-Stream FIFO] → [RFDC DAC]
  • DMA 的 MM2S(Memory Mapped to Stream)从 DDR 读取波形
  • 支持 Cyclic 模式实现连续播放

六、数据位宽与格式

ADC 输出数据格式

  • 实数模式(Real) :每个采样为 I 或 Q 分量,位宽通常为 16-bit
  • I/Q 模式 :每个时钟周期同时输出 I 和 Q,数据在 tdata 中拼接

位宽计算

若配置 4 Samples per Clock,16-bit 实数:

  • m0_axis_tdata 位宽 = 4 × 16 = 64-bit

这与 PYNQ 基础 Overlay 及常见参考设计一致。


七、RFSoC 4x2 的注意事项

  1. Tile 224 引脚错误:Real Digital 的 RFSoC 4x2 板卡上,ADC Tile 224 的差分正负极存在连接错误,建议避开使用。

  2. PYNQ Overlay:RFSoC-PYNQ 提供了基础 bitstream,包含 AXI GPIO 和 RFDC 配置接口,可直接通过 Python 控制。

  3. Scatter-Gather DMA 兼容性:PYNQ v3.0.1 与 Vivado 2025.1 生成的 SG DMA 可能存在兼容性问题,常规(非 SG)DMA 更稳定。


八、总结

在 RFSoC 4x2 中,射频到 AXI Stream 的接口完全由 Xilinx RF Data Converter IP 封装:

项目 说明
接口协议 AXI4-Stream(无地址,纯流式)
接口角色 ADC 为 Master (输出),DAC 为 Slave(输入)
核心参数 Samples per AXI4-Stream(决定时钟与采样率匹配)
PL 时钟 m/s_axis_aclk,通常 250~500 MHz
数据位宽 取决于采样位深 × Samples per Clock(常见 64/128-bit)
控制接口 AXI4-Lite(用于配置混频器、抽取/插值、NCO 等)

具体项目的信号处理逻辑(滤波、FFT、数字下变频等)只需以标准 AXI4-Stream Slave/Master 形式插入到 m0_axiss0_axis 之间即可,与处理视频/传感器 AXI Stream 的方法完全一致。

相关推荐
yychen_java16 分钟前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
Terasic友晶科技1 小时前
【教程】Agilex 5 SOC FPGA的HPS端如何响应FPGA端中断(三)——设备树Overlay
fpga开发·设备树·agilex 5·设备树overlay
wuyk5551 小时前
从零吃透Modbus通信|第7章:终极工程整合(模块化架构、双模式主机从机、RTOS适配、量产级模板)
c语言·stm32·学习·架构
人生百态,人生如梦2 小时前
每日论文解读(9.2)——SwarmBench:面向LLM Agent Swarm编排能力的多维评估基准与经验增强框架
架构·agent
Vespeng2 小时前
打破传统 MVC:在 Go 中实践高内聚的业务驱动架构
架构·go·gin
ARM|X86+FPGA工业主板厂家2 小时前
基于嵌入式 GPU 的智能服务机器人
linux·运维·arm开发·fpga开发·机器人
Freak嵌入式3 小时前
Pico PIO 汇编语法深度详解:标识符、指令、伪指令全解析
汇编·stm32·单片机·嵌入式硬件·fpga开发·硬件架构
用户3434612783204 小时前
.NET 中任务调度的底层机制与你可能不知道的隐藏陷阱
架构