2. SDRAM基础:工作原理、架构与基本操作
各位同学,今天我们聊聊SDRAM。说实话,SDRAM虽然听起来有点老,但它是理解DDR的基石。我当年刚入行时,就是先把SDRAM吃透了,后面看DDR的文档才没那么吃力。你想想看,DDR本质上就是在SDRAM的基础上做了双倍数据传输,核心逻辑其实没变。
2.1 SDRAM的核心思想
SDRAM的全称是Synchronous Dynamic Random Access Memory。关键词是「同步」。什么意思呢?就是它的所有操作——读、写、刷新——都跟着时钟沿走。不像以前的异步DRAM,CPU发个地址过去,得等它慢慢响应,鬼知道什么时候数据才出来。
我个人习惯把SDRAM比作一个图书馆。图书馆里有好多排书架(Bank),每个书架上有好多层(Row),每层又分成好多小格子(Column)。你要找一本书,得先告诉管理员去哪个书架(激活Bank),再告诉他在哪一排(激活Row),最后告诉他具体哪个位置(Column地址)。嗯,就是这么个流程。
关键点:SDRAM的所有操作都与时钟同步。这意味着控制器可以精确预测数据何时到达,大大简化了时序设计。
2.2 内部架构:Bank、Row、Column
我们来看SDRAM的内部结构。一个典型的SDRAM芯片内部有多个Bank,通常是4个。每个Bank是一个独立的存储阵列。
每个存储单元由一个电容和一个晶体管组成。电容存电荷,晶体管当开关。说白了,电容有电就是1,没电就是0。但电容会漏电,所以需要定期刷新——这就是DRAM名字里「Dynamic」的由来。
我的经验:我在一个老项目中用过SDRAM,当时发现数据偶尔出错。排查了半天,最后发现是刷新间隔设置得太长了。SDRAM要求每64ms刷新所有行,这个参数千万别搞错。
2.3 基本操作流程
SDRAM的操作其实就三个步骤:激活(Activate)、读写(Read/Write)、预充电(Precharge)。我习惯叫它「三板斧」。
2.3.1 激活(Activate)
激活就是选中某个Bank的某一行。激活后,这一行的所有数据都会被读到Sense Amplifier(感测放大器)里。这个过程叫「打开行」。注意,一次只能打开一行,除非你换Bank。
2.3.2 读写(Read/Write)
行打开后,你就可以通过Column地址来读写具体的数据了。读操作有延迟,叫CAS Latency(CL)。这个CL值很关键,DDR时代我们经常调它来优化性能。
// 典型的SDRAM读操作时序(伪代码)
// 假设 CL=2, 时钟周期 tCK=10ns
// 1. 发送激活命令 + Bank地址 + Row地址
ACTIVATE(Bank=0, Row=0x1234);
// 2. 等待 tRCD(RAS to CAS Delay),这里假设 tRCD=2个周期
wait(20ns);
// 3. 发送读命令 + Column地址
READ(Bank=0, Column=0x5678);
// 4. 等待 CL=2 个周期后,数据出现在DQ引脚上
wait(20ns);
data = DQ_pins; // 数据有效!
2.3.3 预充电(Precharge)
读或写完成后,需要关闭当前行,为下一次激活做准备。这个过程叫预充电。如果不做预充电,下一次激活同一Bank的不同行时,数据会冲突。
注意:预充电操作有延迟,叫tRP(Row Precharge Time)。我曾经见过一个新手工程师,把tRP设成了0,结果芯片直接罢工。别学他。
2.4 刷新操作
前面说了,电容会漏电。所以SDRAM需要定期刷新。刷新有两种方式:
- 自动刷新(Auto Refresh):由SDRAM内部计数器控制,你只需要发个命令就行。
- 自刷新(Self Refresh):进入低功耗模式后,芯片自己管自己。适合休眠场景。
刷新周期通常是64ms。也就是说,每64ms内,所有行必须被刷新一次。具体怎么算?
| 参数 | 典型值 | 说明 |
|---|---|---|
| 刷新周期 | 64ms | 所有行刷新一次的总时间 |
| 行数 | 4096 / 8192 | 取决于芯片容量 |
| 刷新间隔 | 64ms / 行数 | 两次刷新命令之间的时间 |
举个例子,4096行的芯片,刷新间隔就是64ms / 4096 ≈ 15.6μs。也就是说,你每15.6μs就得发一次刷新命令。
避坑指南:我曾经在一个高速项目中,因为刷新命令发得太频繁,导致读写带宽被挤占。后来我改用「突发刷新」(Burst Refresh),在空闲时一次性刷完所有行,问题就解决了。
2.5 模式寄存器配置
SDRAM上电后,需要先配置模式寄存器(Mode Register)。这个寄存器决定了:
- CAS Latency(CL):读数据的延迟周期数
- 突发长度(Burst Length):一次读写传输多少个数据
- 突发类型:顺序还是交错
// 配置模式寄存器示例
// 假设我们要设置:CL=2, 突发长度=4, 顺序突发
// 1. 发送预充电命令,关闭所有Bank
PRECHARGE(ALL);
// 2. 发送两个自动刷新命令
AUTO_REFRESH();
AUTO_REFRESH();
// 3. 发送模式寄存器设置命令
// 地址线 A0-A2: 突发长度 (010 = 4)
// A3: 突发类型 (0 = 顺序)
// A4-A6: CAS Latency (010 = 2)
MODE_REGISTER_SET(0b00000010_0010_010);
// 实际地址线值为: A12-A7=0, A6-A4=010, A3=0, A2-A0=010
我的习惯:配置模式寄存器时,我一般先读一遍芯片的数据手册,确认CL值和频率的对应关系。有些芯片在低频下支持CL=1,高频下只能CL=2或3。别想当然。
2.6 从SDRAM到DDR的演进
SDRAM是单倍数据速率——每个时钟周期只传输一次数据。DDR呢?它在时钟的上升沿和下降沿都传输数据,所以带宽翻倍。
但底层逻辑没变:Bank、Row、Column、激活、读写、预充电、刷新——这些概念在DDR里全都有。只是DDR加了更多优化:
- DLL(延迟锁定环)来精确控制时序
- ODT(片上端接)来改善信号质量
- 更复杂的Bank管理(如8 Bank、16 Bank)
所以,把SDRAM搞懂了,DDR对你来说就是一层窗户纸。捅破了,后面的事就顺了。
总结一下:SDRAM的核心是同步操作、Bank架构、三板斧流程(激活-读写-预充电)和定期刷新。这些概念会贯穿整个DDR系列课程。记牢它们,后面你会感谢我的。
公众号:蓝海资料掘金营,微信deep3321