1. 系统架构
本文分析 ./fpga/ 目录中数据采集部分的代码架构,覆盖:
- 如何兼容各家 FPGA(重点是 RoCEv2 网络通信支持在各平台上的差异)
- FPGA 平台相关代码的架构
- FPGA 平台无关代码的架构
- 平台无关代码 ↔ 平台相关代码的数据接口
- 平台无关代码 ↔ 传感器的数据接口
总览:目录与分层
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 兼容机制总述
兼容性靠三层设计实现:
- 同一份 IP 顶层 :所有平台都例化
fpga/nv_hsb_ip/top/HOLOLINK_top.sv的HOLOLINK_top,端口契约固定(见第 3 节)。 - 每平台一份配置包
HOLOLINK_def.svh:定义package HOLOLINK_pkg,用`define宏 + localparam 数组声明本平台
的时钟频率、接口数量、位宽、MTU、初始化寄存器序列等。HOLOLINK_top.sv第 17 行`include "HOLOLINK_def.svh",
编译时由工程把对应平台的版本放在 include 路径上,实现"同代码、不同配置"。所有条件编译(ifdef)都基于这些宏,
未定义某宏(如SENSOR_TX_IF_INST、SPI_INST、I2C_INST)即裁剪掉对应模块与端口(HOLOLINK_top.sv:54-126)。 - 每平台一层"胶水逻辑" :把厂商以太网 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'h2ARDMA_WRITE /
8'h2BRDMA_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_PTP、BRIDGE_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-Tileeth_100G(含 RS-FEC 重配置口);
eth_top.sv支持ETH_25Gx4宏切换 25G×4。E-Tileo_clk_pll_div64=402.83MHz →hif_pll出hif_clk=201.4MHz 与
ptp_clk;fpga_clk_pll_mfg出 100MHzapb_clk。 - HIF 适配 :RX = E-Tile AVST →
dcfifo跨钟 →avst_to_axis(empty→tkeep查找表 + 字节序翻转 +tuser=|error);
TX =axis_to_avst(SOP 状态重建、$countones(tkeep)求 empty)→ 跨钟 dcfifo → 256 深整包 SCFIFO。
MAC/PCS 寄存器经 APB 窗口 +avmm_to_apb(rtl/misc/avmm_to_apb.sv,带超时返回32'hBADADD12)访问 E-Tile
AVMM 重配置空间;自适应 FSM 上电抢占 AVMM 做 AN/LT。 - 传感器 :
jesd_top(JESD_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 designdesign_1(由
build/ip/bd_gen.tcl生成:cmac_usplus:3.1CAUI-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=1(FPGA_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 伴随)。
cpnx100 (rtl/top/FPGA_top.sv,897 行):
- 以太网 :2×10G SFP+。
rtl/eth_10gb/eth_10gb_top.sv例化 Latticeeth_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:
- 2×
cam_rcvr(rtl/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 事件。
- 2×
- 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_reg22 条:上电自动配置两片 PCS(loopback/均衡/迭代次数)与两片 MAC(mode/tx_ctl/rx_ctl/pkg_len/ipg)。
clnx17 (rtl/top/FPGA_clnx_top.sv):MIPI→LVDS 桥。
- 2×
mipi_bridge(rtl/mipi_bridge/mipi_bridge.v):MIPI CSI-2 D-PHY RX(LMMI 配置接口)→ FIFO → 11bit DDR LVDS
输出------即 cpnx100 两路 LVDS 相机数据的真正源头是 clnx17 转发的 MIPI 相机。 FPGA_spi_peri_ctrl_fsm(rtl/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 适配(四层级联,本平台最特殊) :
MAC_BaseR.v:MAC_to_AXIS把 SYS_MAC 的 SOP/EOP/EN/BC 接口转成标准 AXI4-Stream;MAC_Hololink_top.v:两片 MAC + tuser 位宽适配(HOLOLINK TX tuser 1bit 零扩展到 3bit;MAC RX tuser 8bit 取
bit0);HoloLink_SD.v(SD=SmartDesign 画布):例化 wrapper + 6 个BIBUF(I2C 开漏)+PF_SPIIO macro;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。相机训练复位/使能由 HOLOLINKo_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_top,sys_ready门控)。 - 传感器 :2×
mipi_cam_rcvr(rtl/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.043MHzCAM_MCLK与 24M PTP 相机钟;vsync_gen(PTP 帧同步)复用到 GPIO;APBpsel[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.sv按VP_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):- RoCEv2 头 (70B:ETH+IP+UDP+BTH+RETH,opcode
0x2A)------数据包; - RoCE + WR-IMM + 48B Metadata (opcode
0x2B)------帧尾元数据包:SOF PTP 时间戳、frame CRC32(dp_pkt.sv
内lfsr_hc逐拍累计)、PSN、frame_num、buffer 槽位buf_ptr、unsync 标志; - RoCE + 4B WR-IMM (
md_disable时最后一包直接带 immediate); - CoE/IEEE 1722b 头 (46B,EtherType
0x22F0,is_1722b配置位); - CoE + Metadata 。
DIS_COE(由平台 def 的DISABLE_COE宏推导)强制剔除 CoE 路径。PTP 时间戳由dp_pkt_ts.sv以每 VP 4 深
时间戳 RAM 对齐 SOF→帧尾。输出经每 host 一个roce_icrc追加 ICRC(CoE 不加)。
- RoCEv2 头 (70B:ETH+IP+UDP+BTH+RETH,opcode
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(opcode0x11,AETH 带
MSN);PSN 超前→NAK PSN sequence error(每 QP 只发一次);PSN 落后→静默丢弃;!stx_ready→RNR NAK。AckReq 位
(BTHa_rsv7[7])触发;错误包回咬数据通路整包丢弃。QP 上下文({rnr_timer, host_qp})由软件写 QP RAM
(APB 窗口0x0000_3000,s_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.sv:Ethernet Control Bus ------把 UDP/RoCE 命令包(WR_DWORD=0x04/RD_DWORD=0x14/
WR_BLOCK/RD_BLOCK等,见ecb_pkg.sv)解析成<addr32,data32>对,驱动 APB master (m_apb_m2s[0])
遍历全芯片寄存器空间。这是主机配置 FPGA 的唯一通道(Hololink 软件栈的寄存器读写都走它)。响应带序号/错误码;
RoCE-ECB 响应先插 32B RoCE 头再算 ICRC。bootp/bootp.sv:init_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.sv(ifdef 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+i;eeprom_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_xxxx,psel[4]→0x5000_xxxx)。- 平台把厂商 MAC/PCS 寄存器、相机接收器配置、vsync/delayed_io、ILA、mailbox 等挂到这些口上;主机软件经 ECB 即
可读写它们(地址即完整 32b 地址)。sys_init的init_reg[]也通过这个路径上电自动初始化平台寄存器。 apb_intc_top的 watchdog 保证平台从机不挂死总线。
3.4 枚举 / 初始化接口
二选一(由 def 宏 `ENUM_EEPROM 决定):
- EEPROM 模式 (Terasic/Lattice/Microchip/MIPI ref):无端口;IP 内部
eeprom_info经 I2C0 读板载 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](主机软复位传感器,平台接相机复位脚)。 - PTP :
i_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 packetizer (packetizer_top.sv:236buf_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_parser→sensor_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.svhECB 寄存器读写任务,
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. 关键结论
- 兼容策略 = "一份协议 IP + 每平台一份 def 配置包 + 一层厂商胶合逻辑" 。RoCEv2/UDP/PTP/BOOTP/ECB 全部收敛在
nv_hsb_ip,平台差异被压缩到 MAC 适配(AVST/AXIS/私有接口 → 统一 AXIS)、位宽/MTU/时钟宏、传感器物理层四
件事上。 - 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)已实现但未被任何在版平台启用。 - 两个 AXI-Stream 契约是全部集成的关键 :HIF(以太网帧,tuser=包错误)与 SIF(传感器行/帧,tuser0=bypass、
tuser1=行末)。满足契约即可接入任意新 MAC 或新传感器。 - 控制面完全建立在 ECB/APB 之上 :主机所有配置都经 ECB 包 → APB master → 32b 地址空间(Hololink 内部 +
REG_INST用户口),平台私有寄存器(MAC/PCS/相机/调试)因此天然对主机软件可见;init_reg与 EEPROM 机制让
板卡上电即可自举到"可被 BOOTP 枚举"的状态。
2. Holoscan Sensor Bridge FPGA 典型数据流分析 与 数据处理逻辑插入指南
本文分两部分:
- 典型数据流分析------以相机采集场景为例,端到端走一遍 FPGA 内部数据通路;
- 在 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:1518 的 pkt_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_pkt 与 eth_pkt 之间(会破坏 RoCE 头/ICRC 一致性)、MAC 适配层(那里是以太网帧语义,处理逻辑会牵扯两个时钟域和厂商接口)。
为什么 A 是首选:
- 数据还是"传感器原生格式"(像素/样本语义最清晰);
- 包边界可以重新定义 ------处理改变了数据量(如 2:1 抽稀)后,你重新生成
tlast,packetizer 只认包 ≤ MTU,完全无感; - 不动
nv_hsb_ip共享代码,升级 IP 不冲突; - 有现成先例:
data_genmux 就是 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-1868 有 axis_checker 断言,归纳如下:
- 一包 ≤
HOST_MTU(4096 或 Microchip 的 1500)且 ≥ 58B;tlast必须出现在包尾,tkeep前导连续 1; tuser[1]=行末/帧尾 :packetizer 开启时靠它做 64B 对齐 padding,处理逻辑要透传或重新生成;若你的输出希望跳过 packetizer 直通,置tuser[0]=1(fpga/nv_hsb_ip/packetizer/packetizer_top.sv:236的buf_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_cdc,fpga/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 的工作流程:
-
复位后 :Timer 从 0 秒、0 纳秒开始,每个时钟沿按
1/PTP_CLK_FREQ纳秒递增(含 24-bit 小数纳秒精度)。例如 10G 应用中PTP_CLK_FREQ = 100446545,每周期增量约 9.955 ns。 -
首次 SYNC :HSB 收到主机的 SYNC/FOLLOW-UP 消息后,将主机时间 T1 锁存为本地当前时间,Timer 在此基础上继续递增。
-
持续同步 :后续 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 接口。以 ADC0 和 DAC0 为例:
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 接口没有
tlast和tuser,它是纯连续数据流。帧/包边界由采样计数或外部同步(如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 的注意事项
-
Tile 224 引脚错误:Real Digital 的 RFSoC 4x2 板卡上,ADC Tile 224 的差分正负极存在连接错误,建议避开使用。
-
PYNQ Overlay:RFSoC-PYNQ 提供了基础 bitstream,包含 AXI GPIO 和 RFDC 配置接口,可直接通过 Python 控制。
-
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_axis 和 s0_axis 之间即可,与处理视频/传感器 AXI Stream 的方法完全一致。