跳转到内容
新建笔记

AD7768-4 经 Artix-7、DDR3 和 PCIe 传输到 i.MX8MP

状态说明:历史 A200T 方案

本页记录的是 XC7A200T + 板载 DDR3 + AXI DMA S2MM + XDMA AXI-MM 阶段方案,用于保留早期设计与验证依据,不是当前手持式振动分析仪的产品基线。当前产品方向已切换为 XC7A35T 无 FPGA 外部 DDR 方案:采集数据经异步 FIFO 和分包器直接进入 XDMA AXI4-Stream C2H,由 i.MX8MP 内存承担大容量缓冲。当前设计、构建与验证流程请以 XC7A35T 无 DDR XDMA C2H 直通采集链路 为准,不要混用两套 bitstream 和 Linux 测试方法。

本教程记录在正点原子达芬奇 Pro(XC7A200T-FBG484-2)中加入 AD7768-4 数据采集链路的全过程。基础 PCIe、XDMA 和 DDR3 通路参见 i.MX8MP 与 Artix-7 通过 PCIe XDMA 访问 DDR3。

最终 FPGA 数据路径为:

flowchart LR
ADC["AD7768-4<br/>DCLK / DRDY / DOUT0"]
RX["TDM 接收器<br/>4 × 32 bit"]
FIFO["XPM 异步 FIFO<br/>ADC 时钟域 → AXI 时钟域"]
AXIS["AXI4-Stream<br/>128 bit"]
DMA["AXI DMA<br/>S2MM"]
SMC["SmartConnect<br/>双主设备访问 DDR3"]
MIG["MIG 7 Series"]
DDR["板载 DDR3<br/>512 MiB"]
XDMA["XDMA AXI-MM<br/>PCIe Endpoint"]
SOC["i.MX8MP Linux<br/>PCIe Root Complex"]
ADC --> RX --> FIFO --> AXIS --> DMA --> SMC --> MIG --> DDR
SOC <--> XDMA <--> SMC

控制路径为:

flowchart LR
SOC["i.MX8MP<br/>/dev/xdma0_user"]
LITE["XDMA M_AXI_LITE"]
XBAR["AXI-Lite SmartConnect<br/>1 SI / 3 MI"]
DMA["AXI DMA 寄存器"]
GPIO["AXI GPIO<br/>控制与状态"]
SPI["AXI Quad SPI<br/>AD7768 配置"]
SOC --> LITE --> XBAR
XBAR --> DMA
XBAR --> GPIO
XBAR --> SPI

当前状态必须准确区分:

范围状态
AD7768 TDM 接收器行为仿真已通过
异步 FIFO、AXI4-Stream 握手、反压和 TLAST已通过仿真
Vivado 综合、布局布线、DRC 和时序已通过
PCIe、XDMA、DDR3 基础读写使用上一阶段 bitstream 已完成硬件实测
新 bitstream 的 PCIe BAR、AXI DMA 和中断尚未接板实测
AD7768 SPI 读回和真实采样数据尚未接 AD7768-4,未实测
ADC 输入时序和产品级 DCLK 引脚尚未最终签核

因此,本阶段完成的是“可综合、可实现、经过行为仿真的 FPGA 采集链路”,不能表述成“AD7768-4 真板连续采集已经完成”。

项目配置
SoC 开发板飞凌 OK8MP,NXP i.MX8MP
FPGA 开发板正点原子达芬奇 Pro,XC7A200T-FBG484-2
FPGA 存储器板载 DDR3,AXI 地址空间 512 MiB
ADCAD7768-4 采集板,当前尚未接入
PCIei.MX8MP 为 Root Complex,FPGA 为 Endpoint,x1 连接
FPGA 配置Digilent JTAG
临时 ADC 接口达芬奇 Pro 摄像头扩展口,LVCMOS33
项目路径或版本
VivadoAMD Vivado 2026.1
FPGA 工程C:\Users\mtxl\Desktop\project_analysis\adfpga
最终工程脚本adfpga\connect_xdma_mig.tcl
AD7768 接收器adfpga\rtl\ad7768_tdm_rx.v
行为仿真平台adfpga\sim\tb_ad7768_tdm_rx.sv
主约束adfpga\fpga_pcie.srcs\constrs_1\new\pins.xdc
异步时钟约束adfpga\fpga_pcie.srcs\constrs_1\new\ad7768_async.xdc
最终 bitstreamadfpga\fpga_pcie.runs\impl_1\system_wrapper.bit
Linux SDKZ:\fling\OK8MP-linux-sdk
XDMA 驱动dma_ip_drivers\XDMA\linux-kernel\xdma\xdma.ko

