嵌入式设备上的内存大多使用SDRAM,今天通过这篇文章彻彻底底搞清楚,SDRAM结构、原理,以及L-BANK,P-BANK等概念。

本文部分内容借鉴了《高手进阶!终极内存技术指南》一·文,写得非常好,我也不知道原作者是谁,在此表示敬意。

SDRAM: Synchronous Dynamic Random Access Memory,同步动态随机存储器。

同步是指其时钟频率与CPU前端总线的系统时钟频率相同,并且内部的命令的发送与数据的传输都以它为基准;

动态是指存储阵列需要不断的刷新来保证数据不丢失;

随机是指数据不是线性依次存储,而是自由指定地址进行数据的读写。

1. 物理Bank(P-Bank)

先来看两个概念

CPU数据总线的位宽:

CPU在一个传输周期能接受的数据容量就是CPU数据总线的位宽,单位是bit(位)。例如S3C2440个周期最多能接受32位数据,因此它数据总线的位宽是32位的。

内存芯片位宽:

每个内存芯片也有自己的位宽,即每个传输周期能提供的数据量。例如:EM63A165 SDRAM的位宽是16位的。

要使CPU正常工作,内存总线的数据位宽应当等同于CPU数据总线的位宽

P-Bank(Physical Bank其实就是一组内存芯片的集合,这个集合的容量不限,但这个集合的总位宽必须与CPU数据位宽相符。

假设CPU位宽为32位:

如果有一个内存芯片位宽为32位,那1个芯片就可以称为P-Bank;

如果有一个内存芯片位宽为16位,那2个这个芯片合在一起叫P-Bank;

如果有一个内存芯片位宽为8位,那4个这个芯片合在一起叫P-Bank。

2.  逻辑Bank(L-Bank)

SDRAM的内部简单地说是一个存储阵列

阵列就如同表格一样,将数据“填”进去,你可以它想象成一张表格。

内存芯片寻址的基本原理:和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格。

对于内存,这个单元格可称为存储单元,那么这个表格(存储阵列)叫什么呢?它就是逻辑Bank(Logical Bank,下文简称L-Bank)

存储单元的位宽就是内存芯片的位宽。我们的芯片是16位的,所以我们的存储单元也就是16位的。

由于技术、成本等原因,不可能只做一个全容量的L-Bank,人们在SDRAM内部分割成多个L-Bank,基本都是4个。

这样,在进行寻址时就要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择相应的行与列进行寻址。

3. 内存芯片容量

内存芯片的容量就是所有L-Bank中的存储单元的容量总合。计算有多少个存储单元和计算表格中的单元数量的方法一样:

存储单元数量=行数×列数(得到一个L-Bank的存储单元数量)×L-Bank的数量

SDRAM总存储容量 = L-Bank的数量×行数×列数×存储单元的容量

在内存产品Datasheet中,都会用M×W,或者M×word×n-bit的方式来表示芯片的容量。

M是该芯片中存储单元的总数,单位是兆(英文简写M,1048576),W=word×n-bit代表每个存储单元的容量,也就是SDRAM芯片的位宽(Width),单位是bit。

例如:EM63A165 SDRAM

容量:4×16×4=256Mbit=32MB

在相同的总容量下,芯片位宽可以采用多种不同的设计。

4M word x 16-bit x 4-bank=8M word x 8-bit x 4-bank=16M word x 4-bit x 4-bank

由此可见,在芯片容量相同的情况下,位宽越小,内存容量越大。

4. SDRAM引脚

内存芯片要想工作,必须要与内存控制器有所联系,

同时对于一个电气元件,电源供应也是必不可少的,VSS和VDD

而且数据的传输要有一个时钟CLK作为触发参考。

1. 首先,我们知道内存控制器要先确定一个P-Bank的芯片集合,然后才对这集合中的芯片进行寻址操作。因此要有一个片选CS的信号,它一次选择一个P-Bank的芯片集(根据位宽的不同,数量也不同)。被选中的芯片将同时接收或读取数据,所以要有一个片选信号。

2. 接下来是对所有被选中的芯片进行统一的L-Bank的寻址,目前SDRAM中L-Bank的数量最高为4个,所以需要两个L-Bank地址信号BA0BA1

3. 最后就是对被选中的芯片进行统一的行/列(存储单元)寻址。地址线数量要根据芯片的组织结构分别设计了。但在相同容量下,行数不变,只有列数会根据位宽的而变化,位宽越大,列数越少,因为所需的存储单元减少了。A0-A12

4.找到了存储单元后,被选中的芯片就要进行统一的数据传输,那么肯定要有与位宽相同数量的数据I/O通道才行,所以肯定要有相应数量的数据线引脚。DQ0-DQ15

此外还有CAS(Column Address Strobe,列地址选通脉冲)、RAS(Row Address Strobe,行地址选通脉冲)、DQML\DQMU数据掩码、WE读写信号将在后文中进行说明

5. SDRAM基本操作

下图为SDRAM的功能框图,SDRAM内部有一个控制信号发生器(CONTROL SIGNAL GENERTOR),一个模式寄存器(MODE REGISTER)等。

SDRAM接收外部输入的控制命令,进行寻址、读写、刷新、预充电等操作。

初始化

如图,上电后有200us的输入稳定期,在这个时间内不可以对SDRAM的接口做任何操作;200us结束以后给所有L-Bank预充电Precharge(后面详细讲),设置模式寄存器(Mode Register),接着需要至少两个刷新才能进行其他操作。

行有效

初始化完成后,要想对一个L-Bank中的阵列进行寻址,首先就要确定行(Row),使之处于活动状态(Active),然后再确定列。虽然之前要进行片选和L-Bank的定址,但它们与行有效可以同时进行。

同时RAS(Row Address Strobe,行地址选通脉冲)也处于有效状态。此时An地址线则发送具体的行地址。

列读写

行地址确定之后,就要对列地址进行寻址了。

在SDRAM中,行地址与列地址线是共用的。地址线仍然是行地址所用的A0-A12(在上面所讲的内存芯片中)。

读/写的命令是怎么发出的呢?

其实没有一个信号是发送读或写的明确命令的,而是通过芯片的可写状态的控制来达到读/写的目的。显然WE#信号就是一个关键。WE#无效时,当然就是读取命令。

 SDRAM基本操作命令,如上图, 通过各种控制/地址信号的组合来完成(H代表高电平,L代表低电平,X表示高低电平均没有影响)。

列寻址信号与读写命令是同时发出的。虽然地址线与行寻址共用,但CAS(Column Address Strobe,列地址选通脉冲)信号则可以区分开行与列寻址的不同,配合A0-A9,A11(本例)来确定具体的列地址。

在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟),大家也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。

