2、内存颗粒物理结构:内部Bank结构、Row与Column寻址、数据线DQ与DQS、地址线、命令线(RAS、CAS、WE、CS)
好,咱们今天聊聊内存颗粒的物理结构。说实话,很多工程师调了几年DDR,对协议时序倒背如流,但问起颗粒内部长什么样,反而说不清楚。我个人觉得,搞懂内部结构,才是真正理解DDR行为的开始。
2.1 内部Bank结构——颗粒里的“小仓库”
一个DDR颗粒内部,其实是由多个Bank组成的。你可以把Bank想象成一个个独立的小仓库。每个仓库里都有一排排的货架,货架上放着数据。
为什么要有多个Bank?说白了就是为了并发。你想想看,如果只有一个Bank,那CPU读数据的时候,这个Bank忙着找数据,其他操作都得等着。有了多个Bank,就可以让一个Bank在预充电,另一个Bank在激活,第三个Bank在读数据——流水线作业,效率一下就上来了。
我记得在DDR3时代,常见的颗粒是8个Bank。到了DDR4,有些颗粒做到了16个Bank。Bank数量越多,并发能力越强,但控制逻辑也更复杂。嗯,这里要注意:Bank之间是独立的,但共享数据总线。所以你不能同时从两个Bank读数据,但可以一个在读,另一个在准备。
2.2 Row与Column寻址——怎么找到你要的数据
好,现在你知道了数据存在Bank里。那具体怎么找到它呢?这就涉及到Row(行)和Column(列)寻址。
每个Bank内部,数据是按矩阵排列的。行地址决定哪一行被激活,列地址决定这一行里的哪个具体位置。打个比方:你去图书馆找书,Row就是第几排书架,Column就是书架上的第几本书。
寻址过程分两步:
- 行激活(Row Activation): 先发送行地址,把整行数据从存储单元读到Sense Amplifier(感测放大器)里。这一步比较慢,因为要等电压稳定。
- 列读取(Column Read): 再发送列地址,从已经激活的行里选出具体的数据。这一步很快,因为数据已经在放大器里了。
我刚开始做DDR调试时,遇到过一个坑:连续访问同一Bank的不同行,每次都要重新激活,延迟很大。后来改成交替访问不同Bank,性能直接翻倍。这就是Row与Column寻址在实际项目中的体现。
2.3 数据线DQ与DQS——数据的“高速公路”
数据线DQ,就是传输数据的那几根线。DDR颗粒的位宽通常是x4、x8、x16。x8就是一次传8位数据,x16就是16位。这个很好理解。
但真正有意思的是DQS(数据选通信号)。DQS是和数据一起传输的时钟信号,用来告诉接收端“数据什么时候有效”。DDR之所以叫“双倍数据速率”,就是因为DQS的上升沿和下降沿都采样数据。
这里有个细节:DQS是双向的。读数据时,颗粒产生DQS发给控制器;写数据时,控制器产生DQS发给颗粒。我见过不少新手工程师,在调试时发现DQS波形不对,结果发现是方向搞反了。
在实际项目中,DQ和DQS的等长布线非常关键。我曾经遇到一个案例,因为DQ和DQS的走线长度差了200mil,导致高速下数据采样出错。后来用示波器一看,DQS的边沿正好落在数据跳变的位置上——典型的时序违规。
2.4 地址线——告诉颗粒“去哪儿找”
地址线就是用来传输Row地址和Column地址的。DDR的地址线是复用的——先传Row地址,再传Column地址。这样能减少引脚数量,降低成本。
地址线的数量取决于颗粒的容量。比如一个1Gb的DDR3颗粒,Row地址有14位,Column地址有10位。加起来就是24位地址空间。但实际引脚只有A0~A13,共14根。怎么做到的?就是分时复用。
我个人习惯在原理图里把地址线按功能分组标注:
- Row地址线: 决定哪一行被激活
- Column地址线: 决定哪一列被读取
- Bank地址线: BA0~BA2,决定哪个Bank被操作
嗯,这里要注意:不同DDR代际,地址线的复用方式不一样。DDR4引入了BG(Bank Group)地址线,进一步提高了并行度。如果你在做DDR4设计,一定要搞清楚BG和BA的区别。
2.5 命令线——RAS、CAS、WE、CS
命令线是DDR的“指挥系统”。颗粒做什么操作,全靠这几根线说了算。
| 信号 | 全称 | 作用 |
|---|---|---|
| RAS | Row Address Strobe | 行地址选通,激活某一行 |
| CAS | Column Address Strobe | 列地址选通,读取或写入某一列 |
| WE | Write Enable | 写使能,决定是读还是写 |
| CS | Chip Select | 片选信号,选中当前颗粒 |
这些信号组合起来,就构成了DDR的命令集。比如:
- 激活命令: RAS=0, CAS=1, WE=1, CS=0
- 读命令: RAS=1, CAS=0, WE=1, CS=0
- 写命令: RAS=1, CAS=0, WE=0, CS=0
- 预充电命令: RAS=0, CAS=1, WE=0, CS=0
你可能会问:为什么命令这么复杂?说白了,就是为了在有限的引脚上实现尽可能多的控制功能。DDR的协议设计,本质上就是在引脚数量和功能丰富度之间做平衡。
2.6 总结一下
好了,这一章的内容就这些。咱们回顾一下:
- Bank: 颗粒内部的独立存储单元,支持并行操作
- Row/Column: 行激活慢,列读取快,要善用Bank交错
- DQ/DQS: 数据线和选通信号,双向传输,时序是关键
- 地址线: 分时复用,Row和Column地址共用引脚
- 命令线: RAS、CAS、WE、CS组合出所有操作
下一章咱们会讲DDR的初始化流程,包括MRS寄存器配置和ZQ校准。到时候你会发现,理解了内部结构,初始化代码看起来就顺眼多了。