内存模块设计
如何使用小容量的内存芯片,组成内存模块?
一些概念
- CPU 字宽
- 一条指令中数据的宽度
- Add R0, R1, R2 中 Rx 的宽度
- 等于数据总线宽度
- CPU 可寻址单元宽度
- 一个地址代表的数据宽度
- 一般是 1B (8 Bits)
- 内存字宽 (n)
- 每次访问的数据宽度
- 内存字个数 (N)
- 总共可访问的数据字数
位数不够用怎么办?
位拓展 (Bit Extensions)
- 共用地址线
- 数据线对应连
如果把地址当作村,位扩展就是扩建村子,这样每个村就有更多户了。
CPU 可寻址单元宽度 = 接口宽度 > 内存芯片字宽
What we have?
- 256K x 1-bit RAM chips
What we want?
- 256K x 32-bit RAM modules
- 32-bit addressable unit
地址线计算
总数据为$256K \times 32$bits,可寻址宽度为 32-bit :
\[256K \times 32 \div 32 = 256K = 2^{18}\]所以需要 18 根地址线
分析
- 地址线共用
- 数据线对应连
- 可寻址宽度 = 接口宽度
- 可寻址范围
0x00000 - 0x3FFFF
读取内存就分成了三步:
- 我要找
0x12345
地址存放的 32 位数据 - 32 个内存芯片纷纷拿出了自己
0x12345
地址存放的 1 位数据0 / 1
- 组成了最后我要的数据:
01010101010101010101010101010101
CPU 可寻址单元宽度 < 接口宽度
What we have?
- 256K x 1-bit RAM chips
What we want?
- 256K x 32-bit RAM modules
- 32-bit addressable unit
地址线计算
总数据为$256K \times 32$bits,可寻址宽度为 8-bit :
\[256K \times 32 \div 8 = 1M = 2^{20}\]所以需要 20 根地址线,但是我们只有 18 根地址线,要怎么办?!
解决方案:舍弃低 2 位
分析
- 地址线共用
- 数据线对应连
- 可寻址宽度 $<$ 接口宽度
- 可寻址范围
0x00000 - 0xFFFFF
- 我要找
0x43210
地址存放的 8 位数据 - 32 个内存芯片收到了高位地址:
0x43210 >> 2 = 0x10C84
- 纷纷拿出了自己
0x10C84
地址存放的 1 位数据0 / 1
- 汇总出了
0x43210, 0x43211, 0x43212, 0x43213
地址的数据:01010101010101010101010101010101
。
容量不够怎么办?
字拓展 (Word Extension)
- 共用数据线
- 地址线高位选择芯片
CPU 可寻址单元宽度 = 接口宽度 = 内存芯片字宽
What we have?
- 256K x 8-bit RAM chips
What we want?
- 2M x 8-bit RAM modules
- 8-bit addressable unit
地址线计算
总数据为$2M \times 8$bits,可寻址宽度为 8-bit :
\[2M \times 8 \div 8 = 2M = 2^{21}\]需要 21 根地址线:
- 高 3 位用于选择 8 块芯片
- 剩余用于芯片寻址。
分析
- 数据线共用
- 地址线切分
- 可寻址宽度 = 接口宽度
- 我要找
0x143210
地址存放的 8 位数据 - 根据高三位
101
,第 6 个芯片就成为了被选中的芯片 - 剩下的地址位传给了它
- 它拿出了自己的 8 位数据
01010101
位数和容量都不够怎么办?
字位拓展
What we have?
- 256K x 8-bit RAM chips
What we want?
- 2M x 32-bit RAM modules
- 8-bit addressable unit
地址线计算
总数据为$2M \times 32$bits,可寻址宽度为 8-bit :
\[2M \times 32 \div 8 = 8M = 2^{23}\]需要 23 根地址线:
- 高 3 位用于选择 8 块芯片
- 丢弃低 2 位
- 剩余用于芯片寻址。
分析
- 数据线共用
- 地址线切分
- 可寻址宽度 $<$ 接口宽度
- 我要找
0x443210
地址存放的 8 位数据 - 根据高三位
100
,第 5 组芯片就成为了被选中的芯片们 - 剩下的地址位
0x43210 >> 2 = 0x10C84
传给了它们 - 第 5 组里的 4 块芯片纷纷拿出了自己的 8 位数据
01010101
- 汇总出了
0x443210, 0x443211, 0x443212, 0x443213
地址中的数据0101010101010101010101010101010101010101
总结
内存模块总大小固定时
- 仅由可寻址位宽决定地址总线数
- 可寻址位宽也只影响地址总线数,不影响拓展方式
- 内存接口位宽、内存芯片字宽决定位拓展
- 内存接口位宽、内存芯片字个数决定字拓展
- 内存接口位宽 > 可寻址位宽时,丢弃低位