ACFL3432 DDR4 缓存 UDP 传输实验说明
配套工程:
ACFL3432_UDP\acfl3432_udp_ddr4工程环境:Vivado 2026.1 目标器件:xcsu200p-sbva1024-2-e文档版本:V1.1
1. 实验目的
本实验使用 SU200P 开发板和 ACFL3432 双通道高速 ADC 模块完成以下内容:
- 通过 SPI 初始化 CM3432,并由 FPGA 向模块提供 250 MHz 差分采样时钟;
- 通过 UDP 命令设置采集通道、采集字节数、抽取系数和 ADC 寄存器;
- 将单通道、双通道或测试斜坡数据写入板载 DDR4;
- 采集结束后从 DDR4 读回数据,并通过 ETH2千兆以太网以 UDP 数据报发送到电脑;
- 使用网络抓包和上位机波形检查传输完整性与板级采集结果。
本工程为纯 FPGA 逻辑设计。数据为先完成指定长度的采集与 DDR4 缓存,再开始 UDP 发送。
2. 实验平台与工程文件
2.1 硬件和软件
实验需要准备以下设备:
- SU200P 开发板及配套电源;
- ACFL3432 双通道 14 位 250 MSPS ADC 模块;
- JTAG 下载器;
- 千兆网线和带千兆网口的电脑;
- 信号发生器和同轴连接线;
- Vivado 2026.1;
- UDP测试上位机。

<kbd>ACFL3432 模块实物图</kbd>
ACFL3432 通过 FMC_LPC 接口与 FPGA 连接。模块的两路模拟输入、差分采样时钟、返回 DCO、14 位差分数据和 SPI 配置信号均从该接口引出。

<kbd>ACFL3432 模块 FMC_LPC 接口</kbd>

2.2 主要工程文件
<samp>工程文件说明</samp>
| 文件 | 作用 |
|---|---|
acfl3432_udp_ddr4.xpr | Vivado 工程入口 |
...\rtl\acfl3432_udp_ddr4.v | 综合顶层,连接 ADC、DDR4、GMII、命令控制和调试 LED |
...\rtl\udp_command_rx.v | 接收并校验以太网、IPv4 和 UDP 报文,解析 8 字节控制帧 |
...\rtl\acfl_control.v | 保存采集参数,控制 SPI、采集启动和返回数据 |
...\rtl\acfl_input.v | ACFL3432 差分 DCO 与数据输入,形成 A、B 两路 14 位数据 |
...\rtl\acfl_capture.v | 通道选择、抽取、字节打包和 128 位数据输出 |
...\rtl\capture_axi.v | 通过 128 位 AXI4 将数据写入 DDR4,再按原地址读回 |
...\rtl\udp_capture_tx.v | 将读回数据按最大 1472 字节分成 UDP 数据报 |
...\ip\ddr4_0\ddr4_0.xci | SU200P 板载 DDR4 控制器配置 |
...\ip\adc_clock_ip\adc_clock_ip.xci | 266.67 MHz 输入、50 MHz/250 MHz 输出及动态重配置时钟 IP |
...\constraints\board_gmii.xdc | 系统时钟、复位、ETH2、LED 和 GMII 时序约束 |
...\constraints\ddr4_su200p.xdc | SU200P 板载 DDR4 管脚约束 |
...\constraints\fmc_lpc_user.xdc | 当前 ACFL3432 FMC_LPC 管脚与电平约束 |
...\constraints\adc_fabric_250.xdc | 250 MHz DCO 和 ADC 数据输入时序模型 |
bit\acfl3432_udp_ddr4.pdi | 当前发布目录中的器件下载文件 |
fmc_lpc_user.xdc 是本工程的板卡专用约束。不可直接用于其他 Zynq 开发板的 FMC 管脚表;修改子卡、插槽或 VADJ 后,应重新核对 P/N 管脚、电平标准和相对 DCO 时序。
3. 系统结构与关键配置
3.1 数据通路