数据输出(读)

在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。

但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Latency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。

数据输入(写)

数据写入的操作也是在tRCD之后进行,但此时没有了CL(记住,CL只出现在读取操作中),行寻址与列寻址的时序图和上文一样,只是在列寻址时,WE#为有效状态。

由于数据信号由控制端发出,输入时芯片无需做任何调校,只需直接传到数据输入寄存器中,然后再由写入驱动器进行对存储电容的充电操作,因此数据可以与CAS同时发送,也就是说写入延迟为0。不过,数据并不是即时地写入存储电容,因为选通三极管(就如读取时一样)与电容的充电必须要有一段时间,所以数据的真正写入需要一定的周期。为了保证数据的可靠写入,都会留出足够的写入/校正时间(tWR,Write Recovery Time),这个操作也被称作写回(Write Back)。tWR至少占用一个时钟周期或再多一点(时钟频率越高,tWR占用周期越多)

预充电(Precharge)

在进行完读写操作后,如果要对同一L-Bank的另一行进行寻址,就要将原来有效(工作)的行关闭,重新发送行/列地址。

L-Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。

预充电可以通过命令控制,也可以通过辅助设定让芯片在每次读写操作之后自动进行预充电。

实际上,预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位,同时释放S-AMP(重新加入比较电压,一般是电容电压的1/2,以帮助判断读取数据的逻辑电平,因为S-AMP是通过一个参考电压与存储体位线电压的比较来判断逻辑值的),以准备新行的工作。

具体而言,就是将S-AMP中的数据回写,即使是没有工作过的存储体也会因行选通而使存储电容受到干扰,所以也需要S-AMP进行读后重写。

