本文对 Xilinx v7中提供的 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 的读数据时序波形
2. 代码块
该工程实例的模块层次:
● 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 模块则是在线逻辑分析仪的例化。
3.在线逻辑分析仪调试
连接好开发板、下载器并且给板子供电。打开工程,点击“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 控制器读数据的操作时序。
END