SU200P DDR4 读写验证实验说明
配套工程:
ddr4_1_ex工程环境:Vivado 2026.1目标器件:xcsu200p-sbva1024-2-e
1. 实验目的
本实验使用 SU200P 开发板上的 FPGA 和板载 DDR4 存储器完成以下内容:
- 了解 Vivado DDR4 IP 的主要配置参数;
- 认识 DDR4 IP 官方例程的组成和工作流程;
- 通过行为级仿真观察 DDR4 初始化及 AXI 自动读写过程;
- 将例程生成的 PDI 文件下载到开发板;
- 通过板载 LED 和 ILA 判断 DDR4 是否完成校准、读写数据是否正确。
2. 工程来源与实验定位
2.1 工程来源
ddr4_1_ex 不是从空白 RTL 工程开始编写的 DDR4 控制器,而是在 Vivado 中完成 ddr4_1 IP 配置后,通过 Open IP Example Design 导出的官方示例工程。
Vivado 会根据 IP 配置自动生成控制器、例程顶层、AXI 流量发生器、仿真测试平台及 DDR4 存储器模型。工程随后结合 SU200P 开发板完成管脚约束和板级实现。
该工程的基本生成流程如下: 
2.2 设计目标
本实验的重点不是重新实现 DDR4 协议,而是:
- 理解DDR4 IP 中与开发板硬件相关的关键配置;
- 理解官方例程如何启动 DDR4 控制器并产生 AXI 测试事务;
- 掌握使用仿真、LED 和 ILA 判断 DDR4 工作状态的方法;
- 为后续使用自定义 AXI 主设备访问 DDR4 做准备。
工程目标器件为 xcsu200p-sbva1024-2-e,下载前应确认实际 FPGA 器件与工程设置一致。
3. IP 配置
DDR4 MIG IP 位于用户逻辑与板载存储器之间,因此配置时需要同时回答三个问题:板上连接了什么型号、何种组织方式的 DDR4 器件;控制器以什么时钟和速率驱动该器件;用户逻辑通过怎样的 AXI 接口访问存储空间。下面按照这三层关系说明当前工程的配置。
3.1 Basic:确定工作速率和参考时钟

<kbd>DDR4 IP基础时钟配置</kbd>
本工程选择 Controller and physical layer,由 IP 同时生成 DDR4 控制器和负责引脚时序的物理层。用户逻辑不直接控制 DDR4 的命令、地址和 DQ/DQS 信号,而是通过 IP 提供的 AXI4 接口完成读写。
存储器接口周期设置为 833 ps,对应约 1200 MHz 的 DDR4 时钟。DDR4 在时钟上、下沿传输数据,因此等效数据速率约为 2400 MT/s。PHY 与控制器采用 4:1 时钟比,用户侧时钟约为 300 MHz,使控制器可以用较低的内部时钟并行处理高速存储器数据。
参考输入时钟周期设置为 3749 ps,即约 266.74 MHz。这一数值来自开发板实际提供的差分参考时钟,而不是任意选择的参数。工程约束将 c0_sys_clk_p/n 连接到 FPGA 管脚 H28 和 G28,仿真测试平台也以相同周期产生参考时钟。只有参考时钟频率、管脚连接和 IP 设置相互一致,物理层才具备完成初始化和校准的条件。
3.2 Basic:匹配板载存储器

