内存模块设计

如何使用小容量的内存芯片,组成内存模块?

一些概念

  • 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

32-32

地址线计算

总数据为$256K \times 32$bits,可寻址宽度为 32-bit :

\[256K \times 32 \div 32 = 256K = 2^{18}\]

所以需要 18 根地址线

分析
  • 地址线共用
  • 数据线对应连
  • 可寻址宽度 = 接口宽度
  • 可寻址范围0x00000 - 0x3FFFF

读取内存就分成了三步:

  1. 我要找 0x12345 地址存放的 32 位数据
  2. 32 个内存芯片纷纷拿出了自己 0x12345 地址存放的 1 位数据 0 / 1
  3. 组成了最后我要的数据:01010101010101010101010101010101

CPU 可寻址单元宽度 < 接口宽度

What we have?
  • 256K x 1-bit RAM chips
What we want?
  • 256K x 32-bit RAM modules
  • 32-bit addressable unit

32-8

地址线计算

总数据为$256K \times 32$bits,可寻址宽度为 8-bit :

\[256K \times 32 \div 8 = 1M = 2^{20}\]

所以需要 20 根地址线,但是我们只有 18 根地址线,要怎么办?!

解决方案:舍弃低 2 位

分析
  • 地址线共用
  • 数据线对应连
  • 可寻址宽度 $<$ 接口宽度
  • 可寻址范围0x00000 - 0xFFFFF
  1. 我要找 0x43210 地址存放的 8 位数据
  2. 32 个内存芯片收到了高位地址:0x43210 >> 2 = 0x10C84
  3. 纷纷拿出了自己 0x10C84 地址存放的 1 位数据 0 / 1
  4. 汇总出了 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

8-8

地址线计算

总数据为$2M \times 8$bits,可寻址宽度为 8-bit :

\[2M \times 8 \div 8 = 2M = 2^{21}\]

需要 21 根地址线:

  • 高 3 位用于选择 8 块芯片
  • 剩余用于芯片寻址。
分析
  • 数据线共用
  • 地址线切分
  • 可寻址宽度 = 接口宽度
  1. 我要找 0x143210 地址存放的 8 位数据
  2. 根据高三位101,第 6 个芯片就成为了被选中的芯片
  3. 剩下的地址位传给了它
  4. 它拿出了自己的 8 位数据 01010101

位数和容量都不够怎么办?

字位拓展

What we have?
  • 256K x 8-bit RAM chips
What we want?
  • 2M x 32-bit RAM modules
  • 8-bit addressable unit

32-8

地址线计算

总数据为$2M \times 32$bits,可寻址宽度为 8-bit :

\[2M \times 32 \div 8 = 8M = 2^{23}\]

需要 23 根地址线:

  • 高 3 位用于选择 8 块芯片
  • 丢弃低 2 位
  • 剩余用于芯片寻址。
分析
  • 数据线共用
  • 地址线切分
  • 可寻址宽度 $<$ 接口宽度
  1. 我要找0x443210地址存放的 8 位数据
  2. 根据高三位100,第 5 组芯片就成为了被选中的芯片们
  3. 剩下的地址位0x43210 >> 2 = 0x10C84传给了它们
  4. 第 5 组里的 4 块芯片纷纷拿出了自己的 8 位数据 01010101
  5. 汇总出了0x443210, 0x443211, 0x443212, 0x443213地址中的数据0101010101010101010101010101010101010101

总结

内存模块总大小固定时

  • 仅由可寻址位宽决定地址总线数
    • 可寻址位宽也只影响地址总线数,不影响拓展方式
  • 内存接口位宽、内存芯片字宽决定位拓展
  • 内存接口位宽、内存芯片字个数决定字拓展
    • 内存接口位宽 > 可寻址位宽时,丢弃低位