一文搞懂DDR SDRAM工作原理

1, 简介

    DDR SDRAM(Double Data Rate Synchronous Dynamic Random Access Memory,双数据率同步动态随机存储器)通常被我们称为DDR,其中的“同步”是指内存工作需要同步时钟,内部命令的发送与数据传输都以它为基准。DDR是一种掉电就丢失数据的存储器件,并且需要定时的刷新来保持数据的完整性。

    DDR是我们嵌入式系统使用比较多的硬件,但是平时我们在做软件开发或者优化的时候,对它的组成及工作原理了解却很少。主要原因是对于DDR的软件开发主要是配置参数,而这些参数由芯片厂商已经提供好了。其实,要想对系统做深度的功耗优化和性能优化,是很有必要深挖DDR的组成与工作原理的细节。

    现在嵌入式系统设计或者计算机设计,考虑到存储性能、存储容量、成本等因素,通常采用存储金字塔式的设计,比如CPU后面紧接着寄存器,寄存器后面跟着cache,cache后面紧接着DDR,然后DDR后面跟着SSD、EMMC等非易失。通过利用程序的时间及空间局部性原理,可以在尽可能少的影响性能的前提下,增加存储容量,降低存储成本。

    随着CPU 发展,内存也发生了巨大的变革,DDR从诞生到现在已经经历了多代,分别是第一代SDR SDRAM(Single Data Rate SDRAM,同步型动态存储器),第二代的DDR SDRAM,第三代的DDR2 SDRAM,第四代的DDR3 SDRAM,现在已经发展到DDR5 SDRAM。为了实现容量增加和传输效能增加,规范的工作电压越来越低,DDR容量越来越大,IO的速度越来越高。

图片

历代ddr特性对比

  • Voltage(VDDQ):存储芯片的输出缓冲供电电压。

  • Device Width:颗粒位宽,常见为4/8/16bit。一个Memory Array中由行地址和列地址的交叉选中一个位,若2个Array叠加在一起,就同时选中了2个Bit,位宽是X2。若4个Array叠加到一起,就能够同时选中4个Bit,位宽则是X4。也就是说,对一个X4位宽的DDR 颗粒,如果给出行地址和列地址,就会同时输出4个Bit到DQ(数据输入、输出:双向数据总线)数据线上。

  • Die Density:颗粒密度,也就是容量,随着DDR迭代,容量越来越大。

  • Data rates:MT/s指每秒传输多少个数据(Mega-transfer per second),和时钟频率是两个不同的概念。DDR(dual data rate)是双边沿传输数据。因此MT/s是IO时钟频率的两倍。

  • Prefetch:在一个时钟周期中,同时将相邻列地址的数据一起取出来,并行取出DRAM数据,再由列地址0/1/2(DDR1使用列0,DDR2使用列0和列1,DDR3/DDR4使用列0,1和2)选择输出。2n/4n/8n。这里的数字指的就是并行取出的位数。这里的n,就是DQ位宽,即上面的device width(x4/x8/x16)。所以DDR3 16bit SDRAM内存颗粒,16bit指的是位宽,其一次读写访问的数据量是8*16=128bit

  • Bank:DDR4以前是没有Bank Group的,所以该值就表示整个颗粒中Bank数量。但是在DDR4和DDR5中,就表示每个Bank Group中Bank的数量,整个颗粒Bank数量 = Bank Group * Bank。

  • Bank Group:Bank分组数量,该特性只存在于DDR4和DDR5中。

  • Burst Length:指突发长度,突发是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度,在DDR SDRAM中指连续传输的周期数。一般对应预取bit数目。

  • Core frequency:颗粒核心频率,即内存cell阵列的工作频率,它读取数据到IO Buffer的频率。它是内存频率的基础,其他频率都是在该频率的基础上得出来的。

  • IO clk Frequency:内存的数据传输速率。它和内存的prefetch有关。对于DDR,一个时钟周期的上升沿和下降沿都在传输数据,即一个时钟周期传输2bit的数据,所以DDR的prefetch为2bit。对于DDR2,IO时钟频率是其核心频率的两倍,同时也是双沿传输数据,因此DDR2的prefetch为2×2bit=4bit。对于DDR3,IO时钟频率是其核心频率的四倍,同时也是双沿传输数据,因此DDR3的prefetch为4×2bit=8bit。

    DDR SDRAM是由威盛等公司提出的第二代SDRAM标准,主要它允许在时钟脉冲的上升沿和下降沿都能传输数据,这样不需要提高时钟频率就能实现双倍的SDRAM提速。DDR2 SDRAM是由电子设备工程联合委员会开的第三代SDRAM内存技术标准,相比上一代提供了更高运行效能(拥有两倍与上一代的预读取能力,4bit数据prefetch)和更低的电压(1.8v)。DDR3 SDRAM相比上一代,电压更低(1.5v),效能更高(支持8bit prefetch),只需133MHz就能实现1066MHz的总线频率。DDR4相比上一代,工作电压更低(1.2v),效能更高(16bit prefetch),同样的频率下,理论速度是上一代的两倍。

2, 框架

图片

DDR子系统框图

    DDR SDRAM子系统包含DDR controller、DDR PHY和DRAM存储颗粒三部分。我们分别看一下各部分的组成,然后讲述一下数据的读写过程。