<kbd>DDR4 IP存储器配置</kbd>
时钟和接口速率确定后,还需要告诉控制器实际连接的存储器类型。Configuration 选择 Components,表示 FPGA 直接连接开发板上的离散 DDR4 芯片,而不是插接式内存条。Memory Part 选择 MT40A512M16TB-062E,与板载器件一致。该器件为 8 Gb、×16、单 Rank 组织,对应 1 GB 存储容量。Vivado 会根据器件型号取得行列地址、Bank 组织和主要时序要求,因此这里应以原理图和板载芯片型号为准。
物理数据宽度设置为 16 bit,对应芯片的 ×16 数据接口。DDR4 采用 BL8 突发时,一次完整突发包含 16 bit × 8 = 128 bit 数据,这正好可以整理成用户侧的一拍 128 bit AXI 数据。由此,存储器的物理组织与后续 AXI 位宽形成了自然对应关系。
工程采用单 Rank、1.2 V I/O 电压和 DM_NO_DBI 数据掩码方式,并按 ROW_COLUMN_BANK 组织物理地址。ECC 保持关闭,因为当前板级接口没有额外的 ECC 数据位;本实验通过官方例程的写入、读回和数据比较判断传输是否正确。
截图中的 CAS Latency 17 和 CAS Write Latency 12 是 Vivado 根据所选器件及 833 ps 接口周期得到的配套参数。器件型号或工作速率发生变化时,应由 IP 配置工具重新计算整组时序参数,不宜孤立修改某一个延迟值。
3.3 AXI Options:定义用户访问接口

<kbd>DDR4 IP的AXI接口配置</kbd>
前两部分决定了控制器如何连接并驱动 DDR4,本页则决定用户逻辑如何使用这片存储器。AXI 数据宽度设置为 128 bit,与 ×16 DDR4 的一次 BL8 突发数据量一致;地址宽度设置为 30 bit,按字节寻址可覆盖 2^30 byte,也就是完整的 1 GB 存储空间。ID 宽度为 4 bit,可同时区分不同的 AXI 事务,官方例程中的流量发生器便通过这些通道发起写入、读回和数据比较。
仲裁方式选择 RD_PRI_REG,使读请求在控制器内部采用带寄存的优先处理方式。AXI Narrow Burst 未启用,因此例程按照完整的 128 bit 数据宽度发起访问。后续若用自定义逻辑替换官方流量发生器,应保持地址范围、数据宽度和突发格式兼容;接口宽度不一致时,需要在中间加入 AXI 数据宽度转换模块。
3.4 关键参数汇总
| 配置项 | 当前配置 | 作用 |
|---|---|---|
| Controller Type | DDR4 SDRAM | 生成完整的 DDR4 控制器和物理接口 |
| Memory Type | Components | 对接开发板上的离散 DDR4 芯片 |
| Memory Part | MT40A512M16TB-062E | 与板载 DDR4 器件参数对应 |
| DDR4 Data Width | 16 bit | DDR4 物理数据总线宽度 |
| DDR4 Time Period | 833 ps | 对应约 1200 MHz 存储器时钟、约 2400 MT/s 数据速率 |
| Input Clock Period | 3749 ps | 差分参考时钟约为 266.74 MHz |
| AXI Data Width | 128 bit | 用户侧每拍 AXI 数据宽度 |
| AXI Address Width | 30 bit | 用户侧 AXI 地址宽度 |
| AXI ID Width | 4 bit | 区分不同 AXI 事务 ID |
| Arbitration Scheme | RD_PRI_REG | 读请求优先并经过寄存处理 |
| Burst Length | 8 | DDR4 突发长度 |
| ECC | Disabled | 本实验不进行 ECC 校验 |
这些参数并不是彼此独立的选项。器件型号和 16 bit 物理位宽来自板载 DDR4,3749 ps 输入周期来自开发板参考时钟,833 ps 接口周期决定目标数据速率,而 128 bit AXI 位宽承接一次 BL8 突发的数据量。重新配置 IP 时,建议按照“器件型号与位宽—参考时钟—目标速率—AXI 接口”的顺序核对,避免某一项修改后破坏整条数据通路的匹配关系。
完成上述配置后,DDR4 IP 已经具备与板载存储器通信的基本条件,但它本身还不能回答“初始化是否成功、AXI 读写是否正确”这些实验问题。控制器还需要外部时钟和复位,需要 AXI 主设备发起访问,也需要比较逻辑判断读回数据。因此,下一步需要将配置好的控制器放入一个完整的验证环境中。
4. 官方例程结构与工作原理
Vivado 的 Open IP Example Design 正是这一验证环境。它以第 3 节配置的 DDR4 IP 为核心,在外围加入时钟与复位处理、AXI 流量发生器、数据比较逻辑、状态输出以及仿真所需的存储器模型。前面确定的器件、时钟、速率和 AXI 参数由此转化为实际的初始化、写入和读回过程。下面先认识例程中的主要文件,再沿数据通路说明各模块如何配合工作。
4.1 主要文件
| 文件 | 来源 | 作用 |
|---|---|---|
ddr4_1_ex.xpr | Vivado 例程工程 | 工程入口 |
imports/example_top.sv | 官方例程 | 综合顶层,连接 DDR4 控制器和流量发生器 |
imports/sim_tb_top.sv | 官方例程 | 行为级仿真测试平台 |
| DDR4 仿真模型 | IP 自动生成 | 在仿真中模拟外部 DDR4 器件 |
imports/example_design.xdc | 工程约束 | 约束参考时钟、复位、LED 和 DDR4 接口 |
ddr4_1_ex.runs/impl_1/example_top.pdi | Vivado 实现结果 | 当前工程的下载文件 |
example_top.ltx | Vivado 调试文件 | ILA 探针信息 |
自动生成的文件通常不建议直接修改。若需要改变存储器型号、位宽或工作速率,应回到 DDR4 IP 配置界面修改参数,再重新生成 Output Products 和 Example Design。
4.2 总体结构
工程以 example_top.sv 为顶层。DDR4 控制器负责初始化、校准和物理接口控制;AXI 流量发生器在初始化完成后执行自动写入、读回和数据比较。 
4.3 初始化与自动读写
上电或复位释放后,DDR4 控制器先完成内部 PLL 锁定、延迟校准和读写训练。初始化成功后,c0_init_calib_complete 由 0 变为 1。
AXI 流量发生器检测到该信号后开始工作,会向 DDR4 写入测试数据,再从相同地址读回并比较,并根据读写比较过程生成数据不匹配、AXI 写错误和 AXI 读错误信号。顶层再将这些信号合并为 c0_data_compare_error。
| 信号 | 板上指示 | 丝印 | 正常状态 | 含义 |
|---|---|---|---|---|
c0_init_calib_complete | LED2,管脚 C18 | Q27 | 有效 | DDR4 初始化与校准完成 |
c0_data_compare_error | LED1,管脚 B17 | Q26 | 无效 | 未发现读写或数据比较错误 |
系统复位 sys_rst 连接到管脚 E24。复位有效时控制器和测试逻辑重新初始化,释放复位后需要等待校准完成。
4.4 ILA 在线调试
例程包含 ILA 调试逻辑,可在 Hardware Manager 中观察初始化状态、比较错误及相关数据。使用 ILA 时,应同时加载配套的example_top.ltx。
5. 仿真验证
5.1 运行仿真
- 启动 Vivado 2026.1;
- 打开
ddr4_1_ex.xpr; - 选择 Simulation → Run Simulation → Run Behavioral Simulation;
- 仿真窗口打开后选择 Run All,或将运行时间设置为不少于
25 us; - 观察复位、初始化完成、AXI 测试状态和数据比较错误信号。
默认仿真脚本只运行 1000 ns,通常不足以完成 DDR4 初始化,因此不应仅根据默认时间内的波形判断例程失败。
5.2 波形分析
5.2.1 初始化与校准