此时,电容的电量(或者说其产生的电压)将是判断逻辑状态的依据(读取时也需要),为此要设定一个临界值,一般为电容电量的1/2,超过它的为逻辑1,进行重写,否则为逻辑0,不进行重写(等于放电)。为此,现在基本都将电容的另一端接入一个指定的电压(即1/2电容电压),而不是接地,以帮助重写时的比较与判断。

刷新

我们之所以叫DRAM,就是因为它是动态的,就是每隔一段时间进行一次刷新,确保那些没有被读写过的数据不会以为时间长导致电容漏电,从而导致数据丢失。

刷新操作与预充电中重写的操作一样,都是用S-AMP先读再写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有L-Bank中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。但与所有L-Bank预充电不同的是,这里的行是指所有L-Bank中地址相同的行,而预充电中各L-Bank中的工作行地址并不是一定是相同的。

那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒)。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个L-Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625μs(微秒,1/1000毫秒),8192行时就为7.8125μs。

刷新操作分为两种:自动刷新(Auto Refresh,简称AR)自刷新(Self Refresh,简称SR)。不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。

对于AR, SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址,或者说CAS在RAS之前有效。所以,AR又称CBR(CAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有L-Bank,因此在刷新过程中,所有L-Bank都停止工作,而每次刷新所占用的时间为9个时钟周期(PC133标准),之后就可进入正常的工作状态,也就是说在这9 个时钟期间内,所有工作指令只能等待而无法执行。64ms之后则再次对同一行进行刷新,如此周而复始进行循环刷新。显然,刷新操作肯定会对SDRAM的性能造成影响,但这是没办法的事情,也是DRAM相对于SRAM(静态内存,无需刷新仍能保留数据)取得成本优势的同时所付出的代价。

SR则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是STR(Suspend to RAM,休眠挂起于内存)在发出AR命令时,将CKE置于无效状态,就进入了SR模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在SR期间除了CKE之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并进入正常操作状态。

操作模式 

突发(Burst):是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL)。

读/写操作,都是一次对一个存储单元进行寻址,如果要连续读/写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读/写命令(行地址不变,所以不用再对行寻址)。

虽然由于读/写延迟相同可以让数据的传输在I/O端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低(早期的FPE/EDO内存就是以这种方式进行连续的数据传输)。

为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL)外,其后每个数据只需一个周期的即可获得。

非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1。虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大

突发连续读取模式:只要指定起始列地址与突发长度,寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与BL相同)即可做到连续的突发传输。至于BL的数值,也是不能随便设或在数据进行传输前临时决定。在上文讲到的初始化过程中的MRS阶段就要对BL进行设置。目前可用的选项是1、2、4、8、全页(Full Page),全页就是将这一行上的数据一连串的全部读出或写入,常见的设定是4和8。

在MRS阶段除了要设定BL数值之外,还要具体确定读/写操作的模式以及突发传输的模式

突发读/突发写,表示读与写操作都是突发传输的,每次读/写操作持续BL所设定的长度,这也是常规的设定。

突发读/单一写,表示读操作是突发传输,写操作则只是一个个单独进行。

突发传输模式代表着突发周期内所涉及到的存储单元的传输顺序。顺序传输是指从起始单元开始顺序读取。假如BL=4,起始单元编号是n,顺序就是n、n+1、n+2、n+3。交错传输就是打乱正常的顺序进行数据传输(比如第一个进行传输的单元是n,而第二个进行传输的单元是n+2而不是n+1),至于交错的规则在SDRAM规范中有详细的定义表,但在这此出于必要性与篇幅的考虑就不列出了。

数据掩码

在讲述读/写操作时,我们谈到了突发长度。如果BL=4,那么也就是说一次就传送4x64bit的数据。

但如果其中的第二笔数据是不需要的,怎么办?

为了屏蔽不需要的数据,人们采用了数据掩码(Data I/O Mask,简称DQM)技术。通过DQM,内存可以控制I/O端口取消哪些输出或输入的数据。这里需要强调的是,在读取时,被屏蔽的数据仍然会从存储体传出,只是在“掩码逻辑单元”处被屏蔽。

SDRAM官方规定,在读取时DQM发出两个时钟周期后生效,而在写入时,DQM与写入命令一样是立即成效。

以上便是SDRAM的原理,很多细节还需要自己查看Datasheet,我将在之后的文章中详解如何编写SDRAM驱动程序。

