logisim实验三:原码一位乘法器设计实验

实验目的

掌握原码一位乘法运算的基本原理,熟练掌握 Logisim 寄存器电路的使用,能在 Logisim 平台中设计实现一个 8*8 位的无符号数乘法器。

设计要求

在 alu.circ 文件中原码一位乘法器子电路中增加控制电路和数据通路使得该电路能自动完成 8 位无符号数的一位乘法运算,设置引脚初始值,然后驱动时钟自动仿真,电路可自动完成运算,运算结束结果传输到输出引脚,运算结束时电路应该自动停止。

方案设计

无符号原码一位乘的计算: 维护一个部分积,初始为0,每次取乘数b的最低位,如果最低位为1,部分积=部分积+乘数a,如果最低位为0,部分积=部分积+0;然后将部分积右移一位(如果刚刚的运算没有发生进位,最高位补0),同时将乘数b右移一位。第i次(i<=8)对部分积的右移操作移出来的数为最终乘积的第i低位,8次结束后的部分积为最终乘积的高8位。该计算方法本质是计算乘数a与乘数b的各位相乘得到的部分积,然后将所有的部分积相加。
实验电路的设计:需要实现的部分操作与实现思路如下:

  • 对部分积作加运算时对加数0或乘数a的选择:用多路选择器实现,选择依据为乘数b的当前最低位,最低位的选择用了分线器来实现。
    在这里插入图片描述

  • 对所维护的部分积作加运算:用8位串行加法器实现。
    在这里插入图片描述

  • 对部分积的右移和对乘数b的右移:用四组八位宽的分线器实现。其中新部分积的最高位由串行加法器的进位得到,乘数b的最高位由部分积右移出来的那一位得到,这么做的好处是省空间,高效率,运算完成后的部分积就是乘积的低八位。
    在这里插入图片描述

  • 部分积与乘数b的保存:两个寄存器实现,输出的数据既用于下次运算,也在运算完成后作为成绩结果输出。
    在这里插入图片描述

  • 边界情况的处理:用一个计数器来统计脉冲次数,以此对边界情况做特殊处理。

在这里插入图片描述

实验电路图
在这里插入图片描述

实验步骤

  • 理解原码一位乘法的方法。
  • 分析用到的部件的作用。
  • 针对做原码一位乘法中需要的操作,实现各个操作的逻辑电路。
  • 对边界情况出现的问题进行分析与修改。

故障与调试

在本次实验中遇到了两个较大的问题,对于部分复用器具体实现的功能的误解与对边界情况故障的调试。

  • 前者问题主要出在寄存器,多路选择器和分线器上:所用寄存器不是上学期在数字逻辑中讨论较多的一维寄存器,本实验所用寄存器只是用来暂存数据的。多路选择器的功能是对两个八位数据的二选一,一开始理解的是上学期接触的那种两部分输入,一部分是数据,一部分用来对数据的选择的多路选择器,这对我设计实验电路中的数据选择部分造成了一定的困难。分线器之前没有用过,其实功能很简单,相当于实现了一个对数据的“合并”操作。

  • 第二个问题出在对边界情况的处理上,具体来说是第一个与最后一个脉冲。在人为的模拟这个过程的时候看起来步骤简单且一致,但实际上要在模拟电路中实现这样一个“有序的循环”,要对边界情况做合理的处理。首先第一个脉冲应该是将初始的乘数b送进寄存器里,之后是该寄存器的数据存的是上一次右移的乘数与部分积右移出来的那一位的拼接,因此这个地方要用一个多路选择器来实现,选择依据为计数器的当前值,用了一个比较器和一个Load隧道实现。当8次正式的运算循环结束后(第九个脉冲,计数器为8)部分积为乘积高八位,此时的在电路中的乘数b为乘积的低八位,此时应忽略脉冲,并将寄存器中的结果输出,用了一个比较器和Stop隧道实现。

测试与分析

在这里插入图片描述

实验总结

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

### 如何在Logisim中实现原码一位乘法器设计与仿真 #### 1. 设计原理 原码一位乘法是一种基本的二进制乘法算法,在每次迭代过程中,通过判断当前位是否为`1`来决定是否将被乘数加入到部分积中。具体来说: - 如果乘数的最低有效位(LSB)为`1`,则将被乘数加到当前的部分积上; - 随后,无论该位是`0`还是`1`,都将整个部分积以及剩余未处理过的乘数向右移动一位。 此过程重复执行直到所有位都被处理完毕[^3]。 #### 2. 构建组件 为了完成上述操作,需要构建几个主要的功能模块: - **寄存器**用于存储中间计算结果、最终输出以及其他必要的变量。 - **全加器**负责执行实际的加法运算。 - **多路选择器**用来根据条件选择不同的输入作为下一轮循环的新值的一部分。 这些都可以利用Logisim内置元件库轻松搭建起来[^1]。 #### 3. 实现细节 以下是创建这样一个8×8位无符号整数相乘电路的具体方法: ##### 初始化设置 - 创建两个8-bit宽度的输入端口分别代表被乘数\(X\)和乘数\(Y\)[^4]。 ##### 主体结构布局 - 使用组合逻辑建立一个多级流水线式的架构,其中每一阶段都包含了一个全加器加上一对能够同步更新的状态保持单元——即所谓的“累加器”(Accumulator) 和 “移位寄存器” (Shift Register),它们共同构成了核心的数据路径。 ##### 控制机制 - 添加一个计数器以跟踪正在进行的是哪一次迭代;当达到预设的最大次数时触发结束标志并锁定进一步的变化。 - 利用状态机或者其他形式的控制器协调各个部件之间的交互动作序列,比如何时加载初始值、什么时候应该做加法而不是简单的传递原有数值等。 ```circuit // 这里展示的是简化版的概念示意伪代码而非真实的Logisim文件, // 用户需按照平台指南自行转换成对应的图形化配置。 module OneBitMultiplier { input wire [7:0] multiplicand; // 被乘数 X input wire [7:0] multiplier; // 乘数 Y reg [15:0] product = 0; always @(posedge clk or negedge rst_n) if (!rst_n) product <= 0; else begin for(int i=0;i<8;i=i+1){ if(multiplier[i]) product += {multiplicand, {(8-i){1'b0}}}; // 右移product准备下次迭代 product = product >> 1; } end } ``` 请注意这段C-like风格的描述仅作理解用途,并不适用于直接导入任何工具环境中运行。真正的实践应当基于所选开发环境的特点来进行调整优化。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈希表扁豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值