2.1 DDR controller

    内存控制器负责初始化DRAM,并重排读写命令,以获得最大的DRAM带宽。它通过多端口与其他用户核进行连接,这些端口的类型包含AXI4/AXI3/AHB/CHI。每个端口有可配置的宽度、命令和数据FIFO。

    内存控制器接收来自于一个或者多个CPU、DSP、GPU的请求,这些请求使用的地址是逻辑地址,由仲裁器来决定这些请求的优先级,并将其放入内存控制器中。如果一个请求处于高优先级(赢得仲裁),会被映射到一个DRAM的物理地址并被转换为一个DRAM命令序列。这些命令序列被放置在内存控制器中的队列池(Queue pool)中,内存控制器会执行队列池中这些被挂起的命令,并将逻辑地址转化为物理地址,并由状态机输出符合DRAM访问协议的电信号,经由PHY驱动DRAM的物理IO口。

2.2 DDR PHY

    DDR PHY是连接DDR颗粒和DDR Controller的桥梁,它负责把DDR Controller发过来的数据转换成符合DDR协议的信号,并发送到DDR颗粒。相反地,它也负责把DRAM发送过来的数据转换成符合DFI(DDR PHY Interface)协议的信号并发送给内存控制器。DDR PHY和内存控制器统称为DDR IP,他们保证了SoC和DRAM之间的数据传输。

    目前在DDR IP的市场上,国际厂商占据较高的市场份额,而国内IP企业占比很小,究其原因,主要是由于DDR PHY具有较高的技术门槛,要在这类PHY上实现突破并不容易。DDR PHY是一个系统工程,在如下方面需要着重关注:

2.3 DDR DRAM颗粒

    从DDR PHY到内存颗粒的层次关系如下:channel->DIMM->rank->chip->bank->row/column组成的memory array。例如,i7 CPU 支持两个Channel(双通道),每个Channel上可以插2个DIMM(dual inline memory module,双列直插式存储模块),每个DIMM由2个rank构成,8个chip组成一个rank。由于现在多数芯片的位宽是8bit,而CPU的位宽是64bit,因此经常是8个芯片可以组成一个rank。

3, DRAM剖析

    接下来深入的剖析一下DRAM的组成及工作原理。对于DRAM的原理,看到一篇很不错的文章《深入内存/主存:解剖DRAM存储器 - 知乎 (zhihu.com)》,以下内容基本上来自于这篇文章。

3.1 基本结构

1)DRAM的基本单元

    基本的DRAM单元(cell),是一个电容加一个CMOS晶体管组成的电路。通过给晶体管最上面的一端(称作栅极)加上电压或是取消电压,就可以控制CMOS晶体管的开、关。一旦打开就可以读出电容上存储的电量,或者向电容写入电量。这样电容上的电荷有无就对应着存储1bit的1或0。

图片

DRAM cell

    为了存储更多的bit,可以用如上的DRAM单元组成存储阵列。行对应的是word line,即字线。列对应的是bit line,即位线。当某一行的字线上通电后,这一行的cell上的电容就会经过位线进行充放电。通过读取位线上的电压变化,就能判断存储的是0,还是1。由于电容很小,打开字线后产生的电压波动也很小,所以在读取的时候,要经过sense amplifier进行放大。

    每个位线都接在一个放大器上,由于每个cell的电容太小了,在读某一bit前,先对bit line进行precharge。预充的电压为工作电压的一半。这样在打开字线后,位线上的轻微变化也能被放大器捕捉到,并在本地还原、暂存字线对应整行cell的电压。其实,当读了位线(电容放电)后,电容上的电荷就会发生了改变,这是一种破坏性读出。为了解决这个问题,就需要放大器在读取cell存储的数据后,利用暂存的cell电压写回字线单元行。

图片

cell存储阵列

2)DRAM刷新

    由于cell的电容很小,并且CMOS晶体管在关闭的时候,也存在漏电,这样电容上的电荷也在随着时间的变化,逐渐变少。时间一长,存储的信息就会丢失。为了解决这一问题,具体做法是对于每个单元行,每过一段时间就自主地进行读取,等放大器暂存好信息后就立刻将其写回行。关于单元行的刷新时机也很有讲究,一般每64ms内就要对cell阵列进行一次全面刷新。

3.2 DRAM的读写

图片

cell阵列+外围逻辑

1) DRAM读过程

    在读取DRAM芯片上单个比特数据时:

2) DRAM写过程

    写过程和读过程比较类似,就不详细描述,主要描述有差异的地方:

    总的来说,读取一个比特的总体过程:获得行号,译码行号,开启单元行,放大位线电压波动并暂存数据到放大器,获得列号并根据列号选择一位进行输出,写回数据,关闭字线,重新预充电。写一个比特的总体过程是:获得行号,译码行号,开启单元行,放大位线电压波动并暂存数据到放大器,获得列号并输入写入数据,根据列号把写入数据送到放大器并改写暂存值,写回数据,关闭字线,重新预充电。

    你可能会疑问,要访问的一个字节的其他7bit是不是也存在这些单元行里,答案是否定的。其实,还存在7个这样的bit存储阵列,其中相同的行列地址在这7个bit存储阵列相同位置取出相应的bit,这样便得到了完整的8bit(一个字节)数据。

    另外,在读写过程中,时间主要消耗在“开启单元行”与“放大电压波动并暂存数据”。单元行的栅极可以抽象成一个个电容的并联,因此字线的拉高就是给这么多电容充电的一个过程,这将是很耗时及耗电的。由于放大器大部分是模拟电路,所以他的工作也不快。那么怎么提高DRAM的读写速度呢?关键点在放大器的缓存区(row buffer),它缓存了单元行,但是一般我们只取出了其中的一个bit。如果要想提升速写速度,那就还访问这个单元行的其他bit,这时会直接从row buffer中取出相应的数据,不需要经历开启单元行、放大、读写数、写回的耗时过程。