官方达芬奇 Pro 例程中最有参考价值的部分包括:

  • 1_pcie_xdma:最小 XDMA Endpoint;
  • 3_pcie_memory_rw:PCIe 内存读写;
  • 4_pcie_gpio_control:AXI-Lite GPIO;
  • 5_pcie_interrupt:用户中断;
  • 6_pcie_xdma_ddr:XDMA、SmartConnect、MIG 和 DDR3;
  • 18_ip_fifo:FIFO 基本使用;
  • 36_top_ddr3_rw:DDR3/MIG;
  • OV5640/OV7725 例程:摄像头接口引脚约束。

3. 为什么采用这套结构

跳转到“3. 为什么采用这套结构”

3.1 异步 FIFO 解决跨时钟,不代替 DDR3

跳转到“3.1 异步 FIFO 解决跨时钟,不代替 DDR3”

AD7768 的 DCLK 由 ADC 数据接口产生,与 XDMA AXI 时钟、MIG 用户时钟没有固定相位关系。直接跨域传递 128 bit 数据会产生亚稳态和数据撕裂,因此必须先进入双时钟 FIFO。

本工程使用 xpm_fifo_async:

  • 写时钟:adc_dclk;
  • 读时钟:m_axis_aclk;
  • 数据宽度:128 bit;
  • 深度:2048 帧;
  • 存储资源:Block RAM;
  • 读模式:First Word Fall Through;
  • prog_full 阈值:深度减 16。

每帧 16 字节,因此 FIFO 容量是:

2048 × 16 byte = 32768 byte = 32 KiB

32 KiB 只用于吸收短时反压。大容量采集缓存仍由板载 DDR3 提供。

3.2 AXI DMA 负责流到内存

跳转到“3.2 AXI DMA 负责流到内存”

接收器输出 AXI4-Stream,而 MIG 暴露 AXI Memory Mapped 从接口。AXI DMA 的 S2MM 通道负责协议转换:

AXI4-Stream → AXI DMA S2MM → AXI-MM → DDR3

这样不需要自行实现复杂的 AXI 写突发状态机、地址递增和写响应处理。

3.3 DDR3 解耦采集与 PCIe读取

跳转到“3.3 DDR3 解耦采集与 PCIe读取”

ADC 按固定采样节奏持续产生数据,i.MX8MP 的读取会受到 Linux 调度、应用处理和 PCIe DMA 请求影响。DDR3 作为大容量缓冲区,可以把两种节奏解耦。

当前实现先完成单块 64 KiB DMA。正式连续采集还需要在 SoC 软件中扩展为双缓冲或环形缓冲,并维护生产者/消费者指针。

接收器针对以下配置编写:

  • AD7768-4 标准模式;
  • FORMAT0 = 1;
  • 使用 DOUT0 传输四个通道;
  • 一帧包含四个连续的 32 bit 时隙;
  • 每个时隙是 8 bit 状态/头字段和 24 bit 有符号采样;
  • 串行数据按 MSB first 接收;
  • 在 DCLK 下降沿采样;
  • DRDY 下降后,从下一个 DCLK 下降沿开始接收 128 bit。

连接真板后,必须用示波器或 ILA 验证采样边沿和 DRDY 相位;如果 ADC 板配置不同,接收状态机也要调整。

一帧固定为 16 字节:

字节偏移内容32 bit 字格式
0x00CH0[31:24] 头字段,[23:0] 有符号采样
0x04CH1[31:24] 头字段,[23:0] 有符号采样
0x08CH2[31:24] 头字段,[23:0] 有符号采样
0x0CCH3[31:24] 头字段,[23:0] 有符号采样

AXI DMA 写入 DDR3 后,i.MX8MP 按小端 32 bit 字读取。Python 解析示例:

def decode_slot(frame: bytes, offset: int) -> tuple[int, int]:
raw = int.from_bytes(frame[offset:offset + 4], "little")
header = (raw >> 24) & 0xFF
sample = raw & 0xFFFFFF
if sample & 0x800000:
sample -= 1 << 24
return header, sample
for channel in range(4):
header, sample = decode_slot(frame, channel * 4)
print(channel, header, sample)

