DDR3篇第一讲、MIG用户接口介绍

2020-06-30 11:21:22 浏览数 (1)

首先需要和大家声明的是,现在我手里的开发板是米联客7z030:

核心板搭载了4块镁光DDR3内存,2片与PS相连,另外2片与PL相连,单片DDR3内存大小为512MB,其型号为:MT41K256M16XX-125。

然后我的问题就来了,啥512MB还256M16XX的,256M?不是512MB吗?难道是汤老师骗我?

并没有。

一、DDR3存储空间的计算

对于MT41K256M16XX-125这个型号的DDR3,说明书的介绍为:

根据DDR3存储的原理,先选择bank,再选择行,再选择列,最后插钥匙,钥匙插进去,啪嗒~数据从DQ线上掉出来了。

bank、行、列决定了这个DDR具有多少个放数据的小盒盒,你把这些数据给进去,小盒盒就会蹦出16bit的数据来,正经点来说就是:

MT41K256M16XX-125

行数(2^15): A0~A14

列数(2^10):A0~A9

bank数(2^3):bank0~bank7

输出数据宽度(16):dq0~dq15

综上,单片DDR3的存储单元个数为:

行数 x 列数 x bank数 即 2^15 x 2^10 x 2^3 =256M

存储空间的大小为:

存储单个数量 x 数据宽度 即 256M x 16 / 2=512MB

综上,单片DDR3的大小果真是512MB,老板诚不欺我!

接下来就是MIG了,这是xilinx官方提供的一个驱动DDR3的IP,既然有打火机了,咱就不钻木取火了,先看一下这个IP给用户使用的信号端口,下一篇再看电气端口。

二、MIG IP用户接口

1、app_addr

wire[ADDR_WIDTH-1:0] app_addr; ADDR_WIDTH=29

此输入表示当前正在提交给用户界面请求的地址,每个地址代表的是4byte,而一次读写的数据为256bit,所以每次操作完之后,请求地址要 8。

2、app_cmd

请求指令,

读取请求:3’b001

写入请求:3’b000

3、app_en

此信号在输入请求中使用,在声明app_en之前,用户必须先对app_addr、app_cmd、app_hi_pri进行赋值,之后声明app_en将该请求提交给MIG,在MIG接收之后会声明app_rdy进行确认的握手。

4、app_hi_pri

该输入表示当前请求是最高优先级,不用的话直接置0即可。

5、app_wdf_data

app_wdf_data[APP_DATA_WIDTH-1: 0 ]该接口提供写入外部存储器的数据,MIG内部的运行频率为800Mhz,所以一次的话,需要提供256bit的数据,因为接收到数据后,时钟的上升下沿下降沿都会有数据操作,而且外部的数据宽度为32bit,上升沿与下降沿都要数据变化的话就是64bit,内部时钟是接口时钟的4倍,所以一次操作的数据宽度为256bit。

6、app_wdf_end

输入到MIG,该输入表示当前周期中app_wdf_data[]总线上的数据是当前请求写入到外部DDR存储器的数据。其为高电平时表示当前时钟周期是输入数据的最后一个时钟周期,其实也就一个时钟周期,因为每次写入的数据宽度都是256bit,所以在每次数据写入时,直接将其置一即可。程序中使用的是

app_wdf_end = app_wdf_wren; //两个相等即可

7、app_wdf_mask

app_wdf_mask[APP_MASK_WIDTH-1: 0]该信号输入到MIG,指示app_wdf_data中的哪些位写入外部存储器,哪些位保持在当前状态,当输入数据宽度为256bit时,其宽度为32bit,每一bit对应输入数据的1个字节,当该位为1时,其所对应的字节不会写入到外部DDR存储器。

8、app_wdf_rdy

由MIG输出,表示写入数据FIFO准备好接收数据,接收写入数据操作要在app_wdf_rdy和app_wdf_wren都断言时进行。

9、app_wdf_wren

该信号输入到MIG,表示app_wdf_data[]总线上的数据有效,该信号的赋值操作为:

assign

app_wdf_wren =ProsessIn1?app_rdy&&app_wdf_rdy:1'd0;

app_rdy为MIG输出的指令接收信号,app_wdf_rdy为MIG输出的写入数据接收fifo准备ready信号(Write Data Fifo Ready)。

10、app_rdy

该信号由MIG输出,向用户显示当前提交给UI的请求是否被接受。如果在app_en断言之后,MIG未声明该信号,则必须重试当前的请求,在以下三种情况下,MIG不会声明app_rdy的输出:

1)、内存初始化未完成

2)、所有bank被占用

-----请求读取,读取缓冲区满

-----请求写入,并无写缓冲区指针可用

3)、正在插入定期读取

11、app_rd_data

app_rd_data[APP_DATA_WIDTH-1: 0 ],该信号由MIG输出,输出的是从外部存储器读取得到的数据。

12、app_rd_data_end

该输出表示当前周期中,qpp_rd_data[]总线上的数据为当前请求的最后数据。

13、app_rd_data_end

该输出表示当前周期中app_rd_data[]总线上的数据为当前请求的最后数据。

14、app_rd_data_valid

该信号由MIG输出,表示app_rd_data[]总线上的数据有效。

15、app_ref_req

该信号输入到MIG,当该信号被置位时,该高电平游戏哦啊高电平游戏哦啊行输入请求存储控制器向DRAM发送刷新指令。必须对单个周期进行脉冲以进行请求,然后进行断言,直到app_ref_ack信号被断言以确认请求并指示指令已经发送刷新请求。

16、app_ref_ack

该信号由MIG输出,当其置位时,高电平有效确认刷新请求,并指示命令已经从存储控制器发送到物理层。

17、app_zq_req

该信号输入到MIG,当置位时,高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。必须对单个周期进行脉冲以进行请求,然后进行断言,直到app_zq_ack输出信号为1以确认请求并指示已经发送请求。

18、app_zq_ack

该信号由MIG发出,当有效时,此高电平表示确认ZQ校准请求,并指示已经从存储控制器发送到物理层。

19、ui_clk_sync_rst

由MIG输出,当其为高时表示UI复位(This is the active-High UI reset)。

20、ui_clk

UI的输出时钟,根据MIG的设置(4:1 or2:1)生成。

21、init_calib_complete

当校准完成时,PHY会断言把init_calib_complte,在向内存控制器发送命令之前,无需等待init_calib_complte。

22、app_sr_req

输入到UI,reserved,设为0 is okay。

23、app_sr_ack

reserved.(page 118)

24、sys_rst

该信号就是在MIG配置时选择的复位信号。

25、sys_clk_i

该时钟就是在MIG配置时选择的输入时钟。

26、clk_ref_i

参考时钟。

最后放一张两片DDR3级联的原理图,

0 人点赞