2、DDR核心架构:Bank、Row、Column、Rank,存储单元如何组织?
好,咱们今天聊聊DDR内部到底长什么样。你平时用DDR颗粒,看到的只是那几个引脚和封装。但里面其实是个复杂的“存储城市”。我刚开始接触DDR时,总觉得它就是个黑盒子,直到有一次调试一个内存控制器,死活跑不到目标频率,最后发现是Bank冲突导致的。嗯,从那以后,我就把DDR内部架构摸了个透。
说白了,DDR的存储单元组织,就像一个大图书馆。你得知道书放在哪个书架(Bank)、哪一排(Row)、哪个位置(Column),才能快速找到。而Rank,则相当于图书馆的独立楼层。
2.1 存储单元:一个电容加一个晶体管
先看最基础的东西——存储单元。DDR用的是DRAM(动态随机存取存储器),每个bit由一个电容和一个晶体管组成。
- 电容:存电荷,代表0或1。有电荷是1,没电荷是0。
- 晶体管:像个开关,控制电容是否连接到数据线上。
为什么叫“动态”?因为电容会漏电。电荷慢慢就没了,所以必须定期刷新(Refresh)。我记得刚入行时,有个同事忘了配刷新周期,结果系统跑着跑着数据就全乱了。那场面,真是惨不忍睹。
核心要点:DRAM存储单元是易失性的,断电数据全丢。而且必须定期刷新,否则数据就“蒸发”了。
2.2 Bank:存储体的基本单元
一个DDR芯片内部,被划分成多个独立的存储区域,每个区域就是一个Bank。你可以把Bank想象成图书馆里的一个独立书架。
为什么要有多个Bank?因为可以并行操作。我在项目中遇到过,如果所有读写都挤在同一个Bank里,那性能会惨不忍睹。因为同一个Bank里,打开一行(Row)后,必须关闭才能打开另一行。这就是所谓的“Bank冲突”。
DDR3和DDR4通常有8个Bank,DDR5则增加到了16个甚至32个。Bank多了,并行度就高了,性能自然就上去了。
个人经验:设计内存控制器时,我建议尽量把数据分散到不同的Bank里。这样能最大化利用Bank的并行性,减少等待时间。
2.3 Row和Column:定位存储单元
每个Bank内部,存储单元排列成一个矩阵。行叫Row,列叫Column。
- Row:行地址,决定你访问哪一行。一行通常包含多个存储单元(比如1KB或2KB)。
- Column:列地址,决定你访问该行中的哪个具体单元。
访问数据时,DDR先激活(Activate)某一行,把这一整行的数据都读到Sense Amplifier(感测放大器)里。然后再通过列地址,从这一行中取出你需要的那个数据。
你想想看,这就像你先打开书架的某一层(Row),然后从这一层里抽出某一本书(Column)。
注意:激活一行是有代价的,需要时间(tRCD)。而且同一时间,每个Bank只能有一行处于激活状态。如果你频繁切换行,就会产生“行冲突”,性能会大幅下降。
2.4 Rank:芯片的组合方式
Rank不是芯片内部的结构,而是多个芯片组合成一个“逻辑单元”。
一个Rank由多个DDR芯片组成,这些芯片共享地址线和控制线,但数据线是独立的。比如一个64位宽的DDR总线,如果每个芯片是8位宽,那就需要8个芯片组成一个Rank。
为什么要有Rank?因为单个芯片的位宽通常不够。DDR颗粒常见的位宽是x4、x8、x16。你需要多个芯片拼起来,才能凑够CPU需要的64位数据总线。
我记得有一次,客户要求内存容量翻倍,但不想改PCB。我建议他们用双Rank的方案,也就是在同一个通道上放两个Rank,通过片选信号(CS)来切换。这样容量翻倍,但布线基本不变。
关键区别:Bank是芯片内部的结构,Rank是芯片外部的组合。一个Rank可以包含多个芯片,每个芯片内部又有多个Bank。
2.5 整体架构图
下面我用一张SVG图,把整个DDR存储架构串起来。你看完应该就一目了然了。
2.6 关键参数速查表
下面这个表,是我平时做设计时经常参考的。你最好记下来,面试也常考。
| 参数 | 说明 | 典型值 |
|---|---|---|
| Bank数量 | 芯片内部独立存储体数量 | DDR3: 8, DDR4: 8/16, DDR5: 16/32 |
| Row大小 | 每行包含的字节数 | 1KB ~ 2KB |
| Column地址 | 列地址宽度 | 8~10 bit |
| Rank位宽 | 一个Rank的总数据位宽 | 64 bit (含ECC时为72 bit) |
| 芯片位宽 | 单个DDR芯片的数据位宽 | x4, x8, x16 |
2.7 避坑指南
最后,分享几个我踩过的坑:
- Bank冲突:我曾经在一个项目中,把所有数据都写到了同一个Bank里。结果带宽利用率不到30%。后来改成Bank交错(Bank Interleaving),性能直接翻倍。
- Row冲突:频繁切换行,会导致tRCD和tRP时间累积。我建议尽量让访问地址连续,减少行切换。
- Rank切换:双Rank虽然容量大,但切换Rank有额外延迟(tRAS)。如果数据访问是随机的,单Rank反而可能更快。
我的习惯:设计内存控制器时,我会先画一个Bank-Row-Column的映射表。然后根据应用场景,决定地址映射策略。比如视频处理,我会让连续地址落在不同Bank里,最大化并行度。
好了,DDR的存储架构就讲到这里。你理解了Bank、Row、Column、Rank这四层结构,后面讲读写时序、刷新策略就容易多了。