接收器每帧产生一个 128 bit AXI4-Stream beat:

  • TDATA:CH0、CH1、CH2、CH3;
  • TKEEP = 16'hFFFF;
  • 遵守 TVALID/TREADY 反压;
  • 每 4096 帧产生一次 TLAST。

DMA 块大小为:

4096 frame × 16 byte/frame = 65536 byte = 64 KiB

因此简单模式 S2MM 的 LENGTH 应设置为 0x00010000。

AXI GPIO 第一通道是 4 bit 输出:

位信号含义
bit 0adc_reset_nAD7768 RESET#,1 为释放复位
bit 1adc_startAD7768 START
bit 2capture_enable1 允许接收数据
bit 3capture_clear高脉冲清除 FIFO、帧计数和溢出状态

GPIO 默认输出是 0x3:ADC 释放复位、START=1,但采集未使能。

常用控制值:

写入值作用
0x0拉低 RESET# 和 START
0x3释放 ADC,采集关闭
0x7释放 ADC并使能采集
0xF 后写 0x7在保持采集使能时产生清除脉冲

不要让 bit 3 长时间保持为 1,否则采集状态会持续处于清除状态。

AXI GPIO 第二通道是 32 bit 输入:

位含义
bit 31FIFO 溢出粘滞标志,清除脉冲后复位
bit 30FIFO 接近满
bit 29FIFO 中存在数据
bit 28:0已接受 ADC 帧数,自动回绕

帧计数在 ADC 时钟域使用 Gray 码跨域,溢出和 prog_full 使用双触发器同步。

当前没有连接 ADC。为了先完成工程和仿真,接口暂时映射到达芬奇 Pro 摄像头扩展口:

AD7768 信号开发板信号FPGA 管脚电平
DCLKcam_pclkU18LVCMOS33
DRDYcam_vsyncP14LVCMOS33
DOUT0cam_data[0]P17LVCMOS33
RESET#cam_rst_nN17LVCMOS33
STARTcam_hrefN14LVCMOS33
SPI MOSI/IO0cam_data[1]P15LVCMOS33
SPI MISO/IO1cam_data[2]R16LVCMOS33
SPI SCKcam_data[3]R17LVCMOS33
SPI SS#cam_data[4]P16LVCMOS33

这些映射已经与官方摄像头例程 XDC 交叉核对。使用这些引脚时不能同时连接摄像头。

U18 不是专用 MRCC/SRCC 时钟输入,当前约束使用了 CLOCK_DEDICATED_ROUTE FALSE。它可用于现阶段低速功能测试,但不应直接作为产品板最终 DCLK 方案。产品硬件必须将 DCLK 接到合适的时钟能力引脚。

接线前必须确认:

  1. ADC 数字接口电平与 FPGA Bank 的 3.3 V LVCMOS 兼容;
  2. 两块板共地;
  3. 输入信号不超过 FPGA 绝对最大额定值;
  4. 断电接线;
  5. 先验证 RESET#、START 和 SPI,再启用高速数据口。
参数值
Scatter Gather关闭
MM2S关闭
S2MM开启
S2MM Store and Forward开启
S2MM DRE关闭
Stream 数据宽度128 bit
M_AXI_S2MM 数据宽度128 bit
最大 Burst16
Length Width26 bit

因为 DRE 关闭,目标地址和长度必须满足总线对齐要求。当前 64 KiB 块和建议的 DDR 地址都按 16 字节对齐。

  • 通道 1:4 bit,全输出;
  • 默认输出:0x00000003;
  • 通道 2:32 bit,全输入;
  • GPIO 自身中断关闭。
参数值
SPI 类型标准 SPI
SPI ModeMode 0
传输宽度8 bit
SS 数量1
FIFO 深度16
SCK Ratio16

SPI 参数是当前设计配置,必须在连接真板后以寄存器读回验证。只有成功读出稳定且符合手册的芯片寄存器值,才能继续启动 ADC 数据采集。

DDR3 数据 SmartConnect:

  • NUM_SI = 2;
  • NUM_MI = 1;
  • 两个时钟输入;
  • XDMA M_AXI 和 AXI DMA M_AXI_S2MM 共同访问 MIG。

