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 S10PYNQ RFSoCLattice CPNX100Microchip PolarFireLattice MIPI ref
MAC/PCSIntel E-Tile 硬核 eth_100G(带 RS-FEC)Xilinx cmac_usplus:3.1(BD design_1Lattice eth_10gb_mac + eth_10gb_pcs_* IPMicrochip 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_WIDTH512512646464
HOST_MTU4096409640961500(唯一)4096
HIF_CLK_FREQ201.416 MHz(E-Tile ÷64 钟经 PLL 二分频)322.266 MHz(CMAC gt_txusrclk2156.25 MHz156.25 MHz(以 RX 恢复钟为参考的 CCC)156.25 MHz
网口数 HOST_IF_INST21221
tuser 语义(MAC→IP)6bit rx_error 归约或CMAC 错误直送FCS 错误@tlast8bit 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'hCAFEC0FFEE00EEPROMEEPROMEEPROM(预留软 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 重配置)、I2C[0]=板载 EEPROM、
    I2C[1]=AD9545、SPI[0]=ADI、SPI[1]=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 按 addr[11] 再分)、[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 的 SPI[0] 作为主控经它读写 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+I2C[2] 管理。
  • 两路都开 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 插入(tuser[16: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)—— 平台以太网侧

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)—— 平台私有逻辑挂载点

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_infoI2C[0] 读板载 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(传感器 → 主机,数据采集主通路)

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(主机 → 传感器,下行通路)

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.svSIF RX(32b AXIS)+ SIF TXI2S 音频采集/回放,含 MCLK/BCLK/LRCLK 生成
imu/imu_top.svSIF RXI2C IMU 采样,每样本前缀 8B PTP 时间戳
vsync/vsync_gen.sv纯 APB + GPIOPTP 对齐 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(传感器行/帧,tuser[0]=bypass、
    tuser[1]=行末)。满足契约即可接入任意新 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_clkD-PHY 解串→CSI-2 解码→按 Virtual Channel 分行,行 pad 到 64B;输出 64b AXIS:tuser[0]=嵌入式行、tuser[1]=行末
② 进 IPHOLOLINK_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_tophif_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_tophif_clk一帧最后一包之后发 metadata 包(opcode 0x2B + WR-IMM + 48B):含 SOF 时刻的 PTP 时间戳dp_pkt_ts 在 SOF 时锁存)、frame CRC32、PSN、buffer 槽位 buf_ptr、unsync 标志
⑥ ICRCroce_icrchif_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 中把原来直连的线断开,插入处理模块:

// ---- 原来: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 就是模板:

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 时刻主机硬件打戳
T2HSB 收到 SYNC 时刻HSB 硬件打戳
T3HSB 发送 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 Timestamp0x180收到的 SYNC 时间戳
SYNC Correction Field0x184修正域值
PTP Status0x188同步状态位
OFM0x18C计算出的时钟偏移
Mean Delay0x190平均网络延迟
Increment Period0x194当前每周期增量值
Frequency Adjustment0x198频率调整值

三、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–73MAC 地址(48 bit)以太网接口的唯一物理地址
74–80Board 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_tvalidOutput数据有效
m0_axis_treadyInputPL 侧准备好接收(通常恒接 1,除非反压)
m0_axis_aclkInputAXI-Stream 时钟,由你提供,决定 PL 侧数据速率

DAC 侧(Slave,IP 接收数据)

信号方向说明
s0_axis_tdata[N:0]Input待发送采样数据
s0_axis_tvalidInputPL 侧数据有效
s0_axis_treadyOutputDAC 侧准备好接收
s0_axis_aclkInputAXI-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_dac0RFDC PLL / 外部时钟RF 采样时钟域,驱动 hardened ADC/DAC
m0_axis_aclk / s0_axis_aclk用户 Clocking WizardPL 数据时钟域,驱动 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]

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

-- 极简 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 的方法完全一致。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