卢骏 · 2020年07月04日

CORTEX-A8裸机系列:第八章 DRAM介绍

第八章 DRAM介绍

1、DRAM引入

DRAM特性:

容量大,价格低,掉电易失性,随机读写,总线式访问。

DRAM都属于动态内存(相对于静态内存SRAM),都需要初始化才能使用,不像SRAM开机上电后就可以直接运行。

DRAM在系统中属于SOC外接设备。DRAM通过地址总线和数据总线接口(总线接口)与cpu通信。

2、x210-v3的DRAM芯片

开发板原理图上使用的是K4T1G164QQ,但实际开发板上用的是另一款N2TU161666-AC,不过两个是完全兼容的。

全球做DRAM的厂商不多,二线厂家做的产生参数都是向一线厂家(三星、kingston)看齐,目的是兼容一线厂家的设计,然后让在意成本的厂商选择它的内存芯片替代一线厂家的内存芯片。

DRAM的这个市场特征就导致了这个东西比较标准化,大部分时候细节参数官方(芯片原厂家)都提供一个参考值。

K4T1G164QQ:

K表示三星产品。

4表示是DRAM。

T表示产品号码(DDR2 SDRAM)。

1G表示容量(1Gb,以bit为单位,等于128MB,开发板上一共用了4片相同的内存,总容量是128*4=512MB)。

16表示单芯片是16位宽的。

4表示8bank。

Q表示SSTL_18(1.8V,1.8V)。
1.png

三星官方提供的数据手册上其实没有芯片相关的参数设置信息,都是芯片选型与外观封装方面的信息,选型是给产品经理来看的,封装和电压等信息是给硬件工程师看的。软件工程师最关注的是工作参数信息,而这些参数信息,官方会提供参考代码。

3、s5pv210的memory port

对于CPU,CPU是通过片上的memory port和外部的SDRAM芯片进行通信的。对于s5pv210,有专用的和SDRAM芯片通信的memory port。

3.1、memory port

210上面有3部分的memory port。

可以看出,对于memory port0,可以接SROM/NAND/ONENAND。对应是Xm0xxx的管脚。

对于memory port1、2,可以接DDR2,mDDR,mDDR2。对应Xm1xxxx,Xm2xxx的管脚。
2.png

3.2、DRMA0和DRAM1

210共有两个内存端口(就像是有两个内存插槽)。再结合查阅数据手册中内存映射部分,可知,两个内存端口分别叫DRAM0和DRAM1。
3.png

对于DRAM0,内存地址范围: 0x2000_0000 – 0x3fff_ffff。512MB大小

        对应原理图上的引脚是 xm1xxxx

对于DRAM1,内存地址范围: 0x4000_0000 – 0x7fff_ffff。1024MB大小。

        对应原理图上的引脚是 xm2xxxx
3.3、结论

1) 整个210最多可以支持内存1.5GB。如果给210更多的内存,CPU是无法识别的。

2) 210最多支持1.5GB内存大小,但是实际的开发板不一定要这么多,比如x210开发板就只有512MB内存大小。连接方法是在DRAM0端口分布了256MB,在DRAM1端口分布了256MB。

3) 由2可知,x210开发板上内存合法地址是:

0x2000_0000 – 0x2fff_ffff(256MB)

0x4000_0000 — 0x4fff_ffff(256MB)

当板子上DDR2初始化完成之后,这些地址都是可以使用的;如果使用了其他的地址,就会出现内存读取异常,就出现错误了。

4、X210-v3的DRAM的原理图

原理图上,地址线有14根,这个地址线的位宽是和DRAM芯片的数据手册对应的。
4.png

控制信号:
5.png

数据线32根,表示数据访问是以32位为单位访问的。
6.png

以上就是xm1的部分,还有xm2的部分,信号线是一样的。

5、DRAM结构

X210使用了4片内存(每片1GB,128MB)。每片内存的数据总线都是16位的。每两片使用一个DRAM区域。这样,就相当于一片256MB大小的32位DRAM芯片。

