实验目的
学生理解算术逻辑运算单元(ALU)的基本构成,掌握 Logisim 中各种运算组件的使用方法,熟悉多路选择器的使用,能利用前述实验完成的 32 位加法器、 Logisim 中的运算组件构造指定规格的 ALU 单元。
设计要求
利用前面实验封装好的 32 位加法器以及 logisim 平台中现有运算部件构建一个 32 位算术逻辑运算单元(禁用 Logisim 系统自带的加法器,减法器),可支持算术加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移运算,支持常用程序状态标志(有符号溢出 OF 、无符号溢出 UOF ,结果相等 Equal ),ALU 功能以及输入输出引脚见后表,在主电路中详细测试自己封装的 ALU ,并分析该运算器的优缺点。
方案设计
- 整体框架:将加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移分别进行运算并得到结果,通过多路选择器将所选运算方式对应的结果给Result,乘除运算时将高位结果或余给Result2,其余情况Result2结果为0。
- 加减溢出判断:首先对本次实验所给的32位加法器功能进行测试,可见,当两个输入为4e9的时候,无符号加法运算发生溢出(图五),输入为2^31-1和1时有符号加法运算发生溢出(图一),因此uof加连C32引脚,of加连C31引脚。当减数大于被减数时,无符号减法发生溢出,因此可用比较器通过对x和y的比较得到uof减,of减可直接通过加法器引脚得到(x补+(-y)补的溢出等价于有符号加法的溢出)。
- 移位:根据实验要求取y的低五位作为所移位数,可用分线器实现位选择。
- 两数比较:应将结果进行位扩展来保证数据位数的统一。
- 整体电路:
实验步骤
- 弄清题目要求已经所给引脚的用途。
- 对本次实验所给32位加法器进行测试。
- 连接电路主体。
- 分析测试,找bug。
- 总结收获
故障与调试
-
本次实验出现了一系列bug,调试时花了较多时间。
-
忘记对减数取补码。
-
首先是溢出的判断错误,第一轮芯片功能测试之后得到了错误的判断方法,主要原因在于没有理解两个溢出的含义,加法溢出判断的两个引脚弄反,修改提交之后还是出现错误,分析后发现无符号减法运算的判断不能直接通过芯片的引脚(减数符号位为1,无符号溢出位永远为0),应当通过对运算数真值的比较得出。
-
连接将乘法运算高位或除法余数位结果输出给Result2的电路时出现了上上次实验出现的问题,电路较密集时连接出错。
-
没有看清题目要求,左移右移取的是y低五位,而不是全部。
-
在电路连接的过程中多次出现了数据位宽不匹配的问题,这种错误较好修改。
测试与分析
- 优缺点分析:首先是缺点,本次实验要求得到给定运算方式的结果,而我所连接电路是将所有运算完成后根据所选择的运算方式将对应结果输出,我认为这样做浪费电。还有就是效率问题,不同运算所需运算的时间不同,该方案完成一次运算所需时间是所有运算时间的最大值,运算效率较低。优点:我认为该设计方案的优点在于当需要对同一组数据做不同运算时,对资源的占用相对较低。
实验总结
通过本次实验,我加深了对ALU基本构成的理解,同时对于部分运算器芯片的使用更加熟练,巩固了在无符号和有符号运算下加减法溢出判断的方法。本次连接电路时因低级错误耗费时间较多,今后实验我应更加仔细的弄清实验电路要求,并在连接时避免产生低级错误。