首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DDR3篇第一讲、MIG用户接口介绍

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

作者头像
根究FPGA
发布2020-06-30 11:21:22
2.9K2
发布2020-06-30 11:21:22
举报
文章被收录于专栏:根究FPGA根究FPGA

首先需要和大家声明的是,现在我手里的开发板是米联客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级联的原理图,

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 根究FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、app_addr
  • 2、app_cmd
  • 3、app_en
  • 4、app_hi_pri
  • 5、app_wdf_data
  • 6、app_wdf_end
  • 7、app_wdf_mask
  • 8、app_wdf_rdy
  • 9、app_wdf_wren
  • 10、app_rdy
  • 11、app_rd_data
  • 12、app_rd_data_end
  • 13、app_rd_data_end
  • 14、app_rd_data_valid
  • 15、app_ref_req
  • 16、app_ref_ack
  • 17、app_zq_req
  • 18、app_zq_ack
  • 19、ui_clk_sync_rst
  • 20、ui_clk
  • 21、init_calib_complete
  • 22、app_sr_req
  • 23、app_sr_ack
  • 24、sys_rst
  • 25、sys_clk_i
  • 26、clk_ref_i
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档