3.3 DRAM系统层次

    DRAM的系统层次如下:channel->DIMM->rank->chip->bank->row/column组成的memory array->存储cell。

1)bank

    如下是一个8阵列bank。其中每个rank中的行列定位到的小方块,是一个cell,对应一个bit。行、列组成了一个memory array,即一个bank。8个bank组成了8 bank的阵列,通过行、列地址可以得到8 bit的输出。

图片

8阵列bank

    一个8阵列bank一次读写8个比特,一颗存储芯片上一般含有多个bank。下图是一颗含有8个bank的存储芯片的示意图。芯片每次读写都只针对一个bank,因此读写地址必须包含一个bank号,bank号用于开启目标bank,目标bank之外的bank是不工作的。

图片

包含8个8阵列bank的存储芯片

2)Rank和DIMM

    电脑用的内存芯片都嵌在一个电路板上,把这个电路板插入内存插槽后,就可增加电脑内存。电路板和板上的芯片,就是所谓的内存条,也称为DIMM条。内存条通过“内存通道”连接到内存控制器,一组可以被一个内存通道同时访问的芯片称作一个rank。一个rank中的每个芯片,都共用内存通道提供的地址线、控制线和数据线,同时每个芯片都提供一组输出线,这些输出线组合起来就是内存条的输出线。

    对于一个包含8颗芯片的DIMM条。这8颗芯片被一个内存通道同时访问,所以它们合称为一个rank。有的DIMM条有两面,即两面都有内存芯片,这种DIMM条拥有两个rank。

    若每个芯片都包含8个bank,每个bank都包含8个阵列,那么这条内存条就可以一次读写8×8=64比特,其中第一个8是指每个芯片输出8位,第二个8是指这个rank总共有8颗芯片,因为这8颗芯片被同一个内存通道访问,所以其被访问的bank和bank内的行地址、列地址都是完全一致的。下图是一个描述这个过程的简图:显然,我们在读写8颗芯片同一个bank同一个位置的cell。注意,图中没有显示不在工作状态的bank。对一个rank读写,即同时读写rank内8个存储芯片内的同一位置的bank。

图片

rank读写

    电脑有时候可以插入多个内存条,多个内存条有助于提升电脑的内存容量,但是未必能提高电脑的速度。电脑的速度受“内存通道”数限制,如果电脑有四个插槽,却只有一个内存通道,那么CPU仍然只能一次访问一个rank。但如果电脑有四个插槽的同时还有四个内存通道,那么CPU就可以一次访问四个rank,很显然,四并行访问明显比串行访问快,假设每个rank可以输出64比特,那么四通道就可以一次访问4×64=256比特,而单通道只能访问64比特。

3.4 DRAM访问加速

1)burst模式

    由于现在的处理器,CPU与DDR之间基本上都有cache,CPU在访问内存单个字的时候,不仅需要访问这个字,还需要把这个字所在的缓存行全部搬进cache中,因此内存不仅要一次提供一个字,还要提供一个缓存行(cache line)。缓存行一般比较大,比如8个64比特,因此内存要一次提供8×64=512比特数据。但如果前面介绍的方式访问内存,那么一次只能提取出64比特,即提取一个字,这并不满足缓存行的要求。为此,我们提出对内存使用“burst模式”。

    由于缓存行内的各个字在内存上是紧邻的,我们就可以灵活地使用cell阵列中的行缓存(row buffer)。前面说到单元行进入放大器的行缓存之后,并不会在读写一个比特后立刻写回cell阵列,而是待在行缓存里等待下一个读写命令。如果下一个读写命令仍然发生在该单元行,那就可以行命中,直接操作row buffer。

    在burst模式里,每当我们读取cell阵列中的一个比特,不仅把这个比特送到输出缓存中,而且紧接着把这个比特所在缓存行的各个比特都送到输出缓存,这样就完成了一次burst,即把目标比特周围的多个比特连续地读出。

2)bank并行和内存交错

    前面我们比较详细地聊了在一个cell阵列中读取数据的过程,而CPU在访问内存时,还需要一些别的操作。总的来说,CPU访存大概要经过5个步骤:

1, CPU发送指令给内存控制器。

2, 内存控制器解析指令,并把“解析到的控制信息”发送到控制总线。

3, bank接收控制信息,并读取数据。

4, 内存芯片把读取出的数据放到数据总线。

