Q1:存储器 / 重合选择 / 寄存器文件 —— 可视化训练版

目标:把题目看到的每一条线索,瞬间映射到对应的知识点、公式、变量、芯片连线和输出逻辑。

64位字 32位字 双模式存储器 地址拼接 MUX Decoder Write Enable Zero Extension
旁白引导: 你看到这道题,第一反应不要急着画图。要先抓住三个核心:
① 这是一个 模式切换题
② 这是一个 两片32位芯片拼成64位行为 的题;
③ 这是一个 地址映射 + 写使能 + 输出拼接 的题。
一旦看出这三点,后面所有连线其实都只是“按模式分情况”展开。

题目给出的外部接口

  • 输入:I(64位数据)
  • 输入:A=A[k-1:0](k位地址)
  • 输入:W(写使能)
  • 输入:S1 S0(2位选择器)
  • 输出:O(64位数据)

题目要求的三件事

  • (a) 画出两片芯片的 DataInAddr
  • (b) 写出输入到芯片 iWi 代数式
  • (c) 画出最终 64 位输出 O 的电路

1. 知识点:存储器接口的标准读写模型

一个标准存储器接口由 地址数据输入写使能数据输出 组成。
读:给地址,取出该地址内容。
写:给地址 + 给输入数据 + 令写使能为1。
Read: O = M[A]      (当 W=0 时)
Write: M[A] ← I      (当 W=1 时)

【题目线索就想到什么】

【题目示例】

例如若某个 32 位芯片地址为 10110,且 W=1,输入数据低 32 位为 0x89ABCDEF,那么该芯片把 0x89ABCDEF 写入地址 10110
旁白引导: 你看这里,先不要陷入“64位”和“32位”的细节。第一层永远是最基本的存储器规律:读就是取 M[地址],写就是改 M[地址]
所以这题真正要解决的不是“存储器会不会读写”,而是:不同模式下,地址是谁、输入数据是谁、哪一片允许写、输出怎么组合。

2. 知识点:容量与字长的关系

同样的总比特容量,可以组织成“较少个宽字”,也可以组织成“较多个窄字”。
2^k 个 64 位字 = 2^(k+1) 个 32 位字

【为什么】

总比特数 = 2^k × 64 = 2^k × 2 × 32 = 2^(k+1) × 32

【题目线索】

【具体数值示例】

k=3,那么:
2^3=8 个 64 位字,或者 2^4=16 个 32 位字。
总容量都是 8×64=16×32=512 bit
旁白引导: 你看到这种“同容量双组织”描述,条件反射一定要想到:地址位数会跟着字长变化
因为字更窄了,能放的字更多,所以地址空间扩大一倍,也就是多出 1位地址选择。这就是后面 S0 进入地址的根源。

3. 知识点:两片 32 位、2^k 地址芯片并行构成 64 位行为

每片芯片本身是:2^k 个地址、每个地址存 32 位
两片并行后,在 64 位模式下,同一个地址 A 同时访问两片:一片提供高 32 位,一片提供低 32 位。
地址 A
芯片1
存/取高32位
芯片0
存/取低32位
A = 01101
I[63:32]
I[31:0]

【题目线索】

【具体数值示例】

I = 0x11223344_55667788,则:
  • 高 32 位:I[63:32] = 0x11223344
  • 低 32 位:I[31:0] = 0x55667788
若当前为 64 位模式,地址为 A,则:
  • 芯片1 写/读 0x11223344
  • 芯片0 写/读 0x55667788
旁白引导: 你看这里要马上形成一个固定心像:两片32位并排,拼成一条64位总线
一旦你脑中有这个图,(a) 的 DataIn、(c) 的 Output 就几乎自动出来了:
高半边给芯片1,低半边给芯片0;输出时再反向拼回去。

4. 知识点:模式位 S1 的含义

S1 = 1 → 64位模式
S1 = 0 → 32位模式

64 位模式

  • 地址就是 A
  • 两片同时参与
  • 输入 64 位拆成高/低两半分别送入
  • 输出由两片32位拼成64位

32 位模式

  • 逻辑地址变成 S0 A[k-1:0]
  • S0 决定访问芯片1还是芯片0
  • 写时只使用 I[31:0]
  • 读时只把读出的32位放到 O[31:0],高32位清零
