存储芯片的地址分配和片选

3.3.2解决了”要几片”,这一节解决”哪一片管哪一段地址”。

地址被劈成两截:低位直接接芯片的地址引脚,决定片内选哪个单元;高位用来产生片选,决定选哪一片。 三种片选方式的差别,全部在于高位那一截怎么用——是每根线直接当片选,是全部送进译码器,还是只送一部分。

用了多少根高位地址线,就决定了地址是否唯一、是否连续、空间有没有浪费。 这三个后果一一对应三种方式,记住对应关系就不必背表。

机制

地址的两截

高位:产生片选低位位:片内地址

其中 单片单元数。这条划分线的位置只由单片容量决定,与用了几片无关。

三种片选方式

线选法:每一根高位地址线直接接一片芯片的片选端(低电平有效)。

  • 根高位线最多接 片
  • 任何时刻只允许一根为 0,其余为 1
  • 地址不连续、有大量无效地址、地址空间浪费严重
  • 优点:不需要译码器,最简单

全译码法:全部高位地址线送进译码器,译码输出作片选。

  • 根高位线可产生 个片选
  • 每个存储单元有且只有一个地址,地址连续、无浪费、无重叠
  • 缺点:译码电路最复杂

部分译码法:只把一部分高位地址线送进译码器,剩下的悬空不接。

  • 悬空的地址线取 0 或 1 都不影响片选,于是同一个存储单元对应多个地址
  • 这种现象叫地址重叠:未参与译码的地址线有几根,每个单元就有 根数 个别名
  • 折中:译码电路比全译码简单,地址利用率比线选法高
flowchart TB
    ADDR["高位地址线"]
    ADDR --> S1["线选法<br/>每根线直接当片选"]
    ADDR --> S2["部分译码<br/>一部分进译码器,其余悬空"]
    ADDR --> S3["全译码<br/>全部进译码器"]
    S1 --> R1["最简单<br/>地址不连续 · 浪费最严重"]
    S2 --> R2["折中<br/>产生地址重叠(每单元多个别名)"]
    S3 --> R3["最复杂<br/>地址唯一 · 连续 · 无浪费"]

    classDef good fill:#d5f5e3,stroke:#27ae60
    classDef mid fill:#fdebd0,stroke:#e67e22
    classDef bad fill:#fadbd8,stroke:#c0392b
    class R3,S3 good
    class R2,S2 mid
    class R1,S1 bad

计算模板:求某一片的地址范围

第一步:确定地址总位数 (= CPU 地址线根数)。

第二步:确定片内地址位数 ( = 单片单元数),这 位从全 0 变到全 1。

第三步:写出该片的高位片选码,这 位在该片被选中期间固定不变。

第四步:拼起来读两个端点。

起始地址片选码末地址片选码

第五步:每 4 位一组转成十六进制。

一个完整的例子。 CPU 地址线 ,数据线 8 根,用 4 片 位 RAM 构成 位主存,采用全译码。

  • 单片 → , 接芯片
  • 剩下 共 4 根,全译码用 4-16 译码器,本例只用其中 4 个输出
片起始末地址
000000000H0FFFH
100011000H1FFFH
200102000H2FFFH
300113000H3FFFH

自检:每片跨度 ✅;四片连续无缝 ✅;总跨度 0000H~3FFFH ✅。

若改成部分译码,只把 送译码器、 悬空,则片 0 除了 0000H~0FFFH 之外,还同时响应 4000H、8000H、C000H 三段——每个单元有 个别名。

边界

“地址重叠”和”地址冲突”不是一回事。 地址重叠是一个单元有多个地址(部分译码的正常后果);地址冲突是一个地址选中了多片(连接错误,会造成数据总线竞争)。题目问”是否合理”时,重叠可以接受,冲突不可以。

线选法的地址一定不连续。 因为片选线要求”只有一根为 0”,所以片选码只能取 1110、1101、1011、0111 这类值,它们对应的地址段之间隔着大片无效区。

判断用了哪种方式,看有没有译码器、以及高位地址线是否全部参与。

现象方式
无译码器,每根高位线接一片线选法
有译码器,高位地址线全部接入全译码
有译码器,部分高位地址线悬空部分译码

RAM 区和 ROM 区共存靠的就是片选。 两类芯片挂在同一组地址和数据总线上,由译码器把地址空间切成 ROM 段和 RAM 段——这就是 3.1.1中”RAM 与 ROM 可以统一编址”的电路实现。

片内地址位数 只看单片容量,与总片数无关。 这一条被抽掉限定的频率很高: 的芯片无论用 4 片还是 40 片, 都是 12。

对照速查

方式译码器地址连续地址唯一空间浪费电路复杂度
线选法无否是最严重最简单
部分译码有段内连续否(重叠)有中
全译码有是是无最复杂
步骤做什么
1地址总位数 = CPU 地址线根数
2片内地址位数 单片单元数
3高 位写出片选码
4低 位全 0 → 起始,全 1 → 末地址
5四位一组转十六进制,用跨度自检

考点

  • 地址分两截:低 位接芯片( 只由单片容量决定),高位产生片选
  • 线选法无译码器、地址不连续、浪费最严重
  • 全译码地址唯一且连续,无重叠
  • 部分译码产生地址重叠,悬空 根则每单元有 个别名
  • 地址重叠 ≠ 地址冲突:前者是设计后果,后者是连接错误
  • 地址范围 = 片选码 + 低位全 0 / 全 1,用”跨度 = 单片容量”自检
  • RAM 与 ROM 统一编址靠片选译码实现

链接