当前位置:   article > 正文

ddr3ip核心_DDR3(4):IP核再封装

ddr3 的物理层端与用户端存在两种速率关系,即 4:1 和 2:1

调取的 DDR3 控制器给用户端预留了接口,用于实现对该 IP 核的控制,我们要做的就是利用这些接口打造合适的 DDR3 控制器。在生成 DDR3 IP 核的界面中,可以找到 User Guide 手册,DDR3 的使用将围绕这个手册来展开。

e31ed208b4f3ea80fc9f3a6f265358b9.png

一、接口说明

打开 User Guide 第 90 页,可以看到 DDR3 IP 核的接口框图如下所示。可以看到,中间部分就是我们调取的 DDR3 IP 核,它预留了两组总线,右边一组直接绑定在 DDR3 芯片端口,其总线信号名称均以 ddr 开头,这部分总线只需要在 top 层设为端口即可,无需自己写代码控制。而左边一组则是留给用户端逻辑,其总线信号名称多以 app 开头,这些信号则需我们自己来编写实现。

41acb14ca28e2bf6b51f7afe69d26b15.png

User Guide 第92页里有个汇总表,我们简单翻译一下。

e035812c281bc1af1d23b8f846207ad1.png

二、命令、写、读

1、命令总线(表格红色部分)

10e1c23a5ae5517525f54063214e8d4a.png

由前面表格和数据手册提供的时序图,我们可以得到以下信息:

(1)app _cmd 命令分为写和读,写为 3‘b000,读为 3'b001;

(2)只有当 app_rdy 和 app_en 信号为高时,命令才有效。

2、写总线(表格黄色部分)

数据手册提供的时序图如下所示。共有 3 种传输模式。模式 1 指的是命令和数据同时发送到 IP 核,模式 2 指的是数据提前于命令发送到 IP 核,模式 3 指的是数据落后于命令发送到 IP 核。模式 1 和 2 均可稳定传输,而模式 3 必须满足一个条件,即数据落后命令的时间不能超过两个时钟周期。本次设计我打算采用模式 1,时序设计起来比较方便。

bfb0c4a5a15c693ba5a7d3b337f65c80.png

关于 app_wdf_end 信号,该信号表示:当前突发写的最后一个数据。在A7 DDR3 的控制器IP核中,只存在突发长度为 8 地址的形式 ,1 个地址能存放的数据是 16bit,因此每一次的地址突发带来的数据突发为 8*16=128 bit(对外接口为128bit)。本次 DDR3 IP 核调取时,我们选取的 “物理层 - 用户端” 的速率为 4:1,每次发送的有效数据为 128 bit,因此1 次突发写就完成了数据的写入,app_wdf_end 和 app_wdf_en 时序上同步了。

1c9320d63f44cb07c9473a1d3c903560.png

而如果选取的 “物理层 - 用户端” 的速率为 2:1,每次发送的有效数据为 64 bit,因此1次突发要分成2次才能真正写完,app_wdf_end 就看得更清楚了。

e7127944d4d00eb145bcbf66fdee582f.png

本次设计采用第一种【数据对齐模式】如下所示:

3、读总线(表格黄色部分)

读总线也分为两种速率,4:1 和 2:1。读就比较简单了,由 User Guide 可知各信号之间的逻辑关系,读数据是在给出命令之后一段时间后开始出现的。图中没有给出 app_rd_data_end 信号,此信号和 app_wdf_end是相同的,即在DDR3的物理层端与用户端存在两种速率情况,此次设计速率为4:1,app_rd_data_end 和 app_rd_data_valid 相同。说白了就是给到命令和地址,过一段时间数据和数据有效指示就出来了。设计时要注意这个“过一段时间”是不确定的,因此读地址和读命令给完后就不要给了,之后要进行等待,等到读数据全部出来后才可以再做的别的操作。

ab6575fe9ab33b17762a3e118db3b176.png

三、完整代码

之前的 DDR2 控制器设计中,采用了对 DDR2 IP 再次封装的方法,而 DDR3 也完全可以这样做。设计一个 DDR3_burst 文件,对 DDR3 IP 进行一次外部突发的封装,方便后面的控制。

1 //**************************************************************************2 //*** 名称 : DDR3_burst.v3 //*** 作者 : xianyu_FPGA4 //*** 博客 :https://www.cnblogs.com/xianyufpga/

5 //*** 日期 : 2020年6月6 //*** 描述 : 完成一次DDR3的突发7 //**************************************************************************

8 moduleDDR3_burst9 //============================< 参数 >======================================

10 #(11 parameter DDR_DM_W = 2 , //芯片dm位宽

12 parameter DDR_DQS_W = 2 , //芯片dqs位宽

13 parameter DDR_BANK_W = 3 , //芯片bank位宽

14 parameter DDR_ADDR_W = 14 , //芯片地址位宽

15 parameter DDR_DATA_W = 16 , //芯片数据位宽16 //-------------------------------------------------------

17 parameter APP_DATA_W = 128 , //用户数据位宽

18 parameter APP_ADDR_W = 28 , //用户地址位宽19 //-------------------------------------------------------

20 parameter BURST_ADDR_W = 25 //外部突发位宽 28-3

21 )22 //============================< 信号 >======================================

23 (24 //时钟和复位 --------------------------------------------

25 input sys_clk_i , //DDR3 参考时钟

26 input sys_rst , //FPGA 全局复位

27 output ui_clk , //DDR3 工作时钟

28 output DDR3_rst , //DDR3 同步复位29 //突发读写接口 ------------------------------------------

30 input burst_rd_req , //突发读请求

31 input burst_wr_req , //突发写请求

32 input [BURST_ADDR_W -3:0] burst_rd_len , //突发读长度

33 input [BURST_ADDR_W -3:0] burst_wr_len , //突发写长度

34 input [BURST_ADDR_W -1:0] burst_rd_addr , //突发读地址

35 input [BURST_ADDR_W -1:0] burst_wr_addr , //突发写地址

36 output [APP_DATA_W -1:0] burst_rd_data , //突发读数据

37 input [APP_DATA_W -1:0] burst_wr_data , //突发写数据

38 output burst_rd_ack , //突发读应答,连接FIFO

39 output burst_wr_ack , //突发写应答,连接FIFO

40 output reg burst_rd_done , //突发读完成信号

41 output reg burst_wr_done , //突发写完成信号42 //DDR3芯片接口 ------------------------------------------

43 output [DDR_ADDR_W -1:0] ddr3_addr ,44 output [DDR_BANK_W -1:0] ddr3_ba ,45 outputddr3_cas_n ,46 outputddr3_ck_n ,47 outputddr3_ck_p ,48 outputddr3_cke ,49 outputddr3_ras_n ,50 outputddr3_cs_n ,51 outputddr3_reset_n ,52 outputddr3_we_n ,53 inout [DDR_DATA_W -1:0] ddr3_dq ,54 inout [DDR_DQS_W -1:0] ddr3_dqs_n ,55 inout [DDR_DQS_W -1:0] ddr3_dqs_p ,56 output [DDR_DM_W -1:0] ddr3_dm ,57 outputddr3_odt58 );59 //============================< 信号 >======================================

60 reg [APP_ADDR_W -1:0] app_addr ;61 wire [2:0] app_cmd ;62 wireapp_en ;63 wire [APP_DATA_W -1:0] app_wdf_data ;64 wireapp_wdf_end ;65 wireapp_wdf_wren ;66 wire [APP_DATA_W -1:0] app_rd_data ;67 wireapp_rd_data_end ;68 wireapp_rd_data_valid ;69 wireapp_rd

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号