2. DDR内部架构:存储阵列与颗粒模组

大家好,我是老张。今天我们来聊聊DDR内部到底长什么样。

很多人学DDR,上来就看时序图、看波形,结果越看越懵。我个人觉得,先搞懂内部架构,后面那些读写时序自然就通了。就像你要学开车,总得先知道方向盘、油门、刹车在哪儿吧?

2.1 存储阵列:Bank、Row、Column

DDR内部的核心,说白了就是一个巨大的存储阵列。你可以把它想象成一个Excel表格:

  • Row(行):就是表格里的行号
  • Column(列):就是表格里的列号
  • Bank(存储块):就是多个这样的表格组成的一个“分区”

每个存储单元(Cell)就在Row和Column的交叉点上。你要读写某个数据,就得先告诉DDR:我要去哪个Bank、哪一行、哪一列。

关键点:DDR内部是二维寻址的。先激活行(Row Activation),再读写列(Column Access)。这两个步骤不能合并,这也是DDR延迟的主要来源之一。

我刚开始做DDR控制器的时候,犯过一个低级错误——我以为Row和Column可以同时给。结果仿真死活跑不通。后来才发现,行激活和列读写之间必须隔几个时钟周期,这就是传说中的tRCD(RAS to CAS Delay)。

2.2 逻辑Bank vs 物理Bank

嗯,这里要注意区分两个概念:逻辑Bank和物理Bank。

类型 说明 我的理解
逻辑Bank 芯片内部独立的存储阵列块 每个逻辑Bank有自己的行缓冲(Row Buffer)
物理Bank 多个芯片组合成的共享数据通道 通常一个物理Bank对应一个Chip Select(片选)信号

你想想看,为什么要有多个Bank?

因为DDR在读写某一行的时候,其他Bank可以同时做预充电(Precharge)或者激活(Activate)。这就是Bank级并行。我做过一个项目,把Bank数从4个增加到8个,带宽利用率直接提升了15%。

避坑指南:我曾经在一个项目中,为了省面积把Bank数减到2个。结果发现读写冲突频繁,性能惨不忍睹。后来老老实实改回4个Bank。记住:Bank数不是越多越好,但太少肯定不行。

2.3 内存颗粒(Chip)与模组(Module)

我们平时说的DDR内存条,其实是一个模组(Module)。模组上面焊着好几颗内存颗粒(Chip)。

举个例子:一根DDR4 8GB的内存条,可能是由8颗1GB的颗粒组成的。每颗颗粒负责8位数据(x8组织),8颗合起来就是64位数据总线。

为什么这么设计?

说白了就是为了并行。CPU一次要读写64位数据,如果只用一颗颗粒,那这颗颗粒必须同时输出64位。但颗粒内部的数据总线通常只有x4、x8、x16三种宽度。所以就把多颗颗粒拼起来用。

颗粒组织方式

  • x4:每颗颗粒4位数据,常用于服务器内存(ECC校验)
  • x8:每颗颗粒8位数据,最常见
  • x16:每颗颗粒16位数据,常用于嵌入式系统

我记得有一次调试一个DDR3的板子,发现数据总线上有毛刺。查了半天,原来是其中一颗x8颗粒的焊盘虚焊了。从那以后,我每次画PCB都会在颗粒附近加测试点。

2.4 整体架构图

下面这张图是我用SVG画的,展示了DDR内部从颗粒到模组的完整结构:

DDR内部架构示意图 DDR模组(Module) 颗粒 Chip 0 x8 组织 Bank 0~7 Row: 0~65535 Col: 0~1023 颗粒 Chip 1 x8 组织 Bank 0~7 Row: 0~65535 Col: 0~1023 ... 颗粒 Chip 7 x8 组织 Bank 0~7 Row: 0~65535 Col: 0~1023 64位数据总线(8颗 × 8位) 控制总线(CS、RAS、CAS、WE、地址线等) 每个颗粒内部:8个逻辑Bank,每个Bank有独立的行缓冲(Row Buffer) Bank间可并行操作:一个Bank在读,另一个Bank可以预充电

注意:上图展示的是典型的x8组织方式。实际项目中,x4和x16的颗粒也经常用到。选哪种取决于你的带宽需求和PCB布线难度。

2.5 实际项目中的选择

最后分享一点实际经验。选颗粒还是选模组?

  • 用模组(DIMM/SO-DIMM):方便升级,适合通用产品。但体积大,成本高。
  • 用颗粒直接贴板(On-board):体积小,成本低,适合嵌入式产品。但坏了就得换整板。

我个人偏好:如果产品量不大(< 10K),用模组。如果量很大,用颗粒直接贴,省成本。

好了,这一章就到这里。记住:搞懂Bank、Row、Column,你就掌握了DDR寻址的核心。下一章我们聊DDR的读写命令和时序,那才是真正烧脑的地方。


专注资料整理