实验目的
算术逻辑运算单元(ALU)的基本构成,掌握 Logisim 中各种运算组件的使用方法,熟悉多路选择器的使用,能利用前述实验完成的32位加法器、 Logisim 中的运算组件构造指定规格的 ALU 单元。
实验内容
1、实验封装好的32位加法器以及 Logisim 平台中现有运算部件,构建一个32位算术逻辑运算单元(禁用 Logisim 系统自带的加法器,减法器),可支持算术加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移运算,支持常用程序状态标志(有符号溢出 OF 、无符号溢出 UOF ,结果相等 Equal ),ALU 功能以及输入输出引脚见后表,在主电路中详细测试自己封装的 ALU ,并分析该运算器的优缺点。
2、电路框架
3、电路引脚及ALUOP功能表
4、电路测试
电路框架提供了自动测试子电路,也可以自行评分,具体测试电路如下图所示:
实验过程
1. 创建新的 Logisim 电路文件。在 Logisim 中创建新的电路文件,并命名为“ALU”。
2.添加输入输出引脚。根据表格中的输入输出引脚添加对应的输入输出端口,包括 x、y(两个32位操作数)、op(4位运算符)、cin(加减运算中的进位/借位)和输出 z(32位运算结果)、OF、UOF、Equal、cout(加减运算中的进位/借位)。
3.添加 32 位加法器和状态标志寄存器。在 Logisim 的工具栏中选择 Add 工具,然后在窗口中找到 32 位加法器和状态标志寄存器组件,分别添加到电路中。
4.实现逻辑运算器。在 Logisim 的工具栏中选择 Add 工具,然后在窗口中找到 与门、或门、非门 和 异或门 元件,分别添加到电路中。
5.实现移位器。在 Logisim 的工具栏中选择 Add 工具,然后在窗口中找到 左移位、右移位和 右移算数 元件,分别添加到电路中。
6. 实现乘法器。采用 Booth 算法实现,由多个 32 位 Booth 子单元组成。
7. 实现除法器。采用 Restoring Division 算法实现,由多个 32 位 Restoring Division 子单元组成。
8.实现多路选择器。在 Logisim 的工具栏中选择 Add 工具,然后在窗口中找到 Multiplexer 元件,添加到电路中,并连接相应的输入和控制信号。
9. 连接 ALU 各个组件。根据电路框架设计,将各个组件按照要求连接起来,并仔细调整每个组件的参数和输入输出端口,确保它们能够正确地协同工作。
10. 测试 ALU 是否正常工作。进行全面的测试,包括加、减、乘、除、与、或、非、异或、逻辑左移、逻辑右移、算术右移运算是否正确,并检查状态标志是否正确。
11.分析 ALU 的优缺点。对 ALU 的实现原理、速度、功耗和可靠性等方面进行综合分析,并提出改进意见。
实验详细操作步骤
设计思路
先构造出每一种功能的输出,再根据OP的值来选择输出:
0~2:分别用一个移位器实现,设置对应的属性;
3~4:分别用自带的乘法器、除法器实现;
5:加法,用封装好的32位加法器,OF判断最高位进位和符号位进位是否一致,UOF判断是否有进位(需一个异或门),C0取0;
6:减法,用封装好的32位加法器,Y取反用一个非门实现,无符号数的减法溢出,带加减功能的ALU的进位取反后表示,有符号数的减法溢出,仍然用最高位和符号位是否相等来判断,C0取1;
7~10:分别用与门、非门、异或门、或非门实现;
11:比较器用补码型,结果0拓展;
12:比较器用无符号型,结果0拓展,还需要一个equal信号;
都构造好之后,根据OP的值输出resualt。
电路框架.
电路引脚
实验结果
疑难小结
本次实验是针对算术逻辑运算单元(ALU)的基本构成和 Logisim 中各种运算组件的使用方法进行的。通过实验,我深入了解了 ALU 的工作原理、状态标志的计算方法以及多种运算组件的使用方法,并具备了使用 Logisim 构建 ALU 的能力。
在实验过程中,我遇到了一些问题,比如
1.没有正确连接端口。在构建 ALU 时,一定要注意每个组件的输入输出端口是否正确连接,否则可能会导致电路无法正常工作。
2.组合逻辑实现的复杂度高。由于 ALU 采用组合逻辑实现,所以其复杂度很高,需要精心设计和调试。因此,在实验过程中,需要耐心地进行测试和分析,以确保 ALU 正常工作。
3. 测试向量选择不当。在测试 ALU 时,需要选择合适的测试向量,包括正常/异常情况和边界情况。如果测试向量选择不当,可能会导致测试结果不准确。
4.状态标志计算错误。ALU 中的状态标志计算复杂,需要仔细检查计算公式和实现方法,以确保结果正确。
5.缺乏可扩展性。由于 ALU 的实现方式比较固定,所以缺乏可扩展性。如果需要支持更多的操作或者提高性能,可能需要重新设计 ALU。但通过仔细检查和琢磨,最终都得到了解决。
通过本次实验,我还学习到了一些实用的调试技巧,比如使用仿真工具进行测试、采用分步调试的方式找出问题所在等,这些技巧对我的电路设计以及其他实验项目也有很大帮助。
最后,我认为本次实验的收获非常大,不仅提高了我的实验技能和编程能力,而且拓宽了我的知识面和思维方式。我将继续努力,在未来的实验中取得更好的成果。