5, 内存控制器收取数据,并将其交给CPU。

    如果CPU连续访问同一bank,那么CPU、内存控制器、总线和bank就必须串行操作,串行操作会让访存效率下降。我们假设CPU不可以在一个bank工作时,再给它发送新的指令。如果CPU连续不断地给一个bank发送指令,那么很可能前一个指令还没完成,后一个指令就改变了bank内的row buffer、列地址缓存或输出缓冲。

    为了说明cpu访存过程中带来的时间消耗和造成的效率下降,下面以“总线延迟”为例:

    光速是3×10^8m/s,而高性能CPU的频率可达3GHz,即3×10^9Hz。那么在CPU的一个时钟周期内,光可以运动10cm。但是电在硅中的传播距离大约是光的五分之一,经过测量,在电子线路中 电在一个CPU时钟周期内只能运动20mm左右。而CPU和内存芯片之间的距离远不止20mm,因此数据在总线上移动需要花费多个CPU时钟周期。

    上面的计算说明,在CPU访存的5个步骤中,第2、第4步是要花很多时间的,而没有详细讨论的第1、第5步,大概率比这两步还要慢。因此让CPU、内存控制器、总线和bank串行操作是不明智的。实际上,我们完全可以在一个bank进行第3步时,让CPU、内存控制器、总线去操作新的bank,以此隐藏起它们的工作时间,从而营造起一种CPU、内存控制器和总线不需要消耗时间的假象。上面这种做法实现了“bank间并行”。

    所谓在“bank间并行”就是让一个chip内的不同bank并行工作,让它们各干各的。为此CPU要连续、依次向不同的bank发送读取指令,这样在同一时间很多bank都在工作,第一个bank可能在输出,第二个bank可能在放大电压,第三个bank可能在开启单元行。当第一个bank burst输出完毕,第二个bank刚好可以输出。当第二个bank burst输出完毕,第三个bank刚好可以输出.......通过这样让“bank读取”和“CPU、内存控制器、总线工作”在时间上相互重叠的方式,我们可以成功地把CPU、内存控制器和总线的工作时间隐藏起来,从而打造出一种CPU无延迟访问内存、多个bank连续、依次“泵”出数据的理想情况。这种通过“bank间并行”实现“连续泵出数据”的方法,就是所谓的“内存交错”。

    内存交错不仅隐藏了CPU、内存控制器和总线的工作时间,还隐藏了对单个bank而言row缺失所造成的多余访问时间(所谓“多余”是相对“row 命中”情况而言的),连续两次对同一个bank的访问,它们访问的row相同或者不同,对延迟的影响是相当显著的。

    如果第二个命令是对同一个row访问,那么memory controller只需要发出Rd/Wr读写命令即可,称为行命中。如果第二个命令是对不同的row进行访问,那么memory controller需要发出PRE,ACT,Rd/Wr命令序列,称为行缺失。从命令序列的对比来看,可以看出行缺失的情形对性能的影响是糟糕的。下图显示了连续的行缺失的情形下的访存序列:

图片

行缺失的访问序列

    然而,如果我们有多个bank,然后将 A0,A1,A2...的访存序列,通过memory controller的address interleaving, 映射到多个bank上,也就是所谓banking。避免了连续访问同一个bank的不同row,造成的大量行缺失,就能够得到下面的访存序列:

图片

流水线化的访问序列

    显然,上图中的类似流水化的访问能够很大程度上掩盖访问DRAM的访存延迟,这也就是banking能够提高memory throughput的原因。

    另外,memory controller的address interleaving是什么呢?

    我们都知道在OS层面,有着从virtual address到physical address的地址映射。类似地,在memory controller层面,我们需要将physical address映射为对DRAM chip中具体的位置的访问,通过将bank映射到物理地址的相对低位(相对于row),可以使得对连续地址的访存请求被映射到不同的bank。

图片

物理地址的bank映射

参考资料:

认识内存频率(全文) (wenmi.com)

(31条消息) 一步一步带你理解DDR基本原理_百里杨的博客-CSDN博客_csdn 百里杨

(31条消息) DDR扫盲—-关于Prefetch(预取)与Burst(突发)的深入讨论_qq_25814297-npl的博客-CSDN博客_prefetch ddr

(31条消息) DDR工作原理-DQ和DQS信号的处理_爱的si念的博客-CSDN博客_dq dqs

DDR3 Prefetch和Burst的联系及区别 (ngui.cc)

DDR -- 基础知识 - 知乎 (zhihu.com)

深入内存/主存:解剖DRAM存储器 - 知乎 (zhihu.com)

(31条消息) DDR基础原理介绍_普通网友的博客-CSDN博客_ddr原理

(31条消息) DDR控制器_Kyph的博客-CSDN博客_ddr控制器

(31条消息) ddr控制器随笔_flaoter的博客-CSDN博客_ddr控制器是啥