详解内存SDRAM原理(P-Bank、L-Bank、刷新、预充电等)相关推荐

  1. 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程

    @TOC初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程 [1]什么是windows API Windows API 中文翻译过来就是windows应用程序接口(Applica ...

  2. 操作系统:图文详解 内存映射

    操作系统:图文详解 内存映射 前言 内存映射 在 Linux操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作 今天,我将详细讲解操作系统中核心概念:内存映射 目录 示意图 1. ...

  3. 【转详解步进电机工作原理】

    详解步进电机工作原理[转自知乎gk-auto] 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响, ...

  4. LwIP 之六 详解内存池(memp.c/h)动态内存管理策略

      对于嵌入式开发来说,内存管理及使用是至关重要的,内存的使用多少.内存泄漏等时刻需要注意!合理的内存管理策略将从根本上决定内存分配和回收效率,最终决定系统的整体性能.LwIP 就提供了 动态内存堆管 ...

  5. FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社

    大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦. <FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社> 京东自营链接:https://item.jd.com/13 ...

  6. 多维度详解redis以及原理实现,结构与应用分析

    6个方面了解redis应用及其实现原理 1.redis数据存储概述 2.string结构以及应用 3.list结构以及应用 4.hash结构以及应用 5.set结构以及应用 6.zset结构以及应用 ...

  7. 计算机评分主硬盘分数低,鲁大师跑分详解-内存篇:内存跑分为什么比别人低?分数到底差在哪?...

    原标题:鲁大师跑分详解-内存篇:内存跑分为什么比别人低?分数到底差在哪? 今天鲁sir不说别人家的手机了,说说自己家的鲁大师,回归老本行,接下来呢给大家详细解释一下鲁大师跑分项目. 本期是第一期,所以 ...

  8. 详解帧中继工作原理及作用

    详解帧中继工作原理及作用 帧中继特点 帧中继工作原理 帧中继的作用 帧中继习题 帧中继(FrameRelay)是一种用于连接计算机系统的面向分组的通信方法.它主要用在公共或专用网上的局域网互联以及广域 ...

  9. ArrayList 扩容详解,扩容原理

    ArrayList 扩容详解,扩容原理 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长. ArrayList不是线程安全的,只能用在单线程环境下. 实现了Serializable ...

  10. 十年架构师详解JVM运行原理

    做Java开发的几乎都知JVM这个名词,但是由于JVM对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是JVM,以 ...

最新文章

  1. Java Spring singleton bean的创建源代码
  2. jquery ztree 设置勾选_047 JAVA-jQuery
  3. HashMap的结构及源码分析
  4. 【Flink】Flink 1.11深度解析 【视频笔记】
  5. 【工程项目经验】dmesg查看linux系统缓存日志
  6. 用 Java 语言,写一个植物大战僵尸简易版!
  7. mysql目录结构与源码
  8. 土地一分用计算机怎么算,土地计量单位换算(土地计量亩分厘单位)
  9. Windows学习总结(12)——Windows 10系统开始运行-cmd命令大全
  10. linux应用层读写event,Linux应用层获取鼠标坐标
  11. 抽奖活动前端源码-可录入抽奖人名单
  12. .NET Core、DNX、DNU、DNVM、MVC6学习资料
  13. 284、超详细的光纤熔纤、盘纤教程,值得收藏
  14. Oracle EBS 11i BOM模块常用表结构
  15. Echarts图表中设置背景图片
  16. mysql创建数据表列子,MySQL 创建数据库及简单增删改查
  17. win7开启ftp被动模式_Win7上防火墙开放FTP服务以及ping解决方案
  18. 点击评论区让键盘弹起uni-app
  19. day11-random模块-随机
  20. 情感分析Sentiment Analysis 知识资料全集(入门/进阶/论文/综述/视频/专家,附查看

热门文章

  1. metro风格的特点
  2. win7加入网络计算机,win7怎么加入局域网工作组_win7加入局域网工作组的步骤
  3. 中国20年互联网的发展史
  4. GAEfan qiang教程
  5. 金融信息破局刍议【4】长尾效应
  6. Windows 7 查看默认的本地 DNS 服务器地址
  7. 模式识别学习笔记(8)——隐马尔可夫模型
  8. 艾盟赢销浅谈:CRM的本质和它的未来十年
  9. 微信小程序实现多图片下载
  10. 理解Spring 容器设计理念