AXI-Lite SmartConnect:

  • NUM_SI = 1;
  • NUM_MI = 3;
  • XDMA M_AXI_LITE 为输入;
  • 输出到 AXI DMA、AXI GPIO 和 AXI Quad SPI。

本阶段在原有 AXI-MM Endpoint 上额外开启:

  • AXI-Lite Master;
  • AXI-Lite aperture 为 1 MiB;
  • 一个用户中断;
  • AXI DMA s2mm_introut 接到 usr_irq_req[0]。

修改 BAR 布局后,必须先烧录 FPGA,再硬复位或重启 i.MX8MP,让 Root Complex 重新枚举 Endpoint。只执行 modprobe -r xdma; modprobe xdma 不足以重新分配 PCIe BAR。

主设备地址范围
XDMA M_AXI0x00000000512 MiB
AXI DMA Data_S2MM0x00000000512 MiB

两个主设备看到相同 DDR3 地址。AXI DMA 写入地址 0x01000000 后,i.MX8MP 应使用 XDMA C2H 从同一设备偏移 0x01000000 读取。

模块基地址范围
AXI DMA 控制寄存器0x0000000064 KiB
AXI GPIO0x0001000064 KiB
AXI Quad SPI0x0002000064 KiB

典型 XDMA Linux 驱动会把 AXI-Lite Master 暴露为 /dev/xdma0_user。新 bitstream 上电并重新枚举后应确认该节点出现;旧基线工程关闭了 AXI-Lite Master,因此旧笔记中没有此节点是正常的。

AXI GPIO 常用偏移:

地址寄存器
0x00010000GPIO 通道 1 DATA,写控制位
0x00010004GPIO 通道 1 TRI
0x00010008GPIO 通道 2 DATA,读状态位
0x0001000CGPIO 通道 2 TRI

AXI DMA S2MM 常用偏移:

地址寄存器
0x00000030S2MM_DMACR
0x00000034S2MM_DMASR
0x00000048S2MM_DA
0x0000004CS2MM_DA_MSB,32 bit 地址设计通常写 0
0x00000058S2MM_LENGTH

寄存器位定义应以当前 AXI DMA 7.1 Product Guide 为准,不要仅凭十六进制常数猜测状态。

9. 使用唯一 Tcl 脚本重建工程

跳转到“9. 使用唯一 Tcl 脚本重建工程”

工程只保留 connect_xdma_mig.tcl 作为最终集成入口。脚本可以重复运行,负责:

  • 添加 AD7768 接收 RTL;
  • 添加并配置 AXI DMA、AXI GPIO、AXI Quad SPI;
  • 开启 XDMA AXI-Lite Master;
  • 建立两个 SmartConnect;
  • 连接 AXI、时钟、复位和用户中断;
  • 导出 AD7768 数据、控制和 SPI 端口;
  • 建立 DDR3 和 AXI-Lite 地址映射;
  • 注册实现阶段专用异步时钟 XDC;
  • 校验 Block Design;
  • 可选执行完整构建和 JTAG 下载。

9.1 只更新并校验 Block Design

跳转到“9.1 只更新并校验 Block Design”

在 Vivado Tcl Console 中执行:

source C:/Users/mtxl/Desktop/project_analysis/adfpga/connect_xdma_mig.tcl

预期输出包含:

FINAL VALIDATION PASSED
XDMA M_AXI DDR3 : 0x00000000 / 512M
AD7768 frame : 16 bytes (CH0, CH1, CH2, CH3)
AXI DMA control : 0x00000000 / 64K
AD7768 GPIO : 0x00010000 / 64K
AD7768 SPI : 0x00020000 / 64K

在 PowerShell 中执行:

终端窗口
cd C:\Users\mtxl\Desktop\project_analysis\adfpga
vivado -mode batch -source connect_xdma_mig.tcl -tclargs build

脚本会清除所有综合缓存并重建 OOC 和顶层运行,防止修改后的 RTL 被旧 DCP 静默替换。脚本还会检查:

  • Implementation 状态包含 Complete;
  • WNS 不小于 0;
  • WHS 不小于 0;
  • 最终 bitstream 文件存在。

确认开发板供电、JTAG 已连接后执行:

终端窗口
cd C:\Users\mtxl\Desktop\project_analysis\adfpga
vivado -mode batch -source connect_xdma_mig.tcl -tclargs program

