1. 实验环境准备与Logisim入门
第一次打开Logisim时,很多同学会被满屏的逻辑门和连线吓到。别担心,我们先从最基础的开始。建议下载最新版的Logisim-evolution(版本2.15+),这个分支版本修复了原版的许多bug,对中文支持也更好。安装完成后,你会看到左侧的组件栏大致分为五类:导线工具、电路元件、存储器组件、输入输出设备以及布线工具。
新手必看操作技巧:
- 按住Ctrl键滚动鼠标可以放大缩小画布
- 右键点击组件选择"查看属性"可以修改参数
- 使用快捷键"Ctrl+Shift+C"可以快速复制选中电路
- 文本标注功能在工具栏的"A"图标处
存储系统实验最常用的几个组件:
- 存储器类:ROM(只读存储器)、RAM(随机存储器)、Register(寄存器)
- 组合逻辑:Multiplexer(多路选择器)、Decoder(译码器)、Bit Extender(位扩展器)
- 布线工具:Splitter(分线器)、Tunnel(隧道标签)
提示:实验前建议在"项目→选项→电路"中勾选"模拟器偏好→在添加时显示点",这样连接导线时会显示连接点提示。
2. 汉字字库扩展实验详解
这个实验的核心是要用4片4K×32位的ROM替代1片16K×32位的ROM。听起来像用多个小容量芯片拼成一个大容量芯片?没错,这就是典型的字扩展技术。
2.1 地址线连接原理
原始16K ROM需要14根地址线(因为2^14=16K),而4K ROM只需要12根地址线。多出的2根地址线(A12、A13)正好可以用来做片选信号。具体连接方式:
- 将A0-A11直接连接到所有4片ROM的地址输入端
- A12、A13接入2-4译码器的输入端
- 译码器的4个输出端分别连接4片ROM的片选端
示例电路结构: 地址总线[13..0] → 低位[11..0] → ROM0-3的A[11..0] 高位[13..12] → 2-4译码器 → ROM0-3的CS2.2 数据线处理技巧
由于每片ROM都是32位输出,我们需要用三态门控制输出:
- 为每片ROM的输出添加三态门
- 将译码器输出连接到对应三态门的使能端
- 所有三态门输出并联到最终的数据总线
常见坑点:
- 忘记设置ROM的地址位宽属性(默认是8位需要手动改为12位)
- 三态门方向接反(箭头方向应该指向总线)
- 译码器使能端未接地(会导致输出全为高阻态)
2.3 测试验证方法
加载测试字库数据时要注意:
- 右键点击ROM选择"编辑内容"
- 导入格式为纯文本的十六进制数据文件
- 使用探针工具检查关键节点的信号
- 逐步改变地址输入,观察输出是否符合预期
3. MIPS RAM设计实战
这个实验要实现支持字节/半字/字访问的32位存储器,关键在于理解地址对齐和片选逻辑。
3.1 访问模式解码
根据实验要求,访问模式由地址最低两位决定:
- 00:字访问(32位)
- 01:字节访问(8位)
- 10:半字访问(16位)
实现方案:
- 使用1-2译码器处理Mode[1]信号
- Mode[0]作为字节选择信号
- 通过AND门组合生成最终的片选信号
3.2 存储器阵列设计
建议采用4个8位RAM组成32位存储器的方案:
- 将32位数据总线拆分为4个8位段
- 每个8位RAM对应一个字节单元
- 地址总线[31..2]连接到所有RAM
- 最低两位用于生成片选信号
关键电路: Mode[1:0] → 控制逻辑 → RAM0_CS (字节0使能) RAM1_CS (字节1使能) RAM2_CS (字节2使能) RAM3_CS (字节3使能)3.3 读写控制实现
写入时要特别注意数据覆盖问题:
- 字写入时使能所有4个RAM
- 半字写入时根据地址最低位使能2个RAM
- 字节写入时只使能1个RAM
- 使用多路选择器组合读取结果
4. 寄存器文件设计与优化
MIPS寄存器文件本质上是一个特殊的多端口存储器,需要支持:
- 2个32位读端口
- 1个32位写端口
- 5位寄存器地址输入
4.1 基本结构设计
推荐使用层次化设计方法:
- 底层:32个32位寄存器(用D触发器实现)
- 中层:2个32选1多路选择器(读端口)
- 顶层:写使能逻辑(时钟上升沿触发)
性能优化技巧:
- 使用Logisim的"Register File"组件可以快速搭建基础结构
- 对读端口添加输出寄存器可以改善时序
- 写优先设计可以解决读写冲突
4.2 关键信号处理
特别注意这些信号的处理:
- 写使能信号(RegWrite)需要与时钟同步
- 寄存器0要特殊处理(始终保持输出0)
- 异步复位信号要连接到所有寄存器
寄存器0特殊处理方案: MUX32输出 → AND门阵列(与~RegAddr[4..0]相与)→ 最终输出5. Cache硬件设计精讲
直接相联映射Cache的实现需要处理好三个关键部分:
- 地址划分(Tag/Index/Offset)
- 数据查找电路
- 替换策略实现
5.1 地址字段划分
根据实验要求(16位地址,8行Cache,块大小4字):
- Offset[1:0]:字选择(2位)
- Index[4:2]:行选择(3位)
- Tag[15:5]:标签位(11位)
5.2 命中判断逻辑
实现步骤:
- Index译码选择对应Cache行
- 比较Tag字段与存储的Tag值
- 检查有效位Valid
- 三个条件同时满足时产生Hit信号
关键电路:
- 使用XOR门进行Tag比较
- AND门组合Valid和比较结果
- 或门汇总所有行的命中信号
5.3 替换策略实现
直接相联映射的替换最简单:
- Miss信号触发写操作
- 行译码信号选择要更新的行
- 下一个时钟上升沿更新Valid、Tag和Data
实际调试时建议:
- 先静态测试(固定输入检查输出)
- 再动态测试(用时钟信号驱动)
- 最后全功能测试(随机访问模式)
完成所有模块后,记得使用Logisim的组合分析工具检查电路逻辑,这能帮你发现潜在的竞争冒险问题。存储系统实验虽然复杂,但当你看到最终电路正确运行的那一刻,所有的努力都会变得值得。