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) 画出两片芯片的
DataIn 与 Addr
- (b) 写出输入到芯片
i 的 Wi 代数式
- (c) 画出最终 64 位输出
O 的电路
1. 知识点:存储器接口的标准读写模型
一个标准存储器接口由 地址、数据输入、写使能、数据输出 组成。
读:给地址,取出该地址内容。
写:给地址 + 给输入数据 + 令写使能为1。
Read: O = M[A] (当 W=0 时)
Write: M[A] ← I (当 W=1 时)
【题目线索就想到什么】
- 看到
W=1:马上想到“这是写,不是单纯读”。
- 看到
Addr:马上想到“最终每种模式都必须明确到底访问哪一个地址”。
- 看到
DataOut:马上想到“最终输出是否需要拼接、截断、补零”。
【题目示例】
例如若某个 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
【题目线索】
- 看到 “可存 2^k 个64位字,或者 2^(k+1) 个32位字”,马上想到:这是同一块容量在两种组织方式下的切换。
- 于是自然想到:S1 应该在控制“按64位看”还是“按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]
【题目线索】
- 看到“用两个32位字、2^k地址芯片构建”——马上想到:这不是“增加地址数”,而是先要“增加字宽”。
- 64位模式下两片一起工作;32位模式下则只写其中一片、只读其中一片。
【具体数值示例】
若
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:决定上半区 / 下半区
- 其余
k 位 A:作为片内地址
【题目线索】
- 看到
S0A[k-1:0]:马上想到 S0 不是进芯片地址脚,而是“决定哪一片芯片被选中”。
- 因为每片芯片本身只有
k 位地址脚。
【具体数值示例】
设
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 位那份数据。
【具体电路思维】
- 芯片0 的 DataIn 可直接接
I[31:0]
- 芯片1 的 DataIn 需要一个 2-to-1 MUX:
S1=1 选 I[63:32]
S1=0 选 I[31:0]
【题目示例】
示例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}
【知识点公式的每个变量对应题目条件】
W:题目给定的总写使能
S1:模式位,1 表示 64 位模式
S0:32 位模式下的半区选择位
Wi:送到芯片 i 的片内写使能
【具体数值示例】
示例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}
【等价的电路实现思路】
- 先用一个 2-to-1 MUX 根据
S0 在 X0 和 X1 中选出“32位模式下的有效32位输出”
- 再把该结果送到
O[31:0]
- 同时把
O[63:32] 在 32 位模式强制接全 0
- 最后再用
S1 控制:输出是“64位拼接结果”还是“32位零扩展结果”
X1, X0
O64 = X1 || X0
O32 = 0^32 || MUX(S0; X0,X1)
【具体数值示例】
示例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. 完整解题模板:看到题目后如何秒切到答案
【解题线索】
- 先认出这是“同容量双组织”的 模式切换存储器 题。
- 再认出构件是“两片32位芯片并行”。
- 再分三层写:
- (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树 的结构图。