脚本要求检测到唯一的 xc7a200t_0,然后下载当前工程生成的 system_wrapper.bit。

测试平台验证三组已知 128 bit 帧,并覆盖:

  • CH0、CH1、CH2、CH3 顺序;
  • MSB first 串行接收;
  • DRDY 与首位时序;
  • AXI TREADY 反压;
  • 异步 FIFO 跨时钟;
  • TKEEP = 0xFFFF;
  • 测试配置每两帧产生 TLAST;
  • 帧计数;
  • 无 FIFO 溢出;
  • RESET# 和 START 输出。

复现命令:

终端窗口
cd C:\Users\mtxl\Desktop\project_analysis\adfpga
xvlog --sv rtl/ad7768_tdm_rx.v sim/tb_ad7768_tdm_rx.sv
xelab -L xpm -L unisims_ver tb_ad7768_tdm_rx glbl -s ad7768_rx_sim
xsim ad7768_rx_sim -runall

通过标志:

AD7768_TDM_RX_TEST_PASS

最后一次仿真在 2026-08-08 23:03:58 完成,结束时间为 16345 ns。

最后一次完整构建结果:

项目结果
综合0 Errors,0 Critical Warnings
Implementationwrite_bitstream Complete!
WNS+0.951 ns
WHS+0.014 ns
路由 DRC0 Errors
bitstream 生成时间2026-08-08 23:01:33

CDC 修正包括:

  • ADC 和 AXI 时钟域分别使用本地复位流水线;
  • GPIO 控制位使用 ASYNC_REG 同步;
  • 帧计数在源时钟域先寄存为 Gray 码再跨域;
  • 溢出标志和 FIFO prog_full 使用双触发器同步;
  • 数据使用 XPM 异步 FIFO;
  • adc_dclk 与 MIG/XDMA 时钟用实现阶段 set_clock_groups -asynchronous 声明异步。

此前的自定义逻辑 CDC-2 和 CDC-10 已消失。剩余自定义 CDC-6 是已注册 Gray 计数器多位同步提示,报告中已标记 Asynch Clock Groups。大量 CDC-15 和 TIMING-17 位于 AMD/Xilinx 的 SmartConnect、MIG、AXI DMA 或 XDMA 内部,不属于自定义 AD7768 接收器逻辑。

当前仍保留两个合理但未关闭的 TIMING-18:

  • adc_dout0 相对 adc_dclk 缺少输入延迟;
  • adc_drdy 相对 adc_dclk 缺少输入延迟。

在 ADC 板尚未连接、DCLK 频率和线缆延迟尚未确定时,不能编造 set_input_delay 数值。连接真板后应根据 AD7768 数据手册和实测波形补齐。

12. i.MX8MP 侧首次验证顺序

跳转到“12. i.MX8MP 侧首次验证顺序”

这一节是接板后的操作清单,尚未在新 bitstream 上执行。

  1. 断电连接 PCIe 和 ADC 信号;
  2. 给 FPGA 和 AD7768 板供电;
  3. 用 JTAG 下载新 bitstream;
  4. 硬复位或重新启动 i.MX8MP;
  5. 等待 Linux 完整启动;
  6. 检查 PCIe 枚举和 BAR;
  7. 加载 xdma.ko;
  8. 检查 user、H2C、C2H 和 event 节点。
终端窗口
lspci -nn
lspci -vv -s 01:00.0
dmesg | grep -Ei 'pcie|pci|xdma|aer|timeout' | tail -n 120
modprobe xdma
ls -l /dev/xdma*

预期至少出现:

/dev/xdma0_control
/dev/xdma0_user
/dev/xdma0_h2c_0
/dev/xdma0_c2h_0
/dev/xdma0_events_0

实际编号取决于驱动版本。如果没有 /dev/xdma0_user,先检查新 bitstream 是否确实下载、SoC 是否在下载后重新枚举,以及 BAR 大小是否正确。

12.3 先验证 AXI-Lite,再启动采集

跳转到“12.3 先验证 AXI-Lite,再启动采集”