<kbd>DDR4初始化与校准波形</kbd>
仿真开始后,测试平台提供约 266.74 MHz 的差分参考时钟,DDR4 IP 随后生成用户侧时钟并完成内部复位。图中 c0_ddr4_ui_clk_sync_rst 解除后,控制器开始执行存储器初始化和物理层校准;在约 3.21 µs,c0_init_calib_complete 由 0 变为 1,表示时钟、延迟和读写采样相关的校准流程已经完成。此后 DDR4 控制器可以接受用户侧 AXI 请求。
时间跨度较大时,c0_sys_clk_p/n 和 c0_ddr4_ui_clk 会显示为连续色带,这是高频时钟在当前缩放比例下的正常显示。初始化前后地址和命令信号出现变化,也属于 DDR4 校准过程中产生的正常活动。
5.2.2 连续 AXI 读写

<kbd>DDR4 AXI流量发生器连续读写波形</kbd>
c0_init_calib_complete 拉高后,官方流量发生器先执行 Boot Mode,再进入 PRBS Mode。它会按照预设及伪随机指令连续改变访问地址、突发长度和突发类型,因此波形中的写入和读取不会在完成一笔事务后停止,而是持续到全部测试指令执行结束。
写通路中,axi_awvalid 周期性拉高并与 axi_awready 完成写地址握手;随后 axi_wvalid 发送数据,axi_wlast 标记每个突发的最后一拍,axi_bvalid 返回写响应。读通路中的 axi_arvalid、axi_araddr 和 axi_arlen 持续变化,说明流量发生器也在不断发起不同地址和长度的读取请求。图中 axi_bresp 保持为 0,表示可见的写事务未返回 AXI 错误响应。
这张全程波形的用途是展示“初始化完成后持续存在读写流量”,信号跳变密集是正常现象。若需要核对某一笔事务,用户可在 Vivado 中进一步缩放,分别检查 VALID 与 READY 的握手以及 WLAST 或 RLAST。
5.2.3 仿真结果
流量发生器在读回数据时同步执行比较。正常情况下,数据失配、写响应错误和读响应错误均不会置位,汇总信号 c0_data_compare_error 应始终保持为 0。本次完整仿真在约 23.17 µs 结束,控制台输出:
ALL AXI TRANSACTIONS COMPLETE
TEST PASSED
Test Completed Successfully
上述结果表明,DDR4 初始化与校准成功,AXI 写入、读回和数据比较流程均已完成,仿真模型未检测到数据不一致或总线响应错误。
6. 板级验证
6.1 硬件连接
- 准备 SU200P 开发板、配套电源和 USB-JTAG 下载线;
- DDR4 为板载器件,不需要连接外部存储器或杜邦线;
- 在开发板断电状态下连接 USB-JTAG;
- 接入开发板电源并上电;

