【整理】详解嵌入式片上资源之SDRAM内存

相关内容:

【整理】嵌入式各种外设的引脚的相通之处和不同点

【整理】嵌入式SoC中各种片内资源

【整理】嵌入式系统的各种常见外设

【整理】嵌入式系统中各种软件功能模块


 

SDRAM内存中的重要参数解析

关于BRC和RBC:

【详解】SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column)

其中,那个截图,参考的是:

An Introduction to SDRAM and memory controllers – Benny Akesson

其中,核心就只有一句:

BRC==B-R-C (Bank, Row, Column)

RBC==R-B-C (Row, Bank, Column)

 

SDRAM内存的内部物理层次和结构

如图:

Typical functional arrangement of SDRAM memory space One Bank only is shown for clarity

其中,很明显是:

上图中的DRAM Memory Matrix中的:

  • rows,对应的长度是上面的那个16384==16K
  • columns,对应的长度是上面的那个1024==1K
  • 对应的行和列交叉的点,对应的大小是8bit==1Byte

 

SDRAM内存中的bank

对应的bank,就是上述上面这个单根内存。

而在一般PC上,台式机中,对应的是主板上的内存的多个插槽

比如:

on pc memory slot bank for sdram

就是有6个插槽,就是6个bank

上面插了6个内存条。

 

SDRAM内存的单个bank的容量大小计算方法

所以,上述例子中的bank的计算方法就是:

单个bank的大小

== row address width * column address width * memory data width

== rows number * columns number * memory data width

== 16K * 1K * 1Byte

==16MBytes

==16MB

相应的的解释:

Typical figures:

4-8 banks

16K rows/bank

1024 columns/row

4-16 bits/column

的含义就是:

此处这个单个bank是16MB的内存:

如图,一共:

8个bank,每个bank是上面算出来的是16MB

16384==16K rows/bank

1024==1K columns/row

8bits/column

所以,此处,总的内存容量是:

16MB*8=128MB

了。

 

嵌入式驱动中如何写代码去配置对应的SDRAM内存

明白如何计算SDRAM内存的row address width和column address number

即,内存的容量计算,所对应的嵌入式中的内存驱动方面的代码,如何写。

关于内存容量,按照上面的例子,是:

bank number * size per bank

== bank number * (rows number/bank * columns number/row * bits/column)

== 8 * (16K * 1K * 8)

== 1024MBits

== 128MBytes

需要注意的是:

在写SDRAM驱动时,往往,上面的

  • rows number/bank==16K
  • columns number==1K

不是直接写成16K和1K的。

而是:

有个对应的:

  • row address width
  • column address number

此处,其值就是:

  • row address width == 2的次方数,而16K是2的14次方
    • 所以此处:
    • row address width ==14

同理:

  • column address number == 2的次方数 而1K是2的10次方,
    • 所以此处是:
    • column address number == 10

类似的,之前见过的,某个MPMC(参见附录的解释)

 

找到SDRAM内存的数据手册中的详细参数

驱动中,去配置MT48LC32M16A2内存时,其配置是:

#define MT48LC32M16A2_SIZEMB                    64 /*!< memory size in MBytes*/
#define MT48LC32M16A2_SIZEBYTES                 (64 * 1024 * 1024)
#define MT48LC32M16A2_CLMN_ADDR_WIDTH           10
#define MT48LC32M16A2_ROW_ADDR_WIDTH            13

其中的很容易看出:

这个MT48LC32M16A2,共64MB

注:此处隐含的条件是:memory data width是8bit=1Byte

对应的datasheet中是:

MT48LC32M16A2 – 8 Meg x 16 x 4 banks

即:

每个bank是8MBit

然后memory data width是16bit

然后一共有4个bank

所以,此处,先算总大小是:

8MBit * 16bit * 4

== 8Mbit * 2Byte * 4

== 64MB

 

搞懂代码中如何配置SDRAM内存的参数

然后,再去看看,上面的:

MT48LC32M16A2_CLMN_ADDR_WIDTH为何设置为10

MT48LC32M16A2_ROW_ADDR_WIDTH为何设置为13

那是因为:

先去看其datasheet中的图示:

注意,是”32 Meg x 16 SDRAM“,对应的这个图:

32 Meg x 16 SDRAM functional block diagram

 

其中可见:

每个bank是:

8,192×1,024×16

 

