状态说明:历史 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 测试方法。
1. 本阶段完成了什么
跳转到“1. 本阶段完成了什么”本教程记录在正点原子达芬奇 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 真板连续采集已经完成”。
2. 软硬件条件
跳转到“2. 软硬件条件”2.1 硬件
跳转到“2.1 硬件”| 项目 | 配置 |
|---|---|
| SoC 开发板 | 飞凌 OK8MP,NXP i.MX8MP |
| FPGA 开发板 | 正点原子达芬奇 Pro,XC7A200T-FBG484-2 |
| FPGA 存储器 | 板载 DDR3,AXI 地址空间 512 MiB |
| ADC | AD7768-4 采集板,当前尚未接入 |
| PCIe | i.MX8MP 为 Root Complex,FPGA 为 Endpoint,x1 连接 |
| FPGA 配置 | Digilent JTAG |
| 临时 ADC 接口 | 达芬奇 Pro 摄像头扩展口,LVCMOS33 |
2.2 软件与工程
跳转到“2.2 软件与工程”| 项目 | 路径或版本 |
|---|---|
| Vivado | AMD 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 |
| 最终 bitstream | adfpga\fpga_pcie.runs\impl_1\system_wrapper.bit |
| Linux SDK | Z:\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 KiB32 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 软件中扩展为双缓冲或环形缓冲,并维护生产者/消费者指针。
4. AD7768-4 接收格式
跳转到“4. AD7768-4 接收格式”4.1 当前接口假设
跳转到“4.1 当前接口假设”接收器针对以下配置编写:
- AD7768-4 标准模式;
FORMAT0 = 1;- 使用
DOUT0传输四个通道; - 一帧包含四个连续的 32 bit 时隙;
- 每个时隙是 8 bit 状态/头字段和 24 bit 有符号采样;
- 串行数据按 MSB first 接收;
- 在
DCLK下降沿采样; DRDY下降后,从下一个DCLK下降沿开始接收 128 bit。
连接真板后,必须用示波器或 ILA 验证采样边沿和 DRDY 相位;如果 ADC 板配置不同,接收状态机也要调整。
4.2 内存中的一帧
跳转到“4.2 内存中的一帧”一帧固定为 16 字节:
| 字节偏移 | 内容 | 32 bit 字格式 |
|---|---|---|
0x00 | CH0 | [31:24] 头字段,[23:0] 有符号采样 |
0x04 | CH1 | [31:24] 头字段,[23:0] 有符号采样 |
0x08 | CH2 | [31:24] 头字段,[23:0] 有符号采样 |
0x0C | CH3 | [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)4.3 AXI4-Stream 分包
跳转到“4.3 AXI4-Stream 分包”接收器每帧产生一个 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。
5. 控制与状态定义
跳转到“5. 控制与状态定义”5.1 GPIO 控制位
跳转到“5.1 GPIO 控制位”AXI GPIO 第一通道是 4 bit 输出:
| 位 | 信号 | 含义 |
|---|---|---|
| bit 0 | adc_reset_n | AD7768 RESET#,1 为释放复位 |
| bit 1 | adc_start | AD7768 START |
| bit 2 | capture_enable | 1 允许接收数据 |
| bit 3 | capture_clear | 高脉冲清除 FIFO、帧计数和溢出状态 |
GPIO 默认输出是 0x3:ADC 释放复位、START=1,但采集未使能。
常用控制值:
| 写入值 | 作用 |
|---|---|
0x0 | 拉低 RESET# 和 START |
0x3 | 释放 ADC,采集关闭 |
0x7 | 释放 ADC并使能采集 |
0xF 后写 0x7 | 在保持采集使能时产生清除脉冲 |
不要让 bit 3 长时间保持为 1,否则采集状态会持续处于清除状态。
5.2 GPIO 状态位
跳转到“5.2 GPIO 状态位”AXI GPIO 第二通道是 32 bit 输入:
| 位 | 含义 |
|---|---|
| bit 31 | FIFO 溢出粘滞标志,清除脉冲后复位 |
| bit 30 | FIFO 接近满 |
| bit 29 | FIFO 中存在数据 |
| bit 28:0 | 已接受 ADC 帧数,自动回绕 |
帧计数在 ADC 时钟域使用 Gray 码跨域,溢出和 prog_full 使用双触发器同步。
6. 临时 AD7768 接线
跳转到“6. 临时 AD7768 接线”当前没有连接 ADC。为了先完成工程和仿真,接口暂时映射到达芬奇 Pro 摄像头扩展口:
| AD7768 信号 | 开发板信号 | FPGA 管脚 | 电平 |
|---|---|---|---|
| DCLK | cam_pclk | U18 | LVCMOS33 |
| DRDY | cam_vsync | P14 | LVCMOS33 |
| DOUT0 | cam_data[0] | P17 | LVCMOS33 |
| RESET# | cam_rst_n | N17 | LVCMOS33 |
| START | cam_href | N14 | LVCMOS33 |
| SPI MOSI/IO0 | cam_data[1] | P15 | LVCMOS33 |
| SPI MISO/IO1 | cam_data[2] | R16 | LVCMOS33 |
| SPI SCK | cam_data[3] | R17 | LVCMOS33 |
| SPI SS# | cam_data[4] | P16 | LVCMOS33 |
这些映射已经与官方摄像头例程 XDC 交叉核对。使用这些引脚时不能同时连接摄像头。
U18不是专用 MRCC/SRCC 时钟输入,当前约束使用了CLOCK_DEDICATED_ROUTE FALSE。它可用于现阶段低速功能测试,但不应直接作为产品板最终 DCLK 方案。产品硬件必须将 DCLK 接到合适的时钟能力引脚。
接线前必须确认:
- ADC 数字接口电平与 FPGA Bank 的 3.3 V LVCMOS 兼容;
- 两块板共地;
- 输入信号不超过 FPGA 绝对最大额定值;
- 断电接线;
- 先验证
RESET#、START和 SPI,再启用高速数据口。
7. Vivado IP 配置
跳转到“7. Vivado IP 配置”7.1 AXI DMA
跳转到“7.1 AXI DMA”| 参数 | 值 |
|---|---|
| Scatter Gather | 关闭 |
| MM2S | 关闭 |
| S2MM | 开启 |
| S2MM Store and Forward | 开启 |
| S2MM DRE | 关闭 |
| Stream 数据宽度 | 128 bit |
| M_AXI_S2MM 数据宽度 | 128 bit |
| 最大 Burst | 16 |
| Length Width | 26 bit |
因为 DRE 关闭,目标地址和长度必须满足总线对齐要求。当前 64 KiB 块和建议的 DDR 地址都按 16 字节对齐。
7.2 AXI GPIO
跳转到“7.2 AXI GPIO”- 通道 1:4 bit,全输出;
- 默认输出:
0x00000003; - 通道 2:32 bit,全输入;
- GPIO 自身中断关闭。
7.3 AXI Quad SPI
跳转到“7.3 AXI Quad SPI”| 参数 | 值 |
|---|---|
| SPI 类型 | 标准 SPI |
| SPI Mode | Mode 0 |
| 传输宽度 | 8 bit |
| SS 数量 | 1 |
| FIFO 深度 | 16 |
| SCK Ratio | 16 |
SPI 参数是当前设计配置,必须在连接真板后以寄存器读回验证。只有成功读出稳定且符合手册的芯片寄存器值,才能继续启动 ADC 数据采集。
7.4 SmartConnect
跳转到“7.4 SmartConnect”DDR3 数据 SmartConnect:
NUM_SI = 2;NUM_MI = 1;- 两个时钟输入;
- XDMA
M_AXI和 AXI DMAM_AXI_S2MM共同访问 MIG。
AXI-Lite SmartConnect:
NUM_SI = 1;NUM_MI = 3;- XDMA
M_AXI_LITE为输入; - 输出到 AXI DMA、AXI GPIO 和 AXI Quad SPI。
7.5 XDMA
跳转到“7.5 XDMA”本阶段在原有 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。
8. AXI 地址表
跳转到“8. AXI 地址表”8.1 FPGA DDR3 地址空间
跳转到“8.1 FPGA DDR3 地址空间”| 主设备 | 地址 | 范围 |
|---|---|---|
XDMA M_AXI | 0x00000000 | 512 MiB |
AXI DMA Data_S2MM | 0x00000000 | 512 MiB |
两个主设备看到相同 DDR3 地址。AXI DMA 写入地址 0x01000000 后,i.MX8MP 应使用 XDMA C2H 从同一设备偏移 0x01000000 读取。
8.2 AXI-Lite 地址空间
跳转到“8.2 AXI-Lite 地址空间”| 模块 | 基地址 | 范围 |
|---|---|---|
| AXI DMA 控制寄存器 | 0x00000000 | 64 KiB |
| AXI GPIO | 0x00010000 | 64 KiB |
| AXI Quad SPI | 0x00020000 | 64 KiB |
典型 XDMA Linux 驱动会把 AXI-Lite Master 暴露为 /dev/xdma0_user。新 bitstream 上电并重新枚举后应确认该节点出现;旧基线工程关闭了 AXI-Lite Master,因此旧笔记中没有此节点是正常的。
AXI GPIO 常用偏移:
| 地址 | 寄存器 |
|---|---|
0x00010000 | GPIO 通道 1 DATA,写控制位 |
0x00010004 | GPIO 通道 1 TRI |
0x00010008 | GPIO 通道 2 DATA,读状态位 |
0x0001000C | GPIO 通道 2 TRI |
AXI DMA S2MM 常用偏移:
| 地址 | 寄存器 |
|---|---|
0x00000030 | S2MM_DMACR |
0x00000034 | S2MM_DMASR |
0x00000048 | S2MM_DA |
0x0000004C | S2MM_DA_MSB,32 bit 地址设计通常写 0 |
0x00000058 | S2MM_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 PASSEDXDMA M_AXI DDR3 : 0x00000000 / 512MAD7768 frame : 16 bytes (CH0, CH1, CH2, CH3)AXI DMA control : 0x00000000 / 64KAD7768 GPIO : 0x00010000 / 64KAD7768 SPI : 0x00020000 / 64K9.2 完整生成 bitstream
跳转到“9.2 完整生成 bitstream”在 PowerShell 中执行:
cd C:\Users\mtxl\Desktop\project_analysis\adfpgavivado -mode batch -source connect_xdma_mig.tcl -tclargs build脚本会清除所有综合缓存并重建 OOC 和顶层运行,防止修改后的 RTL 被旧 DCP 静默替换。脚本还会检查:
- Implementation 状态包含
Complete; - WNS 不小于 0;
- WHS 不小于 0;
- 最终 bitstream 文件存在。
9.3 JTAG 下载
跳转到“9.3 JTAG 下载”确认开发板供电、JTAG 已连接后执行:
cd C:\Users\mtxl\Desktop\project_analysis\adfpgavivado -mode batch -source connect_xdma_mig.tcl -tclargs program脚本要求检测到唯一的 xc7a200t_0,然后下载当前工程生成的 system_wrapper.bit。
10. 行为仿真
跳转到“10. 行为仿真”测试平台验证三组已知 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.svxelab -L xpm -L unisims_ver tb_ad7768_tdm_rx glbl -s ad7768_rx_simxsim ad7768_rx_sim -runall通过标志:
AD7768_TDM_RX_TEST_PASS最后一次仿真在 2026-08-08 23:03:58 完成,结束时间为 16345 ns。
11. Vivado 实现结果
跳转到“11. Vivado 实现结果”最后一次完整构建结果:
| 项目 | 结果 |
|---|---|
| 综合 | 0 Errors,0 Critical Warnings |
| Implementation | write_bitstream Complete! |
| WNS | +0.951 ns |
| WHS | +0.014 ns |
| 路由 DRC | 0 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 上执行。
12.1 正确上电顺序
跳转到“12.1 正确上电顺序”- 断电连接 PCIe 和 ADC 信号;
- 给 FPGA 和 AD7768 板供电;
- 用 JTAG 下载新 bitstream;
- 硬复位或重新启动 i.MX8MP;
- 等待 Linux 完整启动;
- 检查 PCIe 枚举和 BAR;
- 加载
xdma.ko; - 检查 user、H2C、C2H 和 event 节点。
12.2 检查 PCIe 和驱动
跳转到“12.2 检查 PCIe 和驱动”lspci -nnlspci -vv -s 01:00.0dmesg | grep -Ei 'pcie|pci|xdma|aer|timeout' | tail -n 120
modprobe xdmals -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,再启动采集”推荐顺序:
- 读 AXI GPIO 状态寄存器;
- 写 GPIO 控制
0x3; - 通过 SPI 读取 AD7768 芯片标识或已知复位值;
- 配置 AD7768 数据格式和采样率;
- 再次读回全部关键寄存器;
- 产生 FIFO 清除脉冲;
- 配置并启动 AXI DMA;
- 最后写 GPIO 控制
0x7使能采集。
不要在 DMA 尚未准备好时长时间开启采集。FIFO 只有 32 KiB,不能代替 DDR3 缓冲。
12.4 AXI DMA 单块采集顺序
跳转到“12.4 AXI DMA 单块采集顺序”示例使用 DDR 地址 0x01000000 和长度 0x00010000:
- 确认 S2MM 通道停止或复位;
- 清除 S2MM 状态中的历史中断位;
- 写 S2MM 目标地址
0x01000000; - 写高地址 0;
- 设置 S2MM
RS,按需开启 IOC 中断; - 写
S2MM_LENGTH = 0x00010000,DMA 开始等待数据; - 写 GPIO
0xF后写0x7,清除并使能采集; - 等待
/dev/xdma0_events_0或轮询 S2MM 状态; - 清除 AXI DMA IOC 中断;
- 关闭采集或立即准备下一块 DMA。
DMA 中断连接到 XDMA 用户中断 0。AXI DMA 的中断源必须通过 S2MM 状态寄存器清除,否则事件可能持续保持。
12.5 读取 DDR3 数据
跳转到“12.5 读取 DDR3 数据”XDMA C2H 设备偏移必须与 AXI DMA 目标地址一致:
DDR DMA target = 0x01000000C2H file offset = 0x01000000read length = 65536BusyBox 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 错误。
13. 故障定位
跳转到“13. 故障定位”13.1 SPI 无法读回
跳转到“13.1 SPI 无法读回”按以下顺序检查:
- ADC 电源、参考电压和数字 I/O 电压;
- 共地;
RESET#是否释放;- SS# 是否只在传输期间拉低;
- SCK 的空闲电平和采样边沿;
- MOSI/MISO 是否接反;
- 读命令格式和地址位是否符合 AD7768 手册;
- AXI Quad SPI 收发 FIFO 是否被正确复位和清空。
SPI 读回未通过前,不应调试高速采样数据。
13.2 帧计数不增长
跳转到“13.2 帧计数不增长”检查:
- GPIO bit 2 是否为 1;
- ADC 是否输出 DCLK;
- DRDY 是否产生下降沿;
- DOUT0 是否有翻转;
RESET#和START状态;- DCLK 频率是否超过当前临时走线可可靠工作的范围。
13.3 FIFO 溢出
跳转到“13.3 FIFO 溢出”如果状态 bit 31 为 1:
- 确认 DMA 已在采集前启动;
- 检查 AXI DMA 是否 Halted 或报 Internal/Slave/Decode Error;
- 检查 MIG
init_calib_complete; - 检查 DDR SmartConnect 两个时钟输入;
- 确认 S2MM 地址和长度对齐;
- 确认每块 DMA 完成后及时启动下一块。
清除溢出:先停止采集,GPIO 写 0xB 再写 0x3;如果要立即重新采集,写 0xF 再写 0x7。
13.4 DMA 不完成
跳转到“13.4 DMA 不完成”重点读取 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 的时钟和复位是否正常。
14. 产品化前必须补做
跳转到“14. 产品化前必须补做”当前实现适合原型验证,产品级振动分析仪还需要:
- 将 DCLK 改接到合适的 MRCC/SRCC 管脚;
- 根据 AD7768 数据手册和实测线缆延迟添加输入时序约束;
- 用 SPI 读回确认全部 ADC 配置;
- 用示波器或 ILA 确认 DCLK、DRDY、DOUT0 相位;
- 验证不同采样率、滤波器和功耗模式;
- 将单块 DMA 扩展为双缓冲或环形缓冲;
- 定义块头:序号、时间戳、有效长度、采样率、通道状态和错误标志;
- 设计生产者/消费者指针及越界策略;
- 加入硬件时间戳或外部同步输入;
- 做不少于数小时的连续采集、丢帧和数据一致性测试;
- 做断线、复位、DMA 超时和 PCIe 重训练恢复测试;
- 再评估从 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.xprC:\Users\mtxl\Desktop\project_analysis\adfpga\connect_xdma_mig.tclC:\Users\mtxl\Desktop\project_analysis\adfpga\rtl\ad7768_tdm_rx.vC:\Users\mtxl\Desktop\project_analysis\adfpga\sim\tb_ad7768_tdm_rx.svC:\Users\mtxl\Desktop\project_analysis\adfpga\fpga_pcie.srcs\constrs_1\new\pins.xdcC:\Users\mtxl\Desktop\project_analysis\adfpga\fpga_pcie.srcs\constrs_1\new\ad7768_async.xdcC:\Users\mtxl\Desktop\project_analysis\adfpga\fpga_pcie.runs\impl_1\system_wrapper.bit2026-08-09 记录的 SHA-256:
| 文件 | SHA-256 |
|---|---|
system_wrapper.bit | D44F2A866049A3F80DF95263CD0E38C5AD86E7D94B5B679EAF4C498C0A4DCDBB |
ad7768_tdm_rx.v | 287EA0FFBBB550E3856CE03D898A1014DFA85E0DB76F9C2278B06F9604CA0E6B |
connect_xdma_mig.tcl | 4FF5EE3D17569C1A80DF1FBB2CEEF6EE914A04B9E3779132BD6D8323CF0556A6 |
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