(33 条消息) 为什么banking能提高memory throughput? - 知乎 (zhihu.com)

  • Arbitration CMD priority:仲裁器,仲裁CMD的优先级。会对来自各端口的请求进行仲裁,并将请求发送给控制器,仲裁其从端口收到的每个事务,每个事务都有一个相对应的优先级。端口仲裁逻辑会根据优先级进行处理,从而确定如何向控制器发出请求。以Cadence Denali内存控制器为例,它有几种仲裁策略:

  • Round Robin:每个端口对应一个独立的计数器,当端口上有请求被接受的时候,计数器就会增加,然后仲裁器会针对计数器非0的端口的请求进行轮流仲裁,每仲裁执行一次,相应端口的计数器减一,直到端口接受请求计数器变为0。

  • 带宽分配/优先级轮流操作:结合轮流操作、优先级、带宽和端口带宽保持等,根据用户分配的命令优先级,将传入的命令按优先级分组。在每个优先级组内,仲裁器评估请求的端口、命令队列和请求的优先级,从而确定优先级。当控制器繁忙时,超过其带宽分配的端口,可能会接受较低的优先级服务。

  • 加权优先级循环:是一种面向服务质量的算法,结合了循环操作、优先级、相对优先级、端口排序的功能。根据命令的优先级或该类型命令的相关端口的优先级,将传入的命令分成优先级组。具有较高权重的端口可能会更频繁的接受仲裁,从而更容易被运行到。

  • DDR SDRAM Control:DDR SDRAM的控制。包含了一个命令队列,接受来自仲裁器的命令。该命令队列使用一个重排算法来决定命令的放置顺序。重排逻辑遵循一些规则,通过考虑地址碰撞、源碰撞、数据碰撞、命令类型和优先级,来确定命令插入到命令队列的位置。重排逻辑还通过命令分组和bank分割,来提高控制器的效率。当命令进入命令队列后,选择逻辑扫描命令队列中的命令进行运行。若较高优先级的命令还没有准备好运行,较低优先级的命令不与命令队列中排在前面的命令冲突,那么这个较低优先级的命令,可以先于该没准备好的高优先级命令运行。此外,控制器还包含一个仲裁块,支持软件可编程接口、外部引脚及计数器的低功耗控制。另外,控制器支持调频功能,用户可以通过操作寄存器组,调整ddr的工作频率。

  • Transaction Processing:事务处理用于处理命令队列中的命令。该逻辑会重排命令,使DRAM的读写带宽吞吐最大化。

    • DDR PHY的数据传输采用并行多位、单端突发的传输模式,对电源完整性PI(Power Integrity,电源完整性)和信号完整性SI (Signal Integrity,信号完整性)的要求很高。

    • 为了能够补偿不确定的延时,针对不同信号,DDR PHY有个灵活配置的延时电路及对应的辅助逻辑,这些延时电路可能会随着电压及温度变化而变化。因此PHY针对这些电路要有校准(Training),可以说DDR PHY是对Training要求最多的接口。

    • Channel:简单理解一个通道对应一个DDR控制器,每个通道拥有一组地址线、控制线和数据线。

    • DIMM:是主板上的一个内存插槽,一个channel可以包含多个DIMM。

    • Rank:一组可以被一个内存通道同时访问的芯片组合称作一个rank,一个rank中的每个芯片都共用内存通道提供的地址线、控制线和数据线,同时每个芯片都提供一组输出线,这些输出线组合起来就是内存条的输出线。简单来说rank是一组内存芯片集合,当芯片位宽*芯片数=64bit(内存总位宽)时,这些芯片组成一个Rank,存储64bit的数据。一般每个芯片位宽是8bit,然后内存条每面8个芯片,那么每面就构成了一个Rank,这两面的Rank通过一根地址线来区分当前要访问的是哪一面。同一个Rank中所有的芯片协作来读取一个地址(1个Rank,8个芯片*8bit=64bit),这个地址的不同bit,每8个一组分散在这个Rank上的不同芯片上。设计Rank的原因是为了减少每个芯片的位宽(在CPU总位宽确定的前提下,比如64bit),降低复杂度。

    • Chip:是内存条上的一个芯片,由多个bank组成,大多数是4bit/8bit/16bit,多个chip做成一个rank,配合完成一次访问的位宽。

    • Bank:是一个逻辑上的概念。一个bank可以分散到多个chip上,一个chip也可以包含多个bank。

    • Row、Column组成的memory array:可以简单的理解bank为一个二维bit类型的数组。每个bank对应一个bit,8个bank组成8bit的数据。

    • 读取前,先给各条位线预充电(也称为precharge),即把位线电压拉高到供电电压的一半。拉高到一半的目的是和cell电容电压形成电压差,从而在打开单元行时,可利用电容的微弱充放电产生电压波动。预充电完成后,就可以断开位线与预充电电源的连接,此时位线处于悬空态,电压会保持为供电电压的一半。

    • 开始读取,首先在地址总线上输入行地址,稍后立刻置“行地址选通”(即RAS)有效,置RAS有效后,DRAM芯片就把行地址缓存下来。

    • 缓存好行地址之后,就把行地址送入译码模块,译码模块把行地址译码成独热码,独热码的每一位都接到对应的字线,然后把其中一条字线的电压值拉高。

    • 把地址线上的地址从行地址转换成列地址,转换成列地址之后,外界会置“列地址选通”有效,然后DRAM会把列地址缓存起来。

    • 拉高的字线所对应的单元行被打开,即单元行的所有晶体管导通,单元行的各个cell电容和位线连通。如果cell保存比特信息1,即cell电容的电压等于供电电压,此时cell电容电压高于位线电压,电容放电,位线的电压稍稍上升。如果cell保存比特信息0,即cell电容的电压等于地电压,即0电压,此时位线电压高于cell电容电压,位线向cell电容充电,位线电压稍稍下降。

    • 放大器捕捉位线上的微弱电压波动,通过“差分感测”在本地生成并暂存cell电容电压。如果cell电容等于供电电压,那么位线电压稍稍上升,放大器比较此位线和另一条基准线的电压,通过模拟电路的反馈来放大两者的电压差,最终在本地生成一个等于供电电压的输出电压,并用锁存器把输出电压锁存下来。如果cell电容电压等于0,放大器最终生成等于0的输出电压,并用锁存器把0电压锁存下来。

    • 放大器锁存好行数据之后,把行数据送往多到一选择器。

    • 列地址缓存就把列地址送到多到一选择器,多到一选择器根据列地址,把单元行中的某一位送到输出线。

    • 输出之后,还需要把放大器的数据写回到单元行,即根据放大器的锁存值,把位线拉高到供电电压或是0电压,位线向cell电容充放电,充放电结束之后,就可以关闭字线。

    • 写回数据并关闭字线之后,连接位线和预充电电源,给位线预充电到供电电压的一半,为下一次读写做好准备。

    • 位线预充电到供电电压的一半。

    • 输入、缓存行地址,译码行地址,开通单元行,开通单元行后位线产生电压波动,放大器捕捉电压波动并还原、暂存行数据到本地。

    • 输入、缓存列地址,与此同时置写使能有效,并在Data Buffer存进写入比特,注意,Data Buffer在读取DRAM时用来暂存输出比特,而在写DRAM时则用来暂存写入比特。

    • 把写入比特送到一到多分配器,分配器根据列地址把写入比特送到对应的放大器中,放大器根据写入比特改写本地暂存值。

    • 放大器根据暂存的电压值刷新单元行,刷新完毕后断开单元行的字线。

    • 刷新完毕后,重新给位线预充电,为下一次读写做好准备。

