ps读写ddr3里面的数据 zynq_DDR3读写数据调试

本文对 Xilinx Vivado 中提供的 DDR3 控制器 IP 核模块进行例化,实现基本的 DDR3读写操作。并使用在线逻辑分析仪查看有规律变化的 DDR3 数据读写时序。

1.DDR3控制器IP接口时序

DDR3 控制器 IP 核用于衔接 DDR3 芯片和 FPGA 的用户逻辑,DDR3 控制器与 FPGA 用户逻辑之间有一套简单易用的接口,以下为User Interface 的基本时序。

1.1 Command 时序

首先,关于 User Interface 的 Command 时序,Xilinx 的用户手册中只给出如图所示的波形。简单的来讲,app_cmd 和 app_addr 有效,且 app_en 拉高,app_rdy 拉高,则该命令成功发送给 DDR3 控制器;若是在 app_cmd、app_addr 和 app_en 都有效时,app_rdy为低,那么必须保持 app_cmd、app_addr 和 app_en 的有效状态直到 app_rdy 拉高,那么该命令才算是成功发送给DDR3控制器。

User Interface 的 Command 时序波形

1.2数据写入时序

对于单次的数据写入 DDR3 控制器,用户手册中给出如图所示的时序波形。这里对应写入 command 发起的前后有 1、2 和 3 不同时间的 Data Write 时序,也就是说,数据比 command 早一点或晚一点写入都是可以的。

User Interface 的写数据时序波形

对于“数据比 command 早一点或晚一点写入都是可以的”这句话,用户手册中提到,

command 以及 data 都有各自的 FIFO,因此他们是需要同步的,换句话说,如果让我设计这个 controller 的 User Interface,并且和目前的机制一样,command 和 data 都有 FIFO,那么很简单,我会根据 command FIFO 中的新命令,对应取一个 data FIFO 中的写入数据,也不用管它们谁先被送到各自的 FIFO 中。当然了,command FIFO 有命令是 data FIFO 取数据的先决条件。至于两个 FIFO 万一不同步,那么怎么办?没办法,用户必须保证它们同步。

前面说 command 时关注接口 app_cmd、app_addr、app_en 和 app_rdy,这里写数据则需要关注接口 app_wdf_data、app_wdf_wren、app_wdf_end 和 app_wdf_rdy。

先说 app_wdf_end,DDR3 实际读写的 Burst =8,举例来说,DDR3 的数据位宽为 16bit,

Burst 为 8,就是说每次对 DDR3 执行读写,必须是连续的 8*16bit 数据。那么在 User

Interface 这端,如果逻辑时钟为 DDR3 时钟的 4 分频,且数据位宽为 128bit,那么单个时钟周期就对应 Burst=8 的一次读写操作;而如果数据位宽为 64bit,那么必须执行 2 次数据操作才能够完成一次 Burst=8 的读写。对于前者,app_wdf_end 始终为 1 就可以了;而对于后者,app_wdf_end 每 2 个写数据时钟周期内,前一次拉低,后一次拉高。

余下3个信号app_wdf_data、app_wdf_wren和app_wdf_rdy,他们的工作原理和command时序类似。app_wdf_data 有效,且 app_wdf_wren 拉高,必须 app_wdf_rdy 也为高,才表示当前数据写入 DDR3 控制器。

注意:执行写数据 command 和执行写数据操作,它们是一一对应的,虽然控制时序可以分开实现。

1.3读数据时序

写时序和读时序它们本质上是一样的。每个数据的读操作,也需要先有读 command 的发起,当有效读 command 发起后,若干个时钟周期后,app_rd_data_valid 拉高,此时 app_rd_data 有效,用户逻辑据此读出数据即可,非常简单。

对于连续读取也是一样的。User Interface 可以送一大堆读 command,注意这些读command 必须都是有效 command,随后就等着 app_rd_data_valid 拉高接收app_rd_data 即可。用户手册给出的读数据时序波形如图所示。

User Interface 的读数据时序波形

代码解析

该工程实例的模块层次:

● ddr.v 模块是工程顶层模块,例化子模块并申明端口。

● clk_wiz_0.v 模块例化 PLL IP 核,产生 DDR3 的时钟。

●DDR ip 模块例化 DDR3 控制器 IP 核。

● data_source.v 模块产生 DDR3 的读写控制命令,实现 DDR3 控制器和 DDR3 芯片的读

写测试功能。其下例化的 dist_mem_gen_0.v 是片内 RAM 的 IP 核,用于存储每次读出DDR3 芯片的数据;

ila_0.v 模块则是在线逻辑分析仪的例化。

2.在线逻辑分析仪调试

连接好开发板、下载器并且给板子供电。打开工程,点击“Program and Debug 、Open Hardware Manager 、Open Target”按钮,弹出菜单中点击“Auto Connect”。

此时“Program Device”选项高亮,点击它。

在 Program Device 页面中,Bitstream file 为当前工程路径下的 .bit 文件,Debug probes file 为当前工程路径下的 debug_nets.ltx 文件。设置好以后,点击“Program”按钮。

在 Trigger Setup 页面中,可以点击左侧的“+”号添加作为触发信号的接口,如这里找到 timer_wrreq 作为触发信号。

完成触发信号、触发条件设置,并且添加好观察信号后,可以点击页面按钮开始运行在线逻辑分析仪。

下图为触发一次的采样,捕获到了DDR3 控制器数据写入操作的时序。

同样的,若是我们将 timer_rdreq 信号添加到 Trigger Setup 页面中作为触发信号,那么接下来运行在线逻辑分析仪则会抓到DDR3 控制器读数据的操作时序。

你可能感兴趣的:(ps读写ddr3里面的数据,zynq)