旁白引导: 这里最关键的不是背结论,而是建立反射:
S1 控制的是“宽度解释方式”
所以当你后面写任何公式时,都要先问一句:
“我现在是在 64 位模式写整字,还是在 32 位模式只碰其中半字?”

5. 知识点:S0 在 32 位模式下进入地址解释

题目明确说:当 S1=0 时,32位数据的地址由
S0 A[k-1] A[k-2] ... A1 A0
指定。这说明:原本的 k+1 位逻辑地址,被拆成:
  • 最高位 S0:决定上半区 / 下半区
  • 其余 kA:作为片内地址

【题目线索】

【具体数值示例】

k=3,则每片芯片有 8 个地址。
32 位模式时总共有 16 个 32 位地址:
  • 0000 ~ 0111 对应 芯片0 的地址 000 ~ 111
  • 1000 ~ 1111 对应 芯片1 的地址 000 ~ 111
所以:
  • S0=0 → 访问芯片0
  • S0=1 → 访问芯片1
旁白引导: 你看这里一定要马上想到“**片选**”。
因为逻辑地址是 k+1 位,但物理芯片地址只有 k 位,所以那多出来的最高位不可能再送进地址脚,它只能用来决定:到底是访问芯片0还是芯片1。

6. (a) 两片芯片的 DataIn 和 Addr 应该怎么接

6.1 地址连接

Addr0 = A
Addr1 = A
不管是 64 位模式还是 32 位模式,送进两片芯片内部的地址脚都只是 A
真正决定“32位模式下访问哪一片”的不是地址脚本身,而是写使能与输出选择逻辑。

6.2 数据输入连接

DataIn0 = I[31:0]
DataIn1 = \begin{cases} I[63:32], & S1=1 \\ I[31:0], & S1=0 \end{cases}
为什么 芯片1 在 32 位模式也接 I[31:0]
因为 32 位模式下只允许写入“输入的低 32 位”。如果 S0=1 时要写的是芯片1,那么芯片1 也必须拿到低 32 位那份数据。

【具体电路思维】

【题目示例】

示例A:64位模式

  • S1=1
  • I=0xAAAABBBB_CCCCdddd
  • DataIn1=0xAAAABBBB
  • DataIn0=0xCCCCdddd

示例B:32位模式且 S0=1

  • S1=0, S0=1
  • 要写高半区对应的 32 位字
  • DataIn1=I[31:0]
  • DataIn0 虽也可能接着低32位,但不会写入,因为它的 W0=0
旁白引导: 这一页最容易错在一个点:很多人会把 芯片1 永远接高 32 位。
但你一看到题目那句“32位模式写入时,只使用输入的最低 32 位”,就要立刻反应:
谁被选中写,谁就得收到 I[31:0]
所以芯片1 的 DataIn 不能固定死,必须受 S1 控制。

7. (b) 写使能 Wi 的代数表达式

写使能的核心逻辑:
  • 64 位模式:两片一起写
  • 32 位模式:只写由 S0 选中的那一片
W0 = W(S1 + \overline{S1}\,\overline{S0})
W1 = W(S1 + \overline{S1}\,S0)

【更直观的分情况写法】

\text{若 } S1=1,\; W0=W,\; W1=W
\text{若 } S1=0,\; \begin{cases} S0=0 \Rightarrow W0=W,\; W1=0 \\ S0=1 \Rightarrow W0=0,\; W1=W \end{cases}

【知识点公式的每个变量对应题目条件】

【具体数值示例】

示例1

W=1,\; S1=1,\; S0=0
W0=1,\; W1=1

64 位模式,两片都写。

示例2

W=1,\; S1=0,\; S0=0
W0=1,\; W1=0

32 位模式,只写芯片0。

示例3

W=1,\; S1=0,\; S0=1
W0=0,\; W1=1

32 位模式,只写芯片1。

示例4

W=0
W0=0,\; W1=0

不写存储器,只读。