图解RAM结构与原理,系统内存的Channel、Chip与Bank

文章目录

本文转载来自:

其它内容参考:

个人理解的几点,先记录在这。

  • DDR,全称Double Data Rate,双数据速率。即上下时钟沿采样。
  • 双通道,是指两个channel,每个channel有单独控制器。比如SOC/CPU的ddr接口是64bit位宽,两个channel都是32bit位宽即可。因为依赖channel独立DDR控制器,可以并行采样,互不干扰,所以能达到双倍DDR位宽效果。台式机都是采用双通道DDR。
  • 为什么SOC不用双通道DDR技术?个人理解,管脚多了,布线复杂,功耗也会上去。没有便携,小型化需求,成本比重等考虑是可以用双通道的。
  • 本文没说DIMM和rank的区别。DIMM是插槽技术,rank是指8个chip芯片颗粒组合而成,与CPU/SOC DDR位宽保持一致的。

转载正文

bank、rank、channel这些关于内存的名词是否已困绕许久,疑似了解却又说不出个所以然来。 就让我们一步步拆解内存的面纱,从架构到读写方式逐步揭开内存的秘密。

标题挥发性内存分2种,SRAM和DRAM

RAM(Ramdom Access Memory)随机存取内存,之所以称作「随机存取」,是因为相较于早期的线性储存媒体(磁带)而言,因为磁带的存取是线性的,存取时间会依目前磁带位置和欲存取位置的距离而定,需转动磁带至应有的位置,距离越长、转得越久、存取时间也就越久。 而 RAM 没有这种烦恼,存取时间为固定值,不会因为数据在内存的位置而影响存取时间。

而 RAM 在电脑里又可大致上分为 2 种:SRAM 和 DRAM,两者的基础原理差不多,都是将电荷储存至内部,藉由改变不同的电荷储存 0 或是 1。 SRAM(Static Random Access Memory)静态随机存取内存和DRAM(Dynamic Random Access Memory)有着几点不同,SRAM的结构较复杂、单位面积的容量较少、存取速度快,DRAM则是构造简单、单位面积内的容量较多、存取时间较SRAM慢,同时DRAM也因为构造较简单的关系, 储存的电荷会随着时间渐渐消失,因此需要有个再充电(Refresh)的动作保持电容储存的数据。
SRAM 单一位储存区的构造
▲SRAM 单一位储存区的构造

在这里插入图片描述
▲DRAM 单一位储存区的构造。

由图中SRAM和DRAM构造可得知,SRAM采用正反器(flip-flop)构造储存,DRAM则是采用电容储存。 因为 SRAM 和 DRAM 种种的特性不同,SRAM 适合作为暂存器和 CPU 缓取使用,DRAM 则是适合做为主内存或是其他设备间的快取使用。

挥发与非挥发性内存
挥发性存储器(Volatile Memory)和非挥发性内存(Non-Volatile Memory)之间的差异在于,断电之后是否可保存内部资料,挥发性存储器的数据会随着失去电力供应而消失,而非挥发性内存依然可以保有内部资料。

挥发性内存包含了SRAM和DRAM,而非挥发性内存包含ROM(Read-Only Memory)和Flash Memory闪存。

主内存子系统

DRAM 由于制造简单、高密度,作为电脑内部的主内存再适合不过了。 但是由于主内存摆放在CPU之外,从工厂出来的晶粒需要封装和组合之后才可和CPU连结,因此从CPU至DRAM晶粒之间依据层级由大至小为channel>DIMM>rank>chip>bank>row/column,接下来就一一说明这些部分。
在这里插入图片描述
▲主内存由大至小,由上往下可做这样的拆分。
在这里插入图片描述
▲主内存从 channel 至 chip 的相对应关系。
在这里插入图片描述
▲chip 往下拆分为 bank。
在这里插入图片描述
▲bank 往下拆就是 1 个个的储存单元,横向 1 排称之为 row,直向 1 排称之为 column,每排 column 的下方都有个 row buffer,用以暂存读出来的 row 排资料。

在这里插入图片描述
▲单一 DRAM 芯片的内部功能区块图(图片取自Micron)。

channel 和 DIMM