<kbd>ACFL3432 DDR4 缓存 UDP 传输结构</kbd>
控制命令从 ETH2的接收时钟域进入。采样数据由 ACFL3432 返回的 DCO 驱动,在采样时钟域完成通道选择和 128 位打包,经异步 FIFO 进入 DDR4 用户时钟域。全部数据写入 DDR4 并收到最后一个成功的 AXI 写响应后,工程才从地址 0 开始读回;随后通过第二个异步 FIFO 送入 125 MHz GMII 域并发往电脑。
3.2 DDR4 和时钟参数
<samp>关键 IP 参数</samp>
| 项目 | 当前工程值 |
|---|---|
| DDR4 器件 | MT40A512M16TB-062E |
| DDR4 物理位宽 | 16 bit |
| DDR4 容量 | 1 GiB |
| DDR4 参考时钟 | 266.67 MHz |
| DDR4 数据速率 | 2400 MT/s |
| DDR4 用户时钟 | 300 MHz |
| AXI4 数据/地址/ID 位宽 | 128 bit / 30 bit / 4 bit |
| AXI 突发 | 最多 16 拍,即 256 字节 |
| GMII 时钟 | 125 MHz |
| ADC 输出时钟 | 250 MHz 差分时钟 |
DDR4 IP 的参数负责匹配板载存储器,capture_axi.v 负责组织实际的写入和读回。当前设计从 DDR4 地址 0 开始使用,最大命令长度为 0x40000000 字节。实际调试应从 16 KiB 或更小的数据量开始,不要直接进行 1 GiB 采集。
3.3 ADC 初始化和数据格式
上电后,acfl_spi_config.v 依次写入以下寄存器,然后执行 0x00FF = 0x01 使配置生效:
| 地址 | 数据 | 用途 |
|---|---|---|
0x0014 | 0x05 | 选择二进制补码输出格式 |
0x0017 | 0x80 | 当前工程的 DCO 延时设置 |
0x000B | 0x00 | 沿用参考初始化值 |
0x0018 | 0x0F | 沿用参考初始化值 |
0x0016 | 0x00 | LVDS 交织 A/B 输出,DCO 不反相 |
0x00FF | 0x01 | 同步更新配置 |
CM3432 是 14 位 ADC,原始补码的有效位为 bit 13:0,其中 bit 13 是符号位。当前 acfl_capture.v 使用 {2'b0, adc_a} 或 {2'b0, adc_b} 将原始码装入 16 位小端容器,因此传输字的 bit 15:14 固定为 0。这里传输的是零扩展后的 14 位原始码,并不是已经完成符号扩展的标准 16 位补码。
如果工程要直接输出标准 16 位补码,RTL 应改为 {{2{adc_a[13]}}, adc_a} 和 {{2{adc_b[13]}}, adc_b},使负数的 bit 15:14 都复制原始符号位。现有工程未采用这种格式,因此上位机必须先保留低 14 位,再根据 bit 13 手动符号扩展。
双通道模式按 A低字节、A高字节、B低字节、B高字节 排列。现有数据格式可按以下方式解析:
raw = low_byte | (high_byte << 8)
raw = raw & 0x3FFF
if raw & 0x2000:
raw = raw - 0x4000
工程包含 FPGA 内部递增斜坡测试数据,位于 acfl_capture.v。该模块中的 ramp[13:0] 在采样时钟域递增;当通道选择为 0 时,wire [15:0] a = {2'b0, (ch == 0 ? ramp : adc_a)} 选择斜坡值代替 A 通道输入。通道 0 适合先检查 DDR4、UDP 和电脑接收程序,不依赖模拟输入是否正确。
4. UDP 命令与采样数据
4.1 网络参数
<samp>默认网络参数</samp>
| 项目 | 当前工程值 |
|---|---|
| FPGA 端口 | ETH2,板上接口 J2 |
| FPGA IPv4 | 192.168.0.2 |
| FPGA MAC | 00-0A-35-01-FE-C0 |
| FPGA UDP 端口 | 5000 |
| 建议电脑 IPv4 | 192.168.0.3 |
| 建议子网掩码 | 255.255.255.0 |
FPGA 逻辑不实现 ARP 应答。电脑网卡设为静态地址后,还需要以管理员身份为 FPGA 添加静态项。将命令中的网卡名称“以太网”替换为电脑实际显示的名称:
netsh interface ipv4 add neighbors "以太网" 192.168.0.2 00-0a-35-01-fe-c0
上位机必须保持发送命令时使用的 UDP socket 打开。FPGA 会把采样数据返回到该命令报文的源 MAC、源 IP 和源端口,而不是固定返回到某个电脑端口。
4.2 控制帧格式
每条命令固定为 8 字节:
55 A5 CMD D3 D2 D1 D0 F0
CMD 为命令号,D3..D0 组成 32 位大端参数。一个 UDP 数据报中可以依次放置多条完整命令;不要把同一条 8 字节命令拆到两个 UDP 数据报中。
<samp>命令说明</samp>
| CMD | 功能 | 参数说明 |
|---|---|---|
00 | 开始一次采集 | 数据字段忽略;启动前必须先设置通道和字节数 |
01 | 通道选择 | 0 测试斜坡,1 A 通道,2 B 通道,3 双通道 |
02 | 采集字节数 | 单通道必须为偶数,双通道必须为 4 的整数倍;范围 1~0x40000000 |
03 | 采样速率 | 每 divider+1 个 DCO 周期取一次数据; |
04 | 保存 ADC 寄存器写入值 | 低 24 位为 16 位寄存器地址和 8 位数据;在 CMD00 时写入并执行 0x00FF=0x01 |
当输入 DCO 为 250 MHz 时,理论数据选取速率为:
<p align="center"><strong>f_select = 250 MHz ÷ (divider + 1)</strong></p>
该式只表示采样数据的抽取节拍,不代表当前工程已经通过 250 MHz 的实现时序和板级数据正确性验证。
4.3 双通道 4K 点命令示例
双通道每个采样点组占 4 字节。若每通道采集 4096 点,总字节数为:
<p align="center"><strong>4096 × 2 字节 × 2 通道 = 16384 字节 = 0x00004000</strong></p>
基础测试可按以下顺序发送命令。建议把五条命令连续放在同一个 40 字节 UDP 数据报中,并把开始命令放在最后:
55 A5 01 00 00 00 03 F0 # 双通道
55 A5 02 00 00 40 00 F0 # 总字节数 16384
55 A5 03 00 00 00 18 F0 # divider = 24,有效选取速率约 10 MSPS
55 A5 04 00 00 14 05 F0 # 保持补码输出格式
55 A5 00 00 00 00 00 F0 # 开始采集
在 250 MHz DCO 下,divider=24 对应约 10 MSPS 的有效数据选取速率。4096 点覆盖约 409.6 μs,便于同时观察 10 kHz 和 20 kHz 输入波形。
采集完成后,FPGA 发送不带私有包头的原始字节流。单个 UDP 有效载荷最大为 1472 字节,因此 16384 字节应收到 12 个 UDP 数据报:前 11 包各 1472 字节,最后一包 192 字节。
UDP 数据中没有包序号、总长度字段或重传机制。上位机应统计数据报数量和总字节数,并在发生丢包时明确报错;不能仅凭绘出了波形就判断数据完整。
5. 板级验证
5.1 断电连接
所有模块插拔和跳线调整均应在断电状态下完成。
- 将 ACFL3432 正确插入FMC_LPC 接口;
- 将FMC VADJ 设置为 1.5 V,并再次核对板卡说明和跳线位置;
- 将信号发生器接到待测 ADC 通道,起始测试使用幅度较低且不超过模块允许范围的正弦波;
- 将电脑千兆网口通过网线连接到 SU200P 的 ETH2/J2;
- 连接 JTAG 下载器和开发板电源,然后上电。
5.2 下载 PDI
- 打开
acfl3432_udp_ddr4.xpr; - 进入 Open Hardware Manager;
- 选择 Open Target → Auto Connect;
- 确认识别到
xcsu200p; - 选择 Program Device,下载
bit\acfl3432_udp_ddr4.pdi; - 如 Vivado 要求指定 probes 文件,可同时选择同目录下的
acfl3432_udp_ddr4.ltx。
默认 DEBUG_LEDS=1 时,4 个调试 LED 的逻辑含义如下:
| LED | 顶层逻辑含义 | 预期逻辑状态 |
|---|---|---|
LED1 led[0] | 系统心跳 | 约每秒翻转一次 |
LED2 led[1] | 系统复位已释放 | 初始化后为 1 |
LED3 led[2] | DP83867 千兆链路建立 | 千兆连接正常后为 1 |
LED4 led[3] | 当前链路会话至少接收过一个合法 UDP 包 | 首个合法命令后为 1 |
LED 只能帮助定位复位、链路和命令接收阶段,不能证明 DDR4 数据正确或 ADC 波形正确。
图片待补 2: Vivado Hardware Manager 下载成功界面,以及下载后 4 个调试 LED 的实物状态。
5.3 电脑网络设置
- 将与 J2 相连的电脑网卡设为
192.168.0.3,掩码设为255.255.255.0,网关留空; - 确认网卡协商速度为 1.0 Gbps;
- 添加
192.168.0.2 → 00-0A-35-01-FE-C0静态项; - 允许上位机通过 Windows 防火墙收发 UDP;
- 上位机绑定一个确定的本地 IPv4 和 UDP 端口,然后从同一个 socket 向
192.168.0.2:5000发送命令并接收返回数据。
仅执行 ping 192.168.0.2 不能验证本工程,因为 FPGA 逻辑未实现 ICMP 回显。
5.4 双通道 25 kHz 正弦波和 50 kHz 三角波测试
按以下参数设置双通道实验:
| 项目 | 设置 |
|---|---|
| A 通道输入 | 25 kHz 正弦波,直流偏置为 0,Vpp +-2.5 |
| B 通道输入 | 50 kHz 三角波,直流偏置为 0,Vpp +-2.5 |
| 通道选择 | 双通道 |
| 采样数量 | 16K |
| 总字节数 | 65536字节,即 0x00004000 |
| 抽取参数 | divider=24,250 MHz DCO 下约为 10 MSPS |
| UDP 返回长度 | 12 个数据报,总计 16384 字节 |
信号发生器的两路输出应与 ACFL3432 共地。先确认输入幅度没有超过模块允许范围,再发送第 4.3 节的双通道命令。10 MSPS 下每点间隔约 0.1 μs,4096 点覆盖约 409.6 μs。

若 A、B 两路波形相同、通道顺序颠倒、周期数明显不符或总字节数不足,可尝试修改ACFL3432寄存器或检查是否丢包。
6. 常见问题
6.1 LED3 没有进入千兆链路状态
检查网线、电脑网卡是否支持千兆、自动协商是否开启,以及是否连接到 J2/ETH2。工程只按千兆 GMII 工作,百兆链路不能作为本实验的替代测试。
6.2 LED3 正常但 LED4 不置位
检查电脑静态 IP、静态项、目标地址 192.168.0.2:5000 和防火墙。命令必须包含完整的 55 A5 ... F0 帧;FPGA 还会校验以太网 FCS、IPv4 头校验和、分片标志和 UDP 长度。
6.3 LED4 已置位但没有返回采样数据
先使用通道 0 的内部斜坡数据和较小字节数测试返回路径。开始命令要求 DDR4 校准、ADC 时钟锁定、ADC 接收复位释放和 SPI 初始化均处于就绪状态。双通道字节数不是 4 的整数倍、单通道字节数不是偶数或长度超过 1 GiB 时,开始命令会被判为无效。
6.4 收到的数据长度不足
UDP 不重传,且本工程没有为数据包添加序号。检查上位机 socket 接收缓冲、处理速度和每个数据报的长度;从 16 KiB 开始逐步增加,不要直接使用大数据量。实收总字节数不足时,本次采集不能判为通过。
6.5 两路数据相同或波形异常
先检查进入 UDP/DDR4 之前的 sample_a、sample_b 或 rise_data、fall_data。若这些原始信号已经相同,问题位于 ADC 输出模式、FMC 接线、DCO 相位或 FPGA 输入采样位置,不在 UDP 分包或 DDR4 读回。不要通过关闭输入时序检查或添加错误的 false_path 来制造实现通过。
6.6 250 MSPS 实现时序不通过
当前接收结构为 XP5 差分输入缓冲、BUFG 和逻辑区双沿触发器。应以最新实现的 Timing Summary、输入延时模型和板上原始数据为判断依据。若不满足时序,应降低采样时钟或重新设计专用 I/O 采样结构,并重新完成实现和板级测试。
7. 总结
本工程实现了 ACFL3432 命令控制、内部斜坡测试、单/双通道采集、DDR4 缓存和 UDP 回传,发布目录中存在 PDI、BIT 和 LTX 文件。
最终实验结论还需要补齐最新实现时序、SU200P 实物连接、UDP 数据完整性,以及 A 通道 10 kHz 正弦波和 B 通道 20 kHz 三角波的实际采集结果。板级数据齐全后,应删除本说明中的图片占位,并将预期现象与实际测量结果逐项对照。

