1. 从零开始:为什么我们需要一个“聪明”的存储器?
如果你刚开始接触计算机组成原理,或者正在用Logisim捣鼓MIPS处理器,你可能会发现一个挺让人头疼的问题:Logisim自带的那个RAM组件,用起来有点“死板”。它就像一个固定大小的储物格,你每次去存取东西,都必须以整个“格子”为单位。在MIPS的世界里,我们的数据有不同的大小:有时候是一个字节(8位,比如一个字符),有时候是半字(16位,比如一个短整数),有时候是一个完整的字(32位,比如一个整数或指令)。如果每次存取,不管数据多大,都必须动32位,那不仅浪费,而且很多程序(尤其是处理文本、音频数据的)根本没法写。
这就像你去仓库取东西,仓库管理员告诉你,最小的取货单位是一个大集装箱(32位)。你只想拿一盒饼干(8位),对不起,不行,你必须把整个集装箱搬走,然后把饼干拿出来,再把剩下的东西塞回去。这效率得多低啊!所以,我们得自己动手,设计一个更“智能”的仓库管理系统。这个系统要能看懂你的取货单(访问模式),你要一盒饼干,它就精准地给你那一盒;你要半箱货,它就给你对应的两盒;你要整箱,它就把整个集装箱给你。
这就是我们这次要做的核心工作:利用Logisim,把4个“死板”的、只能按字节(8位)访问的小RAM,组合成一个“聪明”的、能灵活支持字节、半字、字三种访问模式的32位大存储器。听起来是不是有点像用乐高积木拼出一个变形金刚?没错,硬件设计的乐趣就在于此。接下来,我会带你一步步拆解这个设计,从理解地址的“暗语”开始,到搭建数据通路,最后完成整个控制逻辑。我保证,即使你是第一次接触Logisim,跟着我的思路和截图,也能把这个“智能仓库”给搭出来。
2. 庖丁解牛:理解地址与数据的“语言”
在动手接线之前,我们必须先统一“语言”。我们的设计有几个关键的输入输出信号,它们就像仓库管理系统的操作指令单,我们必须彻底读懂它们。
2.1 地址(Addr):它到底在指哪里?
我们的地址输入 Addr 是一个12位的信号。这里有一个非常关键,也是新手最容易混淆的概念:这是一个字节地址。什么叫字节地址?就是说,这个地址的每一个数字,指向的是内存中的一个字节(8位)的位置。
我们的目标是构建一个32位(4字节)宽的存储器。你可以把它想象成一栋4层楼的小公寓,每层楼住着一个字节的数据。那么,这个12位的字节地址,其实包含了两个信息:
- 公寓楼号(块内地址):地址的高10位(
Addr[11:2])。它告诉我们是哪一栋“32位公寓”。因为每栋公寓有4个字节,所以地址每次增长4,才指向下一栋公寓。这高10位就是用来寻址这栋公寓本身的。 - 楼层号(片选地址):地址的低2位(
Addr[1:0])。它告诉我们,在这栋公寓里,我们要访问的是第几层(第几个字节)。00对应一楼(字节0),01对应二楼(字节1),10对应三楼(字节2),11对应四楼(字节3)。
不同的访问模式,看待这个地址的方式也不同:
- 字访问(32位):我就要整栋公寓。所以我不关心你具体住哪层,我直接找到公寓楼就行。因此,忽略低2位,直接用高10位地址去同时选中4个RAM。
- 半字访问(16位):我要半栋公寓(连续的两层)。在MIPS架构中,半字访问要求地址是2字节对齐的,也就是说地址的末位(
Addr[0])必须是0。实际上,我们关心的是要上半部分(字节0和1)还是下半部分(字节2和3)。这由地址的倒数第二位(Addr[1]) 决定。如果Addr[1]=0,我们选中低半字(RAM0和RAM1);如果Addr[1]=1,我们选中高半字(RAM2和RAM3)。 - 字节访问(8位):我只要某一层。这时,低2位(
Addr[1:0]) 就直接指明了要访问哪一个具体的RAM(0,1,2,3)。
理解地址的这层含义,是整个设计的地基。你可以先在纸上画一画这个“公寓楼”的示意图,把地址高低位和RAM的对应关系标清楚,后面设计电路时思路会清晰很多。
2.2 数据与模式:我们存什么、怎么存?
数据输入 Din 是32位宽。这里有一个重要的原则:无论你要存的是一个字节、半字还是字,有效数据都放在这32位的最低部分。比如你要存一个字节数据 0xAB,那么你应该把它放在 Din[7:0] 的位置,而 Din[31:8] 的部分在写入时会被忽略。这简化了我们的设计,我们只需要从 Din 的低位提取数据即可。
模式控制

436

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