旁白引导: 你看写使能公式其实不是背出来的,而是由“模式 + 片选”直接翻译出来的。
训练时你要形成这个反射顺序:
先问当前是否写 → 再问 是64位模式还是32位模式 → 再问 32位模式下选哪一片
这个顺序一清楚,代数式只是把逻辑文字压缩成布尔表达式。

8. (c) 最终 64 位输出 O 的构造

8.1 先定义两片芯片的读出

X0 = \text{Chip0Out}[31:0]
X1 = \text{Chip1Out}[31:0]

8.2 64 位模式输出

O = X1 \,\|\, X0 \qquad (S1=1)

8.3 32 位模式输出

O = \begin{cases} 0^{32}\,\|\,X0, & S1=0,\;S0=0 \\ 0^{32}\,\|\,X1, & S1=0,\;S0=1 \end{cases}

【等价的电路实现思路】

输入
64位模式分支
32位模式分支
X1, X0
O64 = X1 || X0
O32 = 0^32 || MUX(S0; X0,X1)
S1
O = MUX(S1; O32, O64)

【具体数值示例】

示例A:64位模式读取

  • X1=0x12345678
  • X0=0xABCDEF00
  • S1=1
  • O=0x12345678ABCDEF00

示例B:32位模式读取芯片1

  • X1=0x13579BDF
  • S1=0, S0=1
  • O[31:0]=0x13579BDF
  • O[63:32]=0x00000000
  • O=0x0000000013579BDF
旁白引导: 这一页的关键词是 零扩展
题目已经明说:32 位模式读出来之后,数据只放在输出低 32 位,高 32 位全部设 0。
所以你看到“读取32位数据却输出64位总线”时,要立刻想到:
不是符号扩展,不是复制高位,而是强制补 0。

9. 完整解题模板:看到题目后如何秒切到答案

【解题线索】

  1. 先认出这是“同容量双组织”的 模式切换存储器 题。
  2. 再认出构件是“两片32位芯片并行”。
  3. 再分三层写:
    • (a) 地址与输入数据怎么接
    • (b) 写使能怎么分配
    • (c) 输出怎么构造

【套用公式与求解步骤】

Step 1: 地址脚先写成最简单形式:两片都接 A
Step 2: 64 位模式时两片并行:Chip1←I[63:32]Chip0←I[31:0]
Step 3: 32 位模式时被选中的芯片必须接到 I[31:0]
Step 4: 写使能按“64位两片全开 / 32位只开一片”写成布尔式
Step 5: 输出按“64位拼接 / 32位零扩展”画两条分支,再用 S1

【最终标准答案】

\textbf{(a)}\quad Addr0=A,\; Addr1=A
\textbf{(a)}\quad DataIn0=I[31:0]
\textbf{(a)}\quad DataIn1= \begin{cases} I[63:32], & S1=1 \\ I[31:0], & S1=0 \end{cases}
\textbf{(b)}\quad W0 = W(S1+\overline{S1}\,\overline{S0})
\textbf{(b)}\quad W1 = W(S1+\overline{S1}\,S0)
\textbf{(c)}\quad O64 = X1 \,\|\, X0
\textbf{(c)}\quad O32 = 0^{32}\,\|\,MUX(S0;X0,X1)
\textbf{(c)}\quad O = MUX(S1; O32, O64)
旁白引导: 训练的目标不是这题会做一次,而是下一次看到同类题,能在几秒内自动分类:
“这是双模式存储器题 → 先分模式 → 再分地址/写/输出三部分。”
只要这个心智模型固定下来,你不仅能做这题,也能迁移到 寄存器文件多银行存储器字宽扩展地址空间扩展 的题。

10. 最强条件反射清单

看到 “2^k 个64位字 / 2^(k+1) 个32位字”

马上想到:同容量双组织,地址会多1位。

看到 “两个32位芯片”

马上想到:64位模式并行拼接,32位模式片选访问。

看到 “S0 A...”

马上想到:S0 是高位逻辑地址,最终落成片选。

看到 “读32位但输出64位”

马上想到:低32位放数据,高32位补0。

旁白引导: 真正的高手不是会推一遍,而是看到线索就自动激活模板。
你要训练到这种程度:题目还没看完,你脑中已经出现 两片芯片 + 两条模式分支 + 一条输出MUX树 的结构图。