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内部从颗粒到模组的完整结构:
注意:上图展示的是典型的x8组织方式。实际项目中,x4和x16的颗粒也经常用到。选哪种取决于你的带宽需求和PCB布线难度。
2.5 实际项目中的选择
最后分享一点实际经验。选颗粒还是选模组?
- 用模组(DIMM/SO-DIMM):方便升级,适合通用产品。但体积大,成本高。
- 用颗粒直接贴板(On-board):体积小,成本低,适合嵌入式产品。但坏了就得换整板。
我个人偏好:如果产品量不大(< 10K),用模组。如果量很大,用颗粒直接贴,省成本。
好了,这一章就到这里。记住:搞懂Bank、Row、Column,你就掌握了DDR寻址的核心。下一章我们聊DDR的读写命令和时序,那才是真正烧脑的地方。