1、存储器概述:存储器分类(RAM/ROM)、存储器层级结构、存储器在系统中的角色
各位同学,咱们今天聊聊存储器。说实话,存储器这玩意儿,是芯片设计的基石。你想想看,没有存储器,CPU再快也没地方放数据和指令,对吧?我刚开始做芯片那会儿,总觉得存储器就是个“存东西的盒子”,后来踩了不少坑才明白——存储器的选型和时序设计,直接决定了整个系统的成败。
1.1 存储器的分类:RAM vs ROM
存储器分类,说白了就两大阵营:RAM和ROM。RAM是“随机存取存储器”,断电数据就丢了;ROM是“只读存储器”,断电数据还在。嗯,这个基本概念大家应该都清楚,但实际项目中怎么选,这里头门道不少。
核心区别一句话:RAM是“临时工”,ROM是“正式工”。临时工干活快,但下班就走人;正式工稳定,但改起来麻烦。
RAM的分类
- SRAM(静态RAM):用触发器存数据,速度快,但面积大、功耗高。我做过一个高速缓存项目,SRAM的时序窗口窄得让人抓狂,稍微有点抖动就出问题。
- DRAM(动态RAM):用电容存数据,密度高、成本低,但需要定期刷新。你想想看,电容会漏电,所以每隔几毫秒就得“充电”一次,这就是刷新操作。
ROM的分类
- Mask ROM:出厂时写死,不能改。适合量产固件。
- PROM/EPROM:可编程一次或多次,但擦除麻烦。
- EEPROM/Flash:电可擦除,现在最常用。我建议新手优先学Flash,因为它在嵌入式系统里无处不在。
| 类型 | 速度 | 密度 | 功耗 | 典型应用 |
|---|---|---|---|---|
| SRAM | 快(~1ns) | 低 | 高 | CPU缓存 |
| DRAM | 中(~10ns) | 高 | 中 | 主存 |
| Flash | 慢(~100ns) | 很高 | 低 | 固态硬盘、U盘 |
个人经验:我在一个IoT芯片项目中,为了省成本选了DRAM做缓存,结果刷新时序没处理好,数据经常丢。后来换成SRAM,虽然贵了点,但时序简单多了。所以,别光看成本,时序复杂度也是重要考量。
1.2 存储器层级结构
为什么要有层级结构?说白了就是“速度与容量”的矛盾。CPU想要又快又大的存储器,但现实是——快的存储器贵、容量小;便宜的存储器慢、容量大。怎么办?折中呗。
典型的层级结构是这样的:
- 寄存器(Register):在CPU内部,速度最快(~0.1ns),容量最小(几十字节)。
- L1/L2/L3缓存(Cache):用SRAM实现,速度次之(~1-10ns),容量几MB到几十MB。
- 主存(Main Memory):用DRAM实现,速度几十ns,容量几GB。
- 外存(Storage):用Flash或硬盘,速度最慢(~ms级),容量最大(TB级)。
你想想看,CPU从寄存器取数据只要一个时钟周期,但从主存取数据可能要几百个周期。这就是“存储器墙”问题——CPU越来越快,但存储器跟不上。我做过一个高性能计算项目,瓶颈就在内存访问上,CPU大部分时间都在等数据。
避坑指南:我曾经在设计一个SoC时,忽略了缓存一致性协议,结果多核CPU访问同一块数据时,读到的值不一致。调试了整整两周才发现是缓存没刷新。所以,层级结构设计时,缓存一致性一定要考虑清楚。
1.3 存储器在系统中的角色
存储器在系统里扮演什么角色?我总结了三句话:
- 数据暂存:CPU运算的中间结果、变量、堆栈,都靠RAM暂存。
- 指令存储:程序代码存在ROM或Flash里,上电后加载到RAM执行。
- 系统缓冲:不同速度的设备之间,用存储器做缓冲,比如网卡的数据先存到缓冲区,再让CPU慢慢处理。
举个例子,你手机里的App,代码存在Flash里,运行时加载到DRAM,CPU频繁访问的数据再缓存到SRAM。这一套组合拳下来,既保证了速度,又控制了成本。
核心观点:存储器不是孤立存在的,它和CPU、总线、外设紧密耦合。时序分析时,不能只看存储器本身的参数,还要看整个数据通路的延迟。
1.4 存储器层级结构图(SVG)
下面这张图,是我手绘的存储器层级结构。你看,越往上速度越快、容量越小、成本越高;越往下速度越慢、容量越大、成本越低。这就是经典的“金字塔模型”。
嗯,这张图很直观吧?每次做系统设计时,我都会先画这个金字塔,然后根据性能需求确定每一层用什么存储器、容量多大。说白了,这就是系统设计的“第一性原理”。
我的习惯:做时序分析时,我会把每一层存储器的访问延迟列出来,然后算一下CPU从不同层级取数据的总延迟。如果发现缓存命中率太低,就得调整算法或者加大缓存。这个习惯帮我避免了好几次性能翻车。
好了,这一章就讲到这里。存储器分类和层级结构是基础中的基础,但也是后续时序分析的根基。你想想看,不了解存储器的“脾气”,怎么设计读写时序呢?下一章咱们就深入RAM的读写时序,到时候我会拿实际项目中的波形图来讲解。