3、DRAM基础:存储单元结构、刷新机制与SRAM对比
各位同学,今天我们聊聊DRAM。说实话,DRAM这东西,我入行头三年都没真正搞懂它为什么非得“刷新”。直到有一次,我在一个内存控制器项目里,因为刷新时序没算好,导致系统在高温下频繁丢数据……嗯,从那以后,我对DRAM的每一个电容都充满了敬畏。
3.1 1T1C存储单元:一个晶体管加一个电容
DRAM的核心存储单元,说白了就是一个晶体管加一个电容。你想想看,就两个器件,存一个bit。这结构简单得令人发指,但问题也出在这里。
为什么叫1T1C?
- 1个晶体管(MOSFET):充当开关,控制电容的充放电。
- 1个电容:存储电荷,电荷量代表逻辑“1”或“0”。
我画个简图帮你理解:
你看,当字线(WL)拉高时,晶体管导通,位线(BL)上的数据就能写入电容,或者从电容读出来。读的时候,电容上的电荷会通过位线释放,产生一个微小的电压变化。这个变化有多小?我告诉你,大概只有200mV左右。你想想看,在1.8V的电压域里,200mV的摆幅,噪声稍微大一点就误判了。
关键点:DRAM读操作是破坏性读取。什么意思?就是你读一次,电容里的电荷就没了。所以读完之后必须立刻写回去,这叫“读后重写”。我当年第一次仿真时没注意这个,结果读一次数据就丢了,排查了整整两天。
3.2 DRAM刷新机制:为什么必须“续命”
DRAM的电容会漏电,这是物理规律。你存进去的电荷,过一段时间就跑光了。所以DRAM必须定期刷新——说白了就是每隔一段时间,把每个存储单元的数据读出来,再写回去,把电荷补满。
刷新参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| tREF | 64ms | 所有行必须在64ms内刷新一次 |
| tRFC | 350ns(DDR4) | 一次刷新操作所需时间 |
| 刷新行数 | 8192行 | 64ms内完成8192次刷新 |
计算一下:64ms / 8192 = 7.8μs。也就是说,每7.8微秒就得刷一行。这个时间窗口,在高速系统里非常紧张。我做过一个DDR4控制器,刷新请求来了,如果正在读数据,就得等。等久了,下一行就超时了。所以刷新优先级的设计,是个很讲究的活。
我的经验:在高温环境下(比如85°C以上),漏电会加剧。有些工业级芯片会把刷新周期缩短到32ms甚至16ms。设计时一定要留余量,别卡着64ms的极限算。
刷新方式有三种:
- 自动刷新(Auto Refresh):由DRAM内部的行地址计数器控制,外部只需要发刷新命令。这是最常用的方式。
- 自刷新(Self Refresh):DRAM进入低功耗模式,内部自己定时刷新。适合休眠场景。
- 由控制器逐行刷新:控制器自己管理行地址,逐行发激活+预充电。这种方式灵活性高,但控制器设计复杂。
我个人习惯用自动刷新,省心。但如果你在做低功耗设计,自刷新是必须的。我记得有个项目,待机功耗要求低于1mW,自刷新帮了大忙。
3.3 DRAM vs SRAM:一场关于速度与容量的博弈
很多初学者会问:为什么不用SRAM做内存?答案很简单:贵,而且密度低。
我直接给你看对比:
| 对比项 | DRAM | SRAM |
|---|---|---|
| 存储单元 | 1T1C(1个晶体管+1个电容) | 6T(6个晶体管,锁存器结构) |
| 存储密度 | 高(同样面积,容量是SRAM的4~6倍) | 低 |
| 访问速度 | 慢(50~70ns,需要刷新) | 快(1~10ns,无需刷新) |
| 功耗 | 需要刷新,动态功耗高 | 静态功耗低,但漏电随工艺增大 |
| 成本 | 低(每bit成本低) | 高(每bit成本高) |
| 易失性 | 是(断电丢失) | 是(断电丢失) |
你想想看,一个SRAM单元要6个晶体管,DRAM只要1个。同样1平方毫米的面积,DRAM能塞下几十兆bit,SRAM可能只有几兆。这就是为什么你的电脑内存是DRAM,而CPU缓存是SRAM。
避坑指南:我曾经在一个SoC项目里,把SRAM当DRAM用,想省掉刷新逻辑。结果发现SRAM的漏电在28nm工艺下大得惊人,待机功耗根本压不住。后来还是老老实实用了DRAM加自刷新模式。所以,选型时别只看速度,功耗和面积都要算清楚。
什么时候用DRAM?
- 需要大容量(几百MB到几十GB)
- 对成本敏感
- 可以接受几十纳秒的延迟
- 有专门的刷新控制器
什么时候用SRAM?
- 需要极低延迟(比如CPU缓存、寄存器文件)
- 容量小(几KB到几MB)
- 不想处理刷新逻辑
- 对功耗有严格限制(但要注意漏电)
嗯,DRAM的基础就这些。说白了,1T1C结构成就了它的高密度和低成本,但也带来了刷新这个“麻烦”。而SRAM用6个晶体管换来了速度和简单性,代价是面积和成本。两者各有千秋,关键看你的应用场景。