一、DDR简介
DDR SDRAM(Double Data Rate Synchronous DYNAMIC RAM)中文名是:双倍数据速率同步动态随机存储器。
传统的SDRAM只在时钟信号的上升沿传输数据,而DDR可以同时在时钟的上升沿和下降沿传输数据,因此在同样的时钟频率下,DDR内存的传输速率是SDRAM的两倍。这就是“Double Data Rate”(双倍数据速率)的含义。所谓同步指的是DDR是同步内存的一种,同步内存与系统时钟信号保持同步。动态是指DDR中的数据断电后无法存储,且需要周期性刷新。所谓随机存取,代表用户可以随机操作任意地址的数据。
版本 | 发行年份 | 电压 (V) | 数据速率 (MHz) | 带宽 (MB/s) | 引脚数量 (DIMM) | 特点 |
DDR1 | 2000 | 2.5 | 200 - 400 | 1600 - 3200 | 184 | DDR1是第一代双倍数据速率内存。它通过双边缘的数据传输,提供了比传统SDRAM快一倍的传输速率。 |
DDR2 | 2003 | 1.8 | 400 - 800 | 3200 - 6400 | 240 | DDR2进一步提高了数据速率,优化了信号传输,支持更高的时钟频率,并通过降低电压实现了更好的功耗控制。 |
DDR3 | 2007 | 1.5 | 800 - 1600 | 6400 - 12800 | 240 | DDR3提供了更高的频率和带宽,并支持更大的内存模块容量。与DDR2相比,DDR3在性能和能效上都有显著提升。 |
DDR4 | 2014 | 1.2 | 1600 - 3200 | 12800 - 25600 | 288 | DDR4在能效、数据速率和容量方面有显著提高,能够支持更大的内存模块。它的时钟频率更高,延迟优化,满足了当代计算机和服务器对高带宽的需求。 |
DDR5 | 2020 | 1.1 | 3200 - 6400 | 25600 - 51200 | 288 | DDR5在数据速率、带宽和效率上都有极大的提升,尤其适合高性能计算、AI、大数据等对内存有极高需求的应用。DDR5还引入了更智能的电源管理和更高的能效优化。 |
二、内存原理
对于一块内存条来说,它是由很多部分构成的,其中最重要的部分就是内存颗粒。
从内存控制器到内存颗粒内部逻辑,笼统上讲从大到小为:channel>DIMM>rank>chip>bank>row/column,如下图:
我们举一个现实的例子来介绍这部分内容, 一个i7 CPU支持两个Channel(双通道),每个Channel上可以插俩个DIMM(这里可以直接理解成内存条),而每个DIMM由两个Rank(Physical Bank)构成,8个chip组成一个Rank。由于现在多数内存颗粒的位宽是8bit,而CPU带宽是64bit,所以经常是8个颗粒可以组成一个Rank。
这是个DDR3一个Rank的示意图。我们把左边128MB Chip拆开来看,它是由8个Bank组成,每个Bank核心是个一个存储矩阵,就像一个大方格子阵。这个格子阵有很多列(Column)和很多行(Row),这样我们想存取某个格子,只需要告知是哪一行哪一列就行了,这也是为什么内存可以随机存取而硬盘等则是按块存取的原因。
实际上每个格子的存储宽度是内存颗粒(Chip)的位宽,在这里由8个Chip组成一个Rank,而CPU寻址宽度是64bit,所以64/8=8bit,即每个格子是1个字节。
三、DDR原理
3.1 Bank、Row、Column
在这里我们暂时不关心cpu与DDR之间的联系了,我们聚焦于DDR内存芯片本身,对于一个完整的DDR芯片,我们把它考虑成一个chip的概念。因此,我们现在的讨论重点就落到了chip>bank>row/column。
chip不必多说,bank代表的就是区域,如果把DDR理解成一组存放了不同数据的表格,那么Bank(简写B)就是用来区分不同表格的,而row(简写R)表示行地址,Column(简写C)表示列地址。
有了这三个基本概念,我们就可以计算一块DDR chip的存储区域大小了。例如bank地址线位宽为3,行地址线位宽为13,列地址线位宽为10。那么其对应的空间应该是2^3 * 2^13 * 2^10 = 2^26 =64Mb。在考虑上每个空间可以存储的数据位宽(数据线位宽),那么其总容量是64Mb * 16 =128M Byte = 1G bit。
3.2 内部结构
了解了描述DDR的几个基本概念,接下来我们来了解一下DDR的内部结构,下图给出了一个DDR的内部结构示意图:
我们忽略一部分电源信号、配置信号和时钟信号,把关注的重点放在控制信号、地址信号和数据信号上。
对于控制信号,主要包含以下的几个(其中的CKE为时钟使能,CK,CK#为时钟信号,这里不做讨论):
信号名 | 输入/输出 | 描述 |
RESET# | input | DDR的复位信号,低电平有效 |
A12 | input | 这是一个多功能引脚,通常表示地址引脚(A12),但在特定情况下也可以作为突发截断(Burst Chop, BC#)信号。A12的功能取决于是否在模式寄存器 (MR) 中启用了该功能。 模式寄存器用于配置存储器的工作模式,包括突发长度(Burst Length, BL)等。 |
CS# | input | DDR芯片使能,用于多个RANK时的RANK组选择。 |
RAS# | input | 行地址选通 |
CAS# | input | 列地址选通 |
WE# | input | 写使能信号 |
接下来我们介绍一下地址信号,对于我们这次展示的这块DDR来说,地址相关的信号共有18位,其中3为用来表示bank地址线(BA[2:0])。行地址和列地址在内存访问过程中不是同时给出的,而是按顺序提供的,通常遵循以下步骤:
1. 行地址(Row Address)优先:在内存访问时,首先执行的是 ACTIVATE 命令。该命令会提供 行地址,用来选择内存阵列中的特定行。行地址通过地址引脚传输,并且内存控制器会激活对应的行。这一过程将选定行加载到行缓冲区,准备后续的读写操作。
2. 列地址(Column Address)接着提供:行激活完成后,接下来是 READ/WRITE 命令,这时会给出 列地址,用于选择激活行中的特定列,定位到要读写的具体存储单元。列地址通过相同的地址引脚传输,并结合已经激活的行,确定最终的存储位置。
3. 预充电(Precharge):在完成读写操作后,可以通过 PRECHARGE 命令关闭当前激活的行,使其返回到非激活状态,为下一个行访问做好准备。
从图中我们可以获知:行地址使用了15位(A[14:0]),列地址使用了10位(A[9:0])。
最后,我们来关注一下这块DDR的数据信号:
信号名 | 输入/输出 | 描述 |
DQ[7:0] | inout | 数据信号,这里的位宽为8 |
TDQS#
| output | 当 TDQS(Termination Data Strobe) 被启用时,数据掩码信号 DM 会被禁用。 |
DQS/DQS# | inout | 作为数据传输的参考时钟,确保数据的采样和发送与时钟同步。“选通”指的是控制信号的开启或关闭,即 DQS 信号控制了数据的传输窗口。它类似于一扇门,当 DQS 信号处于高电平时,数据传输被允许,当信号处于低电平时,数据传输停止。读操作:数据选通信号(DQS)与读数据边沿对齐。写操作:数据选通信号(DQS)与写数据中心对齐,确保数据的稳定传输。 |
除此以外,在有的DDR中还会涉及到数据掩码,这部分我们会在后续的内容中继续深入学习。