首先需要和大家声明的是,现在我手里的开发板是米联客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用户接口
wire[ADDR_WIDTH-1:0] app_addr; ADDR_WIDTH=29
此输入表示当前正在提交给用户界面请求的地址,每个地址代表的是4byte,而一次读写的数据为256bit,所以每次操作完之后,请求地址要+8。
请求指令,
读取请求:3’b001
写入请求:3’b000
此信号在输入请求中使用,在声明app_en之前,用户必须先对app_addr、app_cmd、app_hi_pri进行赋值,之后声明app_en将该请求提交给MIG,在MIG接收之后会声明app_rdy进行确认的握手。
该输入表示当前请求是最高优先级,不用的话直接置0即可。
app_wdf_data[APP_DATA_WIDTH-1: 0 ]该接口提供写入外部存储器的数据,MIG内部的运行频率为800Mhz,所以一次的话,需要提供256bit的数据,因为接收到数据后,时钟的上升下沿下降沿都会有数据操作,而且外部的数据宽度为32bit,上升沿与下降沿都要数据变化的话就是64bit,内部时钟是接口时钟的4倍,所以一次操作的数据宽度为256bit。
输入到MIG,该输入表示当前周期中app_wdf_data[]总线上的数据是当前请求写入到外部DDR存储器的数据。其为高电平时表示当前时钟周期是输入数据的最后一个时钟周期,其实也就一个时钟周期,因为每次写入的数据宽度都是256bit,所以在每次数据写入时,直接将其置一即可。程序中使用的是
app_wdf_end = app_wdf_wren; //两个相等即可
app_wdf_mask[APP_MASK_WIDTH-1: 0]该信号输入到MIG,指示app_wdf_data中的哪些位写入外部存储器,哪些位保持在当前状态,当输入数据宽度为256bit时,其宽度为32bit,每一bit对应输入数据的1个字节,当该位为1时,其所对应的字节不会写入到外部DDR存储器。
由MIG输出,表示写入数据FIFO准备好接收数据,接收写入数据操作要在app_wdf_rdy和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)。
该信号由MIG输出,向用户显示当前提交给UI的请求是否被接受。如果在app_en断言之后,MIG未声明该信号,则必须重试当前的请求,在以下三种情况下,MIG不会声明app_rdy的输出:
1)、内存初始化未完成
2)、所有bank被占用
-----请求读取,读取缓冲区满
-----请求写入,并无写缓冲区指针可用
3)、正在插入定期读取
app_rd_data[APP_DATA_WIDTH-1: 0 ],该信号由MIG输出,输出的是从外部存储器读取得到的数据。
该输出表示当前周期中,qpp_rd_data[]总线上的数据为当前请求的最后数据。
该输出表示当前周期中app_rd_data[]总线上的数据为当前请求的最后数据。
该信号由MIG输出,表示app_rd_data[]总线上的数据有效。
该信号输入到MIG,当该信号被置位时,该高电平游戏哦啊高电平游戏哦啊行输入请求存储控制器向DRAM发送刷新指令。必须对单个周期进行脉冲以进行请求,然后进行断言,直到app_ref_ack信号被断言以确认请求并指示指令已经发送刷新请求。
该信号由MIG输出,当其置位时,高电平有效确认刷新请求,并指示命令已经从存储控制器发送到物理层。
该信号输入到MIG,当置位时,高电平有效输入请求存储控制器向DRAM发送ZQ校准命令。必须对单个周期进行脉冲以进行请求,然后进行断言,直到app_zq_ack输出信号为1以确认请求并指示已经发送请求。
该信号由MIG发出,当有效时,此高电平表示确认ZQ校准请求,并指示已经从存储控制器发送到物理层。
由MIG输出,当其为高时表示UI复位(This is the active-High UI reset)。
UI的输出时钟,根据MIG的设置(4:1 or2:1)生成。
当校准完成时,PHY会断言把init_calib_complte,在向内存控制器发送命令之前,无需等待init_calib_complte。
输入到UI,reserved,设为0 is okay。
reserved.(page 118)
该信号就是在MIG配置时选择的复位信号。
该时钟就是在MIG配置时选择的输入时钟。
参考时钟。
最后放一张两片DDR3级联的原理图,