实验目的
学生理解主存地址基本概念,理解存储位扩展基本思想,并能利用相关原理构建能同时支持字节、半字、字访问的存储子系统。
实验内容
Logisim 中 RAM 组件只能提供固定的地址位宽,数据输出也只能提供固定的数据位宽,访问时无法同时支持字节/半字/字三种访问模式,实验要求利用 4 个4 K*8 位的 RAM 组件进行扩展,设计完成既能按照 8 位、也能按 16 位、也能按照 32 位进行读写访问的 32 位存储器。
方案设计
-
整体设计思路:控制电路可以分成三部分:对输入的待存储数据的控制与划分,对RAM芯片的控制,对输出数据的控制。分成三部分的好处在于可以减小问题规模,同时优化电路结构,避免过于冗杂。半字访问时片选位为0时访问0和1RAM,片选位为1时访问2和3RAM。接下来讨论三部分电路的设计思路。
-
预处理:对输入的十二位地址和32位数据进行划分处理,方便后续操作。add1为低两位地址,用于字访问模式下的片选,add2为倒数第二位地址,用于半字访问模式下的片选。
-
输入控制:将输入的32位2进制待存数分成四个八位二进制数,In0,In1,In2,In3,然后分别讨论四个RAM组件的输入数据在不同访问模式下应该是多少,设输入到四个RAM组件的数据分别为IN0,IN1,IN2,IN3。IN0:任何控制模式下只能是In0(控制RAM组件在部分访问模式下不存取数据是RAM芯片芯片控制电路要干的事情,输入控制电路只要保证相应的RAM组件在需要存储数据的时候拿到正确的待存储数就可以了)。字访问时输入到四个RAM的数据分别为In0,In1,In2,In3;字节访问时输入到RAM的数据为In0;半字访问时输入到RAM的数据IN0和IN2为In0,IN1和IN3为In1。
-
RAM控制:通过对存储引脚str的控制来确保存储数据的正确性,一个RAM是否需要存储数据取决于使能端WE的输入和访问模式,可以将两者的结果两者的最终结果相与得到str的控制信号。通过解复用器分别得到在半字访问和字节访问模式下的片选信号,将不同模式下的片选信号做或运算即为访问模式对RAM产生的控制信号。
-
输出控制:思路上与输入控制相似,对最终结果的四个部分OUT0,OUT1,OUT2,OUT3分别进行控制,通过分线器拼成Dout。设RAM组件直接输出的结果分别为out0,out1,out2,out2,字访问模式下最终结果的四个部分分别为各个RAM组件的输出;字节访问模式下OUT0的结果为所选定的那个RAM组件的输出,其余为0;半字访问模式下根据所选RAM组件的不同OUT0为out0或out1,OUT1为out1或out3,OUT2和OUT3为0。
-
整体电路:
实验步骤
- 弄清电路要求,弄清各个引脚的功能。
- 构思整体思路,对控制电路进行功能划分。
- 分别设计三部分控制电路。
- 连接各部分电路。
- 测试发现bug,修改电路。
- 总结收获。
故障与调试
- 遇到的第一个bug是实验电路不输出结果,原因在于使用的片选引脚进行RAM组件的控制,这样的设计会使得未被选中的的RAM不输出结果,而在实验所给的测试样例中无论是否为本次操作选到的RAM组件,都要输出对应RAM中存储的数据。借此机会也弄清了输入输出的逻辑,在一次脉冲中输出的数据为此脉冲来到的前一瞬间对应RAM中存储的数据。
- 发现上面第一个bug后在测试之前同时修改了存在的第二个bug:没有考虑WE端。
- 继续测试发现当访问模式不为字访问时输出结果错误,具体表现为访问一个没有存储过数据的地址输出结果不为0。把出现错误的区域锁定在了输出控制部分,因为在RAM控制电路部分的地址输入是直接从输入的地址中提取的,问题出在这个地方的概率很低。错误在于将RAM输出的结果作或运算得到最终输出,应该用多路选择器做数据选择。
- 同理,半字访问下的输出结果也是错的,测试到半字访问时将电路一并做了修改。
- 半字访问的地址提取错误,应该是倒数第二位,还有一些类似的接错引脚,连电路的时候接着发现并修改了。
测试与分析
- 通过给定的测试电路与平台线上测试的方式找到了输出错误的样例,最终将电路修改正确。
实验总结
- 通过本次实验,我进一步优化了设计逻辑电路的方法,通过将问题划分的方式可以大幅降低问题的复杂规模,降低设计难度。同时,我发现了调试电路时与平时调试程序的共性:遇到bug按出错概率从高到低检查验证各部分电路,可以大大提高调试效率。本次实验使我受益匪浅。