从内存控制器出来之后,最先遇到的就是 channel,每个 channel 需要配有 1 组内存控制器、2 个 channel 配置 2 组… 以此类推。 而每个 channel 中能够拥有许多组 DIMM(Dual In-line Memory Module),DIMM 也就是目前使用者能够在市场上买到的内存模块,因为多年前的主板必须购买内存颗粒(chip)直接插在主板上,而后发展出 SIMM(Single In-line Memory Module),将多组内存颗粒焊在 1 片电路板上, 成为内存模块,再将此电路板插在主板上。 接着为了增加数据吞吐量,将 1 条内存模块的带宽从 SIMM 的 32bit 改换成 DIMM 的 64bit,这设计依然沿用至今。

从内存颗粒过度到 SIMM 的时代,坊间出现了替用户将内存颗粒焊到 SIMM 电路板上的服务,因为当时内存非常昂贵,花一些小钱就可以把内存延用至新的电脑上。

rank 和 chip

rank 指的是链接到同 1 个CS(Chip Select)的内存颗粒 chip,内存控制器能够对同 1 rank 的 chip 进行读写操作,而在同 1 rank 的 chip 也分享同样的控制信号。 以目前的电脑来说,因为 1 组 channel 的宽度为 64bit,所以能够同时读写 8byte 的数据,如果是具有 ECC 功能的内存控制器和 ECC 内存模块,那么 1 组 channel 的宽度就是 72bit。

在这里插入图片描述
▲rank 1 和 rank 2 共享同组 address/comand 讯号线,利用 chip select 线选择欲读取或是写入的那一组,之后将资料经由 MUX 多工器送出。

有些人会有错误观念,以 chip 的数量或是以内存模块的单、双面进行 rank 的判断,但其实要以内存控制器和内存颗粒的规格进行判断,目前家用 PC 的内存控制器通道绝大部分都是 64bit 宽,内存颗粒则是 8bit 宽,因此 8 颗并联即可满足内存控制器的需求,也就是 1 组 rank。 但偶尔也有以 16bit 宽的内存颗粒制成的内存模块,此时 4 个 chip 就是 1 组 rank。

这在采用Intel H61/H81芯片组和传统单channel的主板时须特别注意,因为Intel限制H61/H81每个 channel仅能支持2组 rank,而不是4组 rank,部分主板每个 channel 又 做了 2 组内存模块插槽,造成部分用户同组 channel 放入 2 条内存模块时能够识别全部的内存容量(双面单 rank 的内存模块),部分用户则是仅能识别一半的容量(双面双 rank 的内存模块)。

bank、row、column

bank 再往下分拆就是实际储存位元的电路,一般来说横向选择排数的线路称为 row(row enable、row select、word line),直向负责传递讯号的线路为column(bitline),每组 bank 的下方还会有个 row buffer(sense amplifier),负责将独出的 row 资料暂存,等待 column 地址送到后输出正确的位,以及判断储存的数据是 0 还是 1。
在这里插入图片描述
▲1 个 bank 的读取操作。
在这里插入图片描述
▲1 个 bank 的写入操作。

内存的读写方式

上图标明了内存的读写方式,读取时首先内存控制器会将 1 组地址由地址线传到内存上,控制线跟着传送控制信号;如果是多 rank 的安装情形,CS 也会送出对应的讯号选择目标 rank。 接着由于每个 rank 由许多 chip 组成,1 个 chip 仅负责部分的数据读取,chip 接收到地址信号后,将地址丢入内部的 row/column 解码器找出相对应的 bank 地址(每家每 款产品的内部 bank 组合有可能不同,因此对应也会有所不同),接着开启 row 线,同 1 排 row 的内部数据就会流到 row buffer 内部,row buffer 判断信号为 0 或是 1 之后就输出数据。

写入时除了地址资料外,还会传送欲写入的资料至芯片内部的 input buffer,同样的也是依照 row/column 解码器找出对应位置之后写入。
在这里插入图片描述
▲内存控制器和 DIMM 之间线路的关系。

越多越好,加速读写能力

家用计算机的内存控制器已经进入双通道内存控制器多年,加速原理为增加数据总线宽度,达到同时读写更多数据的能力。

另一种增加带宽的方法就是减少延迟,利用多个 chip 或是 bank 达成。 一般的内存读取延迟为命令下达+内存读取延迟+输出数据,如果命令下达延迟为 2ns、内存读取延迟为 10ns、输出数据延迟为 2ns,那么读取 2 笔资料的总延迟就会是(2+10+2)×2=24ns。

如果现在能够将数据拆分至2颗内存上,那么2笔读取延迟将降低至16ns,因为不需等到前笔资料读取完成才发出下一笔的读取命令,在第一笔数据进入内存读取时即可发出。 这种概念也可应用到目前最夯的SSD上,较多CE(Chip Enable)封装的闪存芯片,通常都比较少CE封装的芯片来得快。

在这里插入图片描述
▲由时序图可得知,下方此种尽量分拆内存空间的作法,可大幅减少延迟。

【DRAM】DRAM基本结构与原理

半导体设备与材料 半导体设备与材料 2021年03月07日 00:05

DRAM(Dynamic Random Access Memory),即动态随机存储器,也就是我们常说的计算机内存,在现代计算机系统和SOC系统中有很重要的作用。本文主要对DRAM中的一些基本原理进行总结,目的是为了更好理解DDRC(Double Data Rata DRAM controller)中的时序关系与时序参数。

图片

一、DRAM基本电路结构

1.1基本存储单元cell

1.1.1 3T1C与1T1C

DRAM基本电路结构如图所示:

图片

图中的基本结构单元是1T1C1 Transistor -1 Capacitor)。其工作的大致原理是:当Word Line选通时,晶体管导通,从而可以从Bit Line上读取存储在电容器上的位信息。