其实,8192,1024,16,这几个参数,也可以在datasheet中的表格中看到:

in datasheet can find address table detail

即:

表格中也写了,对于:

32Megx16,说明是x16,即16bit的

对应的:

row addressing是8K==8192

column addressing是1K==1024

然后再去推算:

MT48LC32M16A2_CLMN_ADDR_WIDTH

== row address width

== row个数对应的是2的多少次方

== 此处column个数是1024

== 1024是2的10次方

== 10

所以,此处配置为:

#define MT48LC32M16A2_CLMN_ADDR_WIDTH           10

MT48LC32M16A2_ROW_ADDR_WIDTH

== column address width

== column个数对应的是2的多少次方

== 此处column个数是8192

== 8192是2的13次方

== 13

所以,此处配置为:

#define MT48LC32M16A2_ROW_ADDR_WIDTH            13

 

关于SDRAM内存数据宽度的写法和引用

其中的:

memory data width

内存数据宽度

对应的单位是bit,通常也写成xN

常见都有:

4bit==x4

8bit==x8

x16==x16

对应的图表中的写法,是那个DQ。

 

比如:

JZ4760 DDR Contorller block diagram

中的:

DQ[31:0]

表示:

此处的内存数据宽度是0-31,供32位,即32bit==4Byte

按照之前的那个算法:

如果前面的Bank中,内存数据宽度,不是那个8==8bit,而是此处的32bit==4Byte的话,那么上面的内存,单个的bank的大小就是:

16,384×1,024x32bit

== 16K x 1K x 4Byte

== 64MB

了。

 

更多的SDRAM内存的内部结构的例子

再给出另外两个内存的架构的例子:

 

HY57V56820C(L)T内部结构图

HY57V56820C L T internal block diagram

可见,其中是:

DQ是:

DQ[7:0]

即:

0-7,共8位的DQ

即:

memory data width 内存数据宽度

为8bit。

 

如此,才算,真正搞懂了,

内存的

bank

row

column 

memory data width

的含义,以及拿到一个内存,去看对应的datasheet,如何去写其驱动,如何设置对应的

row address width

column address width

等参数,如何计算内存的总容量了。

 

其他一些SDRAM内存控制器

JZ4760_DDR Contorller

 

继续深入了解SDRAM内存单元结构和原理

后续再深入了解内部机制:

sdram internal single cell structure

表示的是:

是x4==4bit==内存位宽是4bit

的内存的例子。

每次,访问row和column的交叉点,即对应的单个的cell

然后读取出对应的值。

 

对应的物理上的时序图,就是:

Back to Back Burst Read with Page Close

 

至此,才算是,对于SDRAM的结构,更加有个了解了。

 

参考资料

【详解】SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column)

An Introduction to SDRAM and memory controllers – Benny Akesson

Everything You Always Wanted to Know About SDRAM (Memory): But Were Afraid to Ask – A Break from the Norm

Everything You Always Wanted to Know About SDRAM (Memory): But Were Afraid to Ask – The INs and OUTs of Memory Addressing

Everything You Always Wanted to Know About SDRAM (Memory): But Were Afraid to Ask – Wider, Not Faster

Micron的MT48LC32M16A2的datasheet

JZ4760_DDR Contorller_百度文库

SDRAM内存驱动(转载)

 

S3C2440 SDRAM内存驱动

HY5756820C : 4 Banks x 8M x 8Bit Synchronous DRAM Hynix Semiconductor

 

Everything You Always Wanted to Know About SDRAM (Memory): But Were Afraid to Ask – SDRAM Core Scheduling – The Impossible discipline

 

附录

MPMC

1.MPMC==Multiport Memory Controller==多端口存储设备控制器

参考自:

Tutorial 1:Sharing DRAM between Modules Using MPMC

2.而:

LogiCORE IP Multi-Port Memory Controller, MPMC (v6.03.a) – mpmc.pdf

中更详细的解释:

”MPMC is a fully parameterizable memory controller that supports SDRAM/DDR/DDR2/DDR3/LPDDR memory.“

即:

MPMC是一个内存控制器,可以通过参数配置以支持各种不同类型的存储器:SDRAM/DDR/DDR2/DDR3/LPDDR内存



One Thought on “【整理】详解嵌入式片上资源之SDRAM内存

  1. “就是有6个插槽,就是6个bank ”楼主理解错误
    bank是内存颗粒内部的属性

发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量