1. 从零开始:为什么我们需要一个“聪明”的存储器?
如果你刚开始接触计算机组成原理,可能会觉得“存储器”不就是个存东西的地方吗?CPU要什么数据,它给出去不就行了?我以前也是这么想的,直到我第一次在Logisim里尝试用MIPS处理器去读一个字节的数据,结果发现它一股脑儿给我返回了整整32位(4个字节)!那一刻我才明白,教科书上说的“按字节寻址”和我们在数字电路里实现的“按字寻址”,中间隔着一道需要我们自己动手搭建的桥梁。
这个实验的核心目标,就是搭建这座桥。我们手头只有最基础的“砖块”——Logisim自带的RAM组件。这个组件很“笨”,它每次访问只能以固定的宽度(比如8位)来读写一整块数据。但我们的MIPS处理器却很“挑食”,它有时候只想吃一个“字节”(8位,比如处理一个字符),有时候想吃一个“半字”(16位,比如处理一个短整数),有时候才需要吃一个完整的“字”(32位,比如处理一个整数或指令)。我们的任务,就是用4个这种“笨笨的”8位RAM,组合、控制,最终造出一个能听懂处理器这三种点餐需求的“聪明”存储器。
这不仅仅是连线游戏。理解这个过程,你才能真正搞懂计算机里最核心的“存储子系统”是怎么工作的。地址线到底传的是什么?数据总线上的数据如何分片存放?控制信号如何像交通警察一样指挥数据流动?这次设计,就是对这些概念最生动、最硬核的实践。我会带你一步步走完从分析、设计到最终在Logisim里实现的全过程,把我踩过的坑和总结的技巧都分享给你,保证你做完之后,对存储器的理解能上一个实实在在的台阶。
2. 庖丁解牛:深入理解我们的设计蓝图
在动手连线之前,我们必须像建筑师看蓝图一样,彻底搞清楚设计规格。这份“蓝图”就是实验要求,我们得逐条拆解,把每个输入输出信号的含义和它们之间的关系吃透。
2.1 信号引脚全解析:谁是谁,要干嘛?
我们的存储子系统就像一个黑盒子,外面连着好几根线,每根线都有明确的职责。我们先来认全它们:
- Addr (12位输入):这是字节地址。这是整个设计中最关键也最容易混淆的概念。它不是一个“字地址”,而是指向内存中某一个具体字节的位置。因为我们的总存储容量是32位(4字节)为一个单元进行扩展,但地址却细化到了字节,所以地址总线宽度需要足够寻址所有这些字节。12位地址能寻址 2^12 = 4096 个字节,也就是 1024 个32位字。
- Din (32位输入):要写入存储器的数据。无论处理器想写一个字节、半字还是字,数据都通过这32根线送来。这里有个重要原则:有效数据总是放在低位上。比如写一个字节,那么这个字节的数据应该放在Din[7:0](最低8位),而Din[31:8]这高24位在写入时会被我们设计的电路忽略掉。
- Mode (2位输入):访问模式控制信号,相当于处理器的“点餐指令”。
00:字访问(32位)01:字节访问(8位)10:半字访问(16位)- (通常
11可能未定义或保留)
- WE (1位输入):写使能信号。
1表示当前是写入操作,0表示是读出操作。这个信号是控制数据流向的总开关。 - Dout (32位输出):从存储器读出的数据。和Din类似,读出时,有效数据(一个字节、半字或字)会出现在Dout的低位部分,高位部分则由我们的电路自动补零。这保证了返回给处理器的数据格式总是规整的。
2.2 地址的奥秘:片选与块内地址的分离
12位的字节地址Addr,需要被我们“翻译”成4个8位RAM能听懂的语言。这4个RAM并排工作,每个负责存储一个字节。我们可以把它们想象成4个并排的储物柜(Bank),每个柜子有若干层(地址)。
- 低两位 Addr[1:0]:这是片选地址。它直接决定了当前要访问的字节落在哪个“储物柜”(哪个RAM组件)里。
00对应第0号RAM,01对应第1号,10对应第2号,11对应第3号。在字节访问模式下,这两位的值就是最终选择哪个RAM的依据。

430

被折叠的 条评论
为什么被折叠?