而在早期的DRAM中的基本结构却不是这样的,而是3T1C3 Transistor -1 Capacitor)如下图所示:

图片

使用三个晶体管作为开关,这样设计的优点是:当读取存储在电容上的位信息时,不会影响电容上的电荷,从而读后不需要对单元进行precharge。关于precharge的原理在下文会有详细介绍,这里我们只要了解3T1C的结构读存储器不会破坏其存储在DRAM中的信息。但是由于1T1C的结构比3T1C的结构面积节省很多,因此现代DRAM中常用的还是1T1C结构。

此外由DRAM基本电路结构图,我们可以知道DRAM的信息是存储在在电容当中,而电容中的电荷会因为漏电流存在原因而逐渐漏掉,因此需要不断refresh(刷新),这也是DRAM称为动态的原因。例如,90nm工艺下,DRAM的cell单元的电容量是30pf,它的漏电流是1fA,漏光的时间是随着温度的变化而变化的。现在的DRAM的刷新时间一般是32ms或者64ms。

1.1.2 堆电容(Stacked Capacitor)与沟电容(Trench Capacitor

下面我们从更底层来了解DRAM存储电容,关于存储电容在现代业界也没有统一,仍然存在两大阵营,分别是堆电容(Stacked Capacitor)与沟电容(Trench Capacitor),像三星这样的大公司使用是前者。因为这两种电容在任何DRAM中都是存在的而且是需要考虑到的,下面我们来分别介绍一下这两种电容。

两种电容原理图如下所示:

图片

图片

如上图所示:trench电容是存在于深入到硅下面的,而stacked电容是存在于不同的多晶硅层中间。这两种电容分别有自己的优缺点:

trench电容是深入到硅下面的,相当于从二维到三维的拓展,可以保证在相同的电荷容量下,面积小,成本低,由于其表面平坦更易制造,使它更易集成到逻辑优化工艺技术里(这里我认为就是通用的电路设计里)。由于深入到硅下面的,在上层的逻辑电路结构形成之前就存在,与上层无电路关,有利于电路优化。

关于stacked电容,由于是存在不同的多晶硅层之间的,因此bitline与多晶硅之间也会存在电容,且这种电容属于stacked 电容,如下图所示。

图片

由于每个Bitline上连着很多并联的Bitline Capacitor,因此存储电容大小远比Bitline 电容小,大约只有1/10。所以当transistor选同时,存储在存储电容上的电荷传输到Bitline时,Bitline上的电压变化很小,需要使用差分比较放大器(此差分比较放大器非模拟集成电路中的差放,而是通过跟参考电压作对比)。

1.2感应放大器

1.2.1 Open BitlineFolded Bitline

差分比较放大器需要使用一对Bitline来感知DRAM中的信息,而且要保证用来做对比的两个Bitline在电压与电容值上是相互匹配的,所以他们的走线长度与连接的cell数(也就是并联的Bitline 电容数)必须非常接近。有两种常用的选择方法:

  • Open bitlines:差分比较器的两个输入是来自两个不同的array

  • Folded bitlines:差分比较器的两个输入是来自两个相同的array

两种方式的原理图,如下图所示:

图片

图片

Open Bitlines结构占用的面积比Folded Bitlines结构小,因为一个array只需要输出一个bitline,而后者需要输出两个bitline到比较器。但是Open Bitlines结构存在缺点:

  • 需要在DRAM的边界上使用假(dummyarray,为了满足bitlines pairs在长度和电容上都是匹配的要求;

  • 因为bitlines是来自不同的array,所以其受到噪声影响更大。

在现代DRAM中Open Bitlines结构几乎不用了,但随着工艺的发展,理论上Open Bitlines的优点更大。

1.2.2 差分感应放大器

A. 作用

1)将bitline上的微小电压变化放大,并转化成数字信号。

2)将被读的bit位所在的那一行基本单元cell的值重新存入cell,因为在transistor打开时,存储在存储电容中的电荷将于bitline共享了,存储在存储电容中的电荷变少了,因此需要将值再次存入cell(无论该bit是否被读,只要是同一行的都需要进行该步操作)。

3)临时存储器的作用,临时存储bitline上的值。

B. 电路结构

图片

整个电路结构如上图所示,具体信号与电路说明见下文的DRAM读写操作分析。

二、DRAM读写操作

DRAM读操作主要分为四种操作:prechargeaccesssenserestore。具体操作如下:

Ø Precharge

EQ电路,通过EQ信号使能将bitline上电压变为Vref通常为Vcc/2。

图片

Ø Access

Wordline信号选通transistor,使得bitline上电压发生微小变化,使得PFet与NFet的传导性不同。

图片

Ø Sense

由于上下电路的传导性不同,sense电路使低电压更低,直至变为“0”;使高电压更高,直至变为“1”。

图片

Ø  Restore

Bitline上的高、低电平可以通过transistor给存储电容充电,且对于读DRAM操作,CSL有效,WE无效,因此bitline上的高低电平可以传输到output上。

图片

对于写DRAM操作,WE有效,input信号可以通过如下图所示的通路给存储电容充放电。

图片

这里我们看到了两根bitline线,若一个列数为512的DRAM确实有1024根bitline线,只是对于奇数行与偶数行所选通的cell是不同列的(这里的类是下图左中列,而在实际电路中它们的列是相同的),但是输出还是512根线。

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值