<kbd>硬件连接图</kbd>
6.2 下载已有 PDI
操作步骤如下:
- 在 Vivado 中进入 Open Hardware Manager;
- 选择 Open Target → Auto Connect;
- 在识别出的 FPGA 器件上选择 Program Device;
- 选择工程路径下bit文件夹中的
example_top.pdi; - 如需使用 ILA,可选择配套的
example_top.ltx; - 单击 Program 完成下载。
6.3 下载后的正常现象
完成 PDI 下载后,等待 DDR4 控制器完成初始化和校准。开发板上的正常现象为 Q27 点亮、Q26 熄灭。

<kbd>DDR4板级验证结果:Q27点亮、Q26熄灭</kbd>
Q27 连接 FPGA 管脚 C18,对应 c0_init_calib_complete。Q27 点亮表明该信号已经有效,DDR4 控制器完成了初始化和物理层校准。Q26 连接 FPGA 管脚 B17,对应 c0_data_compare_error;该信号由数据不匹配、AXI 写响应错误和 AXI 读响应错误三类状态合并产生。Q26 保持熄灭,说明自动读写过程中未检测到上述错误。
因此,图中的 LED 组合与仿真结果相互对应:Q27 点亮确认控制器已经进入可用状态,Q26 熄灭确认流量发生器的写入、读回和数据比较未报告错误。若执行系统复位,Q27 会在重新校准期间暂时熄灭,校准成功后再次点亮;Q26 在正常运行期间应持续熄灭。需要进一步查看读写事务时,可加载与当前 PDI 同次实现生成的 example_top.ltx,通过 ILA 观察内部状态。
7. 总结与扩展
本实验以 Vivado DDR4 IP 官方例程为基础,完成了 IP 配置识别、例程结构分析、行为仿真和板级下载验证。仿真中,控制器完成校准,AXI 流量发生器持续执行写入、读回和比较并最终输出测试通过;板级验证中,Q27 点亮且 Q26 熄灭,进一步表明 DDR4 初始化成功,自动读写未检测到数据比较或 AXI 响应错误。
完成本实验后,可将官方流量发生器替换为自定义 AXI 主设备,进一步设计图像帧缓冲、高速数据采集存储或缓存模块,并使用 ILA 分析不同突发长度和访问模式下的存储器带宽。