推荐顺序:

  1. 读 AXI GPIO 状态寄存器;
  2. 写 GPIO 控制 0x3;
  3. 通过 SPI 读取 AD7768 芯片标识或已知复位值;
  4. 配置 AD7768 数据格式和采样率;
  5. 再次读回全部关键寄存器;
  6. 产生 FIFO 清除脉冲;
  7. 配置并启动 AXI DMA;
  8. 最后写 GPIO 控制 0x7 使能采集。

不要在 DMA 尚未准备好时长时间开启采集。FIFO 只有 32 KiB,不能代替 DDR3 缓冲。

12.4 AXI DMA 单块采集顺序

跳转到“12.4 AXI DMA 单块采集顺序”

示例使用 DDR 地址 0x01000000 和长度 0x00010000:

  1. 确认 S2MM 通道停止或复位;
  2. 清除 S2MM 状态中的历史中断位;
  3. 写 S2MM 目标地址 0x01000000;
  4. 写高地址 0;
  5. 设置 S2MM RS,按需开启 IOC 中断;
  6. 写 S2MM_LENGTH = 0x00010000,DMA 开始等待数据;
  7. 写 GPIO 0xF 后写 0x7,清除并使能采集;
  8. 等待 /dev/xdma0_events_0 或轮询 S2MM 状态;
  9. 清除 AXI DMA IOC 中断;
  10. 关闭采集或立即准备下一块 DMA。

DMA 中断连接到 XDMA 用户中断 0。AXI DMA 的中断源必须通过 S2MM 状态寄存器清除,否则事件可能持续保持。

XDMA C2H 设备偏移必须与 AXI DMA 目标地址一致:

DDR DMA target = 0x01000000
C2H file offset = 0x01000000
read length = 65536

BusyBox dd 的 skip/seek 容易造成设备偏移误判,优先使用 AMD/Xilinx dma_from_device,或使用包含 lseek 的 C 程序:

int fd = open("/dev/xdma0_c2h_0", O_RDONLY);
off_t offset = 0x01000000;
size_t length = 65536;
if (fd < 0 || lseek(fd, offset, SEEK_SET) != offset) {
perror("open/lseek");
return 1;
}
ssize_t received = read(fd, buffer, length);
if (received != (ssize_t)length) {
perror("read");
return 1;
}

读取后检查:

  • 文件长度是否为 65536;
  • 每 16 字节是否形成一帧;
  • 四个通道头字段是否符合 AD7768 配置;
  • 帧计数是否与 DMA 长度一致;
  • 是否出现全 0、全 1、固定重复值或通道错位;
  • GPIO 溢出位是否为 0;
  • dmesg 是否出现 AER、DMA timeout 或 AXI 错误。

按以下顺序检查:

  1. ADC 电源、参考电压和数字 I/O 电压;
  2. 共地;
  3. RESET# 是否释放;
  4. SS# 是否只在传输期间拉低;
  5. SCK 的空闲电平和采样边沿;
  6. MOSI/MISO 是否接反;
  7. 读命令格式和地址位是否符合 AD7768 手册;
  8. AXI Quad SPI 收发 FIFO 是否被正确复位和清空。

SPI 读回未通过前,不应调试高速采样数据。

检查:

  • GPIO bit 2 是否为 1;
  • ADC 是否输出 DCLK;
  • DRDY 是否产生下降沿;
  • DOUT0 是否有翻转;
  • RESET# 和 START 状态;
  • DCLK 频率是否超过当前临时走线可可靠工作的范围。

如果状态 bit 31 为 1:

  • 确认 DMA 已在采集前启动;
  • 检查 AXI DMA 是否 Halted 或报 Internal/Slave/Decode Error;
  • 检查 MIG init_calib_complete;
  • 检查 DDR SmartConnect 两个时钟输入;
  • 确认 S2MM 地址和长度对齐;
  • 确认每块 DMA 完成后及时启动下一块。

清除溢出:先停止采集,GPIO 写 0xB 再写 0x3;如果要立即重新采集,写 0xF 再写 0x7。

重点读取 S2MM_DMASR:

  • Halted:通道未运行;
  • Idle:没有活动传输;
  • DMA Internal Error:内部长度或流错误;
  • DMA Slave Error:DDR 从设备响应错误;
  • DMA Decode Error:目标地址未映射;
  • IOC IRQ:一块已完成。

同时确认 TLAST 每 4096 帧产生一次,S2MM 长度正好是 65536 字节。长度与 TLAST 不一致可能导致提前结束、等待或状态错误。