DRAM结构框图:

128Mb * 8 8指的是8个bank
7.png

输入BA0-BA2选择8个bank中的一个bank。

一个bank有128Mb,通过row address + column address的方式综合寻址。

Row address 14位。

Column 10位。

一共能寻址的范围是: 2的14次方 + 2的10次方 = 2的24次方,就是16MB内存,也就是128Mb内存,这个大小也就是一个bank的大小。所以8个bank,总大小就是16*8=128MB。

6、初始化DDR2

DDR初始化和SOC(准确的说是和SOC中的DDR控制器)有关,也和开发板使用的DDR芯片有关,和开发板设计时DDR的连接方式也有关。

初始化步骤,27步(s5pv210数据手册598):
8.png
9.png

因为x210内存连接了两个,DRAM0控制器和DRAM1控制器,所以初始化需要两次,一次初始化DRAM0,一次初始化DRAM1。

7、DRAM控制器

CPU不会直接操作memory port去和外部的DRAM芯片通信,而是去操作CPU内部的DRAM控制器来和外部的DRAM芯片通信。

DRAM的作用,就是CPU和外部DRAM芯片的桥梁,使之能相互进行通信。CPU通过AXI总线,可以直接对DRAM的地址进行读取。而忽略掉DRAM的接口复杂的时序。

7.1、s5pv210的DRAM控制器

DRAM控制器使用SEC DDR PHY接口。

s5pv210拥有两个DRAM控制器,DRAM0,DRAM1。其中DRAM0最大支持512MB,DRAM1最大支持1GB。但是两个控制器如果同时使用的话,只能驱动同一类型的存储器。

DRAM的关键特性

◾兼容JEDEC DDR2,低功耗DDR和低功耗DDR2

◾使用SEC LPDDR2 PHY接口,支持高速存储设备

◾支持最大2个chip选择,每个chip为1/2/4/8 bank

◾支持128Mb,256Mb,512Mb,1Gb,2Gb,4Gb密度的存储设备

◾支持16/32位的数据位宽

◾优化的流水线,实现低latency

◾支持QoS策略,保证在某些应用下的低latency

◾先进的嵌入式调度程序

◾支持 chip/bank 交互 和存储中断

◾支持AMBA的AXI

◾采用可变的低功耗策略,减少动态和静态电流

◾支持外部访问

◾支持bank选择预充电策略

框图:
10.png

从框图可以看出,控制器包括总线接口部分,调度程序部分,内存接口部分。

CPU如果写DRAM,会将写的请求(包括地址和数据)放入到AXI总线上。DRAM控制器接收到该AXI数据,通过内部的电路,将数据转化为DRAM的接口时序数据,通过PHY接口,将数据写入到外部的DRAM中。

CPU如果读DRAM,会将读的请求(地址)放入到AXI总线上。DRAM控制器接收到该AXI数据,通过内部的电路,将数据转化为DRAM的接口时序数据,通过PHY接口,将外部的DRAM数据读取到内部的read date fifo中,然后通过AXI总线发送回CPU。

7.2、DRAM初始化

初始化包括:

◾PHY DLL 初始化:设置PHY的DLL。

◾设置控制寄存器:设置DRAM控制器的参数,使DRAM控制器的参数与外部DRAM芯片的参数一致。

◾内存初始化:对外部的DRAM芯片进行初始化。对于内存初始化,参考JEDEC标准和存储设备的数据手册。有三种不同的存储设备,LPDDR,LPDDR2,DDR2。

7.3、AXI地址映射

控制器会映射AXI的地址信息映射到DRAM设备的地址,如片选,bank地址,row地址,col地址。这样,CPU就可以通过AXI直接对外部DRAM设备进行数据访问。

AXI的地址被分为AXI base地址和AXI offset地址。

AXI base地址决定存储设备的开始地址,AXI offset决定存储设备基于开始地址的偏移地址。而AXI的地址,由bank,row,col来组合而成。因为该组合不是唯一的,因此就存在多种映射关系。该映射关系由memconfig寄存器设置。

