作者:赵lamarta | 来源:互联网 | 2023-08-11 12:15
实验目的
掌握原码一位乘法运算的基本原理,熟练掌握 Logisim 寄存器电路的使用,能在 Logisim 平台中设计实现一个 8*8 位的无符号数乘法器。
设计要求
在 alu.circ 文件中原码一位乘法器子电路中增加控制电路和数据通路使得该电路能自动完成 8 位无符号数的一位乘法运算,设置引脚初始值,然后驱动时钟自动仿真,电路可自动完成运算,运算结束结果传输到输出引脚,运算结束时电路应该自动停止。
方案设计
无符号原码一位乘的计算&#xff1a; 维护一个部分积&#xff0c;初始为0&#xff0c;每次取乘数b的最低位&#xff0c;如果最低位为1&#xff0c;部分积&#61;部分积&#43;乘数a&#xff0c;如果最低位为0&#xff0c;部分积&#61;部分积&#43;0&#xff1b;然后将部分积右移一位&#xff08;如果刚刚的运算没有发生进位&#xff0c;最高位补0&#xff09;&#xff0c;同时将乘数b右移一位。第i次&#xff08;i<&#61;8&#xff09;对部分积的右移操作移出来的数为最终乘积的第i低位&#xff0c;8次结束后的部分积为最终乘积的高8位。该计算方法本质是计算乘数a与乘数b的各位相乘得到的部分积&#xff0c;然后将所有的部分积相加。
实验电路的设计&#xff1a;需要实现的部分操作与实现思路如下&#xff1a;
-
对部分积作加运算时对加数0或乘数a的选择&#xff1a;用多路选择器实现&#xff0c;选择依据为乘数b的当前最低位&#xff0c;最低位的选择用了分线器来实现。

-
对所维护的部分积作加运算&#xff1a;用8位串行加法器实现。

-
对部分积的右移和对乘数b的右移&#xff1a;用四组八位宽的分线器实现。其中新部分积的最高位由串行加法器的进位得到&#xff0c;乘数b的最高位由部分积右移出来的那一位得到&#xff0c;这么做的好处是省空间&#xff0c;高效率&#xff0c;运算完成后的部分积就是乘积的低八位。

-
部分积与乘数b的保存&#xff1a;两个寄存器实现&#xff0c;输出的数据既用于下次运算&#xff0c;也在运算完成后作为成绩结果输出。

-
边界情况的处理&#xff1a;用一个计数器来统计脉冲次数&#xff0c;以此对边界情况做特殊处理。

实验电路图

实验步骤
- 理解原码一位乘法的方法。
- 分析用到的部件的作用。
- 针对做原码一位乘法中需要的操作&#xff0c;实现各个操作的逻辑电路。
- 对边界情况出现的问题进行分析与修改。
故障与调试
在本次实验中遇到了两个较大的问题&#xff0c;对于部分复用器具体实现的功能的误解与对边界情况故障的调试。
-
前者问题主要出在寄存器&#xff0c;多路选择器和分线器上&#xff1a;所用寄存器不是上学期在数字逻辑中讨论较多的一维寄存器&#xff0c;本实验所用寄存器只是用来暂存数据的。多路选择器的功能是对两个八位数据的二选一&#xff0c;一开始理解的是上学期接触的那种两部分输入&#xff0c;一部分是数据&#xff0c;一部分用来对数据的选择的多路选择器&#xff0c;这对我设计实验电路中的数据选择部分造成了一定的困难。分线器之前没有用过&#xff0c;其实功能很简单&#xff0c;相当于实现了一个对数据的“合并”操作。
-
第二个问题出在对边界情况的处理上&#xff0c;具体来说是第一个与最后一个脉冲。在人为的模拟这个过程的时候看起来步骤简单且一致&#xff0c;但实际上要在模拟电路中实现这样一个“有序的循环”&#xff0c;要对边界情况做合理的处理。首先第一个脉冲应该是将初始的乘数b送进寄存器里&#xff0c;之后是该寄存器的数据存的是上一次右移的乘数与部分积右移出来的那一位的拼接&#xff0c;因此这个地方要用一个多路选择器来实现&#xff0c;选择依据为计数器的当前值&#xff0c;用了一个比较器和一个Load隧道实现。当8次正式的运算循环结束后&#xff08;第九个脉冲&#xff0c;计数器为8&#xff09;部分积为乘积高八位&#xff0c;此时的在电路中的乘数b为乘积的低八位&#xff0c;此时应忽略脉冲&#xff0c;并将寄存器中的结果输出&#xff0c;用了一个比较器和Stop隧道实现。
测试与分析

实验总结
本次实验暴露出了一些自身存在的问题&#xff0c;对一些复用器功能的不熟悉&#xff0c;设计逻辑电路的方法与步骤不够科学。但通过本次实验&#xff0c;我理解了原码一位乘法的原理&#xff0c;并且对于部分复用器的使用更加熟练&#xff0c;优化了逻辑电路的设计的方法。本次实验使我收益匪浅。