13.5 PCIe 枚举正常但控制寄存器不可访问

跳转到“13.5 PCIe 枚举正常但控制寄存器不可访问”

新设计与旧基线的主要区别是启用了 XDMA AXI-Lite Master。检查:

  • 是否烧录了 2026-08-08 23:01:33 生成的新 bitstream;
  • FPGA 下载后是否重启了 i.MX8MP;
  • /dev/xdma0_user 是否存在;
  • AXI-Lite aperture 是否为 1 MiB;
  • AXI DMA、GPIO、SPI 地址段是否都在 aperture 内;
  • AXI-Lite SmartConnect 的时钟和复位是否正常。

当前实现适合原型验证,产品级振动分析仪还需要:

  1. 将 DCLK 改接到合适的 MRCC/SRCC 管脚;
  2. 根据 AD7768 数据手册和实测线缆延迟添加输入时序约束;
  3. 用 SPI 读回确认全部 ADC 配置;
  4. 用示波器或 ILA 确认 DCLK、DRDY、DOUT0 相位;
  5. 验证不同采样率、滤波器和功耗模式;
  6. 将单块 DMA 扩展为双缓冲或环形缓冲;
  7. 定义块头:序号、时间戳、有效长度、采样率、通道状态和错误标志;
  8. 设计生产者/消费者指针及越界策略;
  9. 加入硬件时间戳或外部同步输入;
  10. 做不少于数小时的连续采集、丢帧和数据一致性测试;
  11. 做断线、复位、DMA 超时和 PCIe 重训练恢复测试;
  12. 再评估从 Gen1 x1 升级到 Gen2 x1。

带宽通常不是主要风险。即使按每通道 256 kSPS、4 通道、每通道保留 32 bit 计算,原始数据约为:

256000 × 4 × 4 byte = 4.096 MB/s

真正需要重点验证的是确定性、同步、丢帧检测、缓冲管理、时间戳和长时间稳定性。

15. 最终工程资产与校验值

跳转到“15. 最终工程资产与校验值”

应备份:

C:\Users\mtxl\Desktop\project_analysis\adfpga\fpga_pcie.xpr
C:\Users\mtxl\Desktop\project_analysis\adfpga\connect_xdma_mig.tcl
C:\Users\mtxl\Desktop\project_analysis\adfpga\rtl\ad7768_tdm_rx.v
C:\Users\mtxl\Desktop\project_analysis\adfpga\sim\tb_ad7768_tdm_rx.sv
C:\Users\mtxl\Desktop\project_analysis\adfpga\fpga_pcie.srcs\constrs_1\new\pins.xdc
C:\Users\mtxl\Desktop\project_analysis\adfpga\fpga_pcie.srcs\constrs_1\new\ad7768_async.xdc
C:\Users\mtxl\Desktop\project_analysis\adfpga\fpga_pcie.runs\impl_1\system_wrapper.bit

2026-08-09 记录的 SHA-256:

文件SHA-256
system_wrapper.bitD44F2A866049A3F80DF95263CD0E38C5AD86E7D94B5B679EAF4C498C0A4DCDBB
ad7768_tdm_rx.v287EA0FFBBB550E3856CE03D898A1014DFA85E0DB76F9C2278B06F9604CA0E6B
connect_xdma_mig.tcl4FF5EE3D17569C1A80DF1FBB2CEEF6EE914A04B9E3779132BD6D8323CF0556A6

16. 下次继续的最短清单

跳转到“16. 下次继续的最短清单”
[ ] 断电确认 AD7768 数字接口电平
[ ] 按临时摄像头接口映射接线并共地
[ ] 下载最终 system_wrapper.bit
[ ] 重启 i.MX8MP 重新枚举 PCIe
[ ] 检查 /dev/xdma0_user、h2c、c2h、events
[ ] GPIO 控制 RESET# 和 START
[ ] SPI 读取并校验 AD7768 寄存器
[ ] 示波器确认 DCLK、DRDY、DOUT0
[ ] DMA 先配置 0x01000000 / 65536 byte
[ ] 清除 FIFO 后使能采集
[ ] 等待 DMA 完成并从同一 DDR 偏移读回
[ ] 按每 16 字节四通道格式解析
[ ] 检查头字段、符号扩展、帧数和溢出位
[ ] 补充输入时序约束并重新生成 bitstream