映射有两种,不过一般是使用线性映射:

1) 线性映射
11.png

2) 交错映射

12.png

s5pv210给出了外接DRAM的解决方案,我们一般会参考这些解决方案。

13.png

也有说明:
14.png

◾config.1:不大于4bank,并且row的地址不大于14bit

◾config.2:不大于4bank,并且row的地址不大于15bit

◾config.3:8bank,并且row的地址不大于14bit

◾config.4:8bank,并且row的地址不大于15bit

◾config.5:memory的类型是LPDDR2

对于不同的DRAM的bank和row地址,使用不用的解决方案。对于x210-v3开发板,使用的是8bank,14位的row地址,所以使用的是config.3方案。和原理图设计的一样。

当DRAM是8bank,CS1管脚复用为bank2,这个时候210相当于只有一个片选CS0。这样,DRAM控制器就只能控制一个chip了,通过CS0来控制,这个时候就要设置memcontrol寄存器的num_chip为0,表示外接的存储器是一片。这样,就不需要配置memconfig1寄存器了,因为用不到第二个片选CS1。

memconfigx(x=0,1)是chipx的配置寄存器。每个DMC都有该寄存器。而且是两个,表示针对片选0和片选1。

15.png

对于地址映射:

210可以控制内存地址映射,DMC0的地址空间是0x2000_0000 – 0x3fff_ffff。DMC1的地址空间为0x4000_0000 – 0x7fff_ffff。DMC可以通过配置寄存器Memconfig寄存器来使内存芯片映射到内存段内的适当位置。

如果设置chip_base为0x20。也就表示为DRAM的起始地址是0x2000_0000。

1) 挂载的内存为128M,chip_mask应该设置为0xf8。表示DRAM的地址为0x2000_000-0x27ff_ffff,该chip选中。

2) 挂载的内存为256M,chip_mask应该设置为0xf0。表示DRAM的地址为0x2000_000-0x2fff_ffff,该chip选中。

3) 挂载的内存为512M,chip_mask应该设置为0xe0。表示DRAM的地址为0x2000_000-0x3fff_ffff,该chip选中。

以DMC0为例,当DMC0接收到来自AXI的0x2000_0000 – 0x3fff_ffff内的地址时,会做如下处理:

1) 将AXI的高8位地址和chip_mask相与得到结果,记为X

2) 将X分别于memconfig0和memconfig1的chip_base相比较,如果相等,则打开对应的片选。

假如挂载的内存大小是128M,且CS0和CS1分别挂了一片,那么128M = 128 1024 1024, 则128M内存的地址范围是0x0000_0000 – 0x07ff_ffff。高位剩余5位。那么,把memconfig0的chip_base设置为0x20,chip_mask设置为0xf8。可以保证AXI的地址是0x2000_0000 – 0x27ff_ffff,这些地址与chip_mask后与,结果是0x20,与memconfig0的chip_base一致,说明访问chip0,于是chip0的片选就会有有效。

为了保持内存连续,需要将memconfig1的chip_base设置为0x28,chip_mask设置为0xf8。

这样,当AXI的地址发来是0x23xx_xxxx, 0x23 & 0xf8 = 0x20, 和memconfig0的chip_base一样,而0x23 & 0xf8 = 0x20,和memconfig1的chip_base不一样,所以会打开片选0。当AXI的地址发来是0x28xx_xxxx,0x28 & 0xf8 = 0xf8,与memconfig1的chip_base一样,与memconfig0的chip_base不一样,所以会打开片选1。而此时,地址空间就连续了起来。

当使用的DRAM是8bank时,CS1会被复用成bank2。所以这个时候只有一个chip信号CS0有效,就不需要配置CS1的寄存器memconfig1。不过要将memcontrol寄存器的num_chip为0,表示外接的存储器是一片。

16.png

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
推荐阅读
关注数
23565
内容数
1018
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息