多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【Logisim 本地搭建】手动版无符号 8 位乘法器的详细教程

【Logisim 本地搭建】手动版无符号 8 位乘法器的详细教程 1. 引言在数字逻辑与计算机组成原理的学习中乘法器是一个核心组件它展示了如何利用基本的逻辑门来实现复杂的算术运算。本教程将带领你在 Logisim 中构建一个手动版的无符号 8 位乘法器通过清晰的步骤和原理讲解让你掌握其设计与验证方法。本教程将使用Logisim Evolution 3.9.0和Logisim 2.7.1两个版本进行演示。*注如果出现连线正确却不知道什么原因报错保存后重新打开即可。2. 原理核心原理原码一位乘法无符号二进制乘法的原理与十进制乘法类似都是基于移位相加。对于一个8 位被乘数和一个8 位乘数其乘积最多为 16 位。本教程实现的乘法器采用“原码一位乘法”算法该算法将被乘数和乘数视为无符号整数。由于二进制只有“0”和“1”所以我们可以把乘法理解为加法将被乘数或是将“00000000”加到部分积上。逐位从低到高检查乘数的每一位如果乘数的这一位是“1”则加上被乘数否则加上“00000000”然后用同样的方法继续判断乘数的下一位。每次使用的那个乘数位用完后可以直接丢弃。每次加法结果的最后一位即下图蓝色数字在后续步骤不再参与运算所以我们可以提前存起来这样下一步就只用算8 位加法本教材的方法只使用 8 位加法器。例子如下图我们计算183 × 166 30378最终结果为 16 位011101101010101030378绿色为高 8 位01110110蓝色为低 8 位10101010。​核心算法移位相加法初始化用三个寄存器分别存储乘数 A最后会寄存积的低 8 位、被乘数 B和部分积 P最后会寄存积的高 8 位。其中P 初始为 0B在整个计算过程中保持不变P 、A在每轮循环后右移一位。检查乘数最低位观察A 寄存器的最低位即最右边一位是1 还是 0。条件选择加法如果 A 的最低位为 1则执行P P B如果为 0则P P 0即不变。整体右移将 P 和 A 拼接成一个 16 位的整体然后整体向右移动一位。P 的最低位移出后补入 A 的最高位这样 A 同时寄存未使用的乘数位和部分积的低位节省寄存器。A 的最低位即刚才已经检查过的那一位被直接丢弃。循环控制重复步骤 24共循环 8 次。输出结果8 次循环结束后P 中存储的是乘积的高 8 位A 中存储的是乘积的低 8 位。分别输出即得到 16 位最终结果。3. 准备工作在开始搭建之前请确保你已经准备好以下子电路8 位寄存器【Logisim 本地搭建】带时钟信号的简单 8 位寄存器的详细教程8 位三态门【Logisim 本地搭建】三态门的详细教程8 位加法器【Logisim 本地搭建】半加器、全加器与 8 位加法器的详细教程4. 搭建步骤新建电路新建一个电路命名为“Multiplier_8”。初始化寄存器从上到下放置 3 个8 位寄存器分别命名为“P”用于保存部分积、“A”用于保存乘数、“B”用于保存被乘数。Logisim EvolutionLogisim布置 P 寄存器放置 1 个多路复用器/数据选择器为了控制 P 的初始化设置选择位为 1数据位为 8。其“输入0”端连接 8 位常量“0”。其“输入1”端暂时置空。其“输出”端通过分线器/分离器连接P 寄存器的输入“D7~D0”。其“选择”端连接一个输入引脚“Load_P_Reg”。放置 1 个输入引脚“Clock_P_Reg”连接P 寄存器的输入“Clock”。Logisim EvolutionLogisim布置 A 寄存器放置 1 个多路复用器/数据选择器为了控制 A 的初始化设置选择位为 1数据位为 8。其“输入0”端通过分线器/分离器连接 8 个输入引脚“A_Reg7~A_Reg0”。其“输入1”端暂时置空。其“输出”端通过分线器/分离器连接A 寄存器的输入“D7~D0”。其“选择”端连接一个输入引脚“Load_A_Reg”。放置 1 个输入引脚“Clock_A_Reg”连接 A 寄存器的输入“Clock”。Logisim版的A 寄存器的“Clock”用“输入引脚”连接后续会报错必须换成“按钮”其他寄存器的“Clock”可以根据自己的习惯使用“按钮”或“输入引脚”Logisim EvolutionLogisim布置 B 寄存器放置 8 个输入引脚分别命名为“B_Reg7~B_Reg0”连接B 寄存器的输入“D7~D0”。放置 1 个输入引脚“Clock_B_Reg”连接 B 寄存器的输入“Clock”。Logisim EvolutionLogisim构建条件选择逻辑在B 存储器右边放置8 个与门各个与门的一个输入端分别连接B 寄存器的输出“Q7~Q0”另一个输入端连接A 寄存器的输出“Q0”。Logisim EvolutionLogisim构建寄存部分积逻辑在P 寄存器右边放置一个8 位寄存器命名为“P_Buffer”用于缓冲数据。将P_Buffer 寄存器的输入“D7~D0”连接P 寄存器的输出“Q7~Q0”。放置 1 个输入引脚“Clock_PB_Reg”连接P_Buffer 寄存器的输入“Clock”。P 寄存器和P_Buffer 寄存器中间的导线称为“线路1”部分积将寄存到这段导线中切断了组合逻辑反馈环路为加法器提供稳定的输入。Logisim EvolutionLogisim构建加法逻辑放置一个8 位加法器。将P_Buffer 寄存器的输出“Q7~Q0”连接到加法器的输入“A7~A0”。将8 个与门的输出端连接到加法器的输入“B7~B0”。加法器的进位输入“Cin”可以置空Logisim版不能置空可以接一个常量“0”或接地。加法器的输出“Cout~S0”连接 1 个9 位分线器/分离器高位在上低位在下。为了方便观察数据可以在加法器和分线器中间加上 9 个LED 灯。Logisim EvolutionLogisim构建移位逻辑在P 寄存器左边放置 1 个9 位分线器①和 1 个8 位分线器②。在A 寄存器右边放置 1 个8 位分线器③。9 位分线器①的输入端连接加法器分线器的输出。其“8~1”位输出端连接8 位分线器的“7~0”位输入。其“0”位输出端连接8 位分线器③的“7”位输入。8 位分线器②的输出连接P 寄存器的多路复用器的“输入1”端。8 位分线器③的“6~0”位输入连接A 寄存器的输出“Q7~Q1”其输出端连接A 寄存器的多路复用器的“输入1”端。Logisim EvolutionLogisim构建输出逻辑放置 2 个8 位三态门分别命名为“High”和“Low”。High 8 位三态门的输入端“A7~A0”连接P_Buffer 寄存器的输出“Q7~Q0”输入端“EN”连接 1 个输入引脚“EN_H”。Low 8 位三态门的输入端“A7~A0”连接A 寄存器的输出“Q7~Q0”输入端“EN”连接 1 个输入引脚“EN_​​​​​L”。两个8 位三态门的输出端同时连接8 个输出引脚“Q7~Q0”。Logisim EvolutionLogisim5. 成果验证我们可以尝试计算183 × 166 30378步骤如下输入乘数和被乘数在乘数寄存器 A 的键盘中输入“166”A_Reg7~A_Reg010100110在被乘数寄存器 B 的键盘中输入“183”B_Reg7~B_Reg010110111初始化 A 寄存器打开乘数寄存器 A 给它一个上升沿寄存初始数据Clock_A_Reg1关闭乘数寄存器 AClock_A_Reg0如果你使用按钮把以上两步变为点击一下按钮给乘数寄存器 A 上锁代表我们已存入初始值Load_A_Reg1初始化 B 寄存器打开被乘数寄存器 B给它一个上升沿寄存初始数据Clock_B_Reg1此时乘数最后一位和被乘数相与的结果已自动送入加法器关闭被乘数寄存器 BClock_B_Reg0初始化 P 寄存器打开部分积寄存器 P 给它一个上升沿把常数 0 寄存到线路 1 Clock_P_Reg1关闭部分积寄存器 PClock_P_Reg0给部分积寄存器 P 上锁代表我们已存入初始值Load_P_Reg1把部分积送入加法器打开缓冲寄存器 P_Buffer 给它一个上升沿把部分积送入加法器Clock_PB_Reg1关闭缓冲寄存器 P_BufferClock_PB_Reg0第一次加法结果此时加法器已算出结果 LED 灯显示“0 00000000”第一次循环寄存打开部分积寄存器 P 给它一个上升沿将加法结果寄存到线路 1Clock_P_Reg1关闭部分积寄存器 PClock_P_Reg0打开乘数寄存器 A 给它一个上升沿整体右移一位并寄存加法结果的最低位Clock_A_Reg1此时乘数最后一位和被乘数相与的结果已自动送入加法器关闭乘数寄存器 AClock_A_Reg0打开缓冲寄存器 P_Buffer 给它一个上升沿把部分积送入加法器Clock_PB_Reg1关闭缓冲寄存器 P_BufferClock_PB_Reg0第二次加法结果此时 LED 灯显示“0 10110111”第二次循环寄存步骤同第一次循环寄存第三次加法结果此时 LED 灯显示“1 00010010”第三次循环寄存步骤同上第四次加法结果此时 LED 灯显示“0 10001001”第四次循环寄存步骤同上第五次加法结果此时 LED 灯显示“0 01000100”第五次循环寄存步骤同上第六次加法结果此时 LED 灯显示“0 11011001”第六次循环寄存步骤同上第七次加法结果此时 LED 灯显示“0 01101100”第七次循环寄存步骤同上第八次加法结果此时 LED 灯显示“0 11101101”第八次循环寄存步骤同上输出高位乘法结果打开高位三态门 High输出结果此时输出为“01110110”EN_H1关闭高位三态门HighEN_H0输出低位乘法结果打开低位三态门 Low输出结果此时输出为“10101010”EN_L1关闭低位三态门LowEN_L06. 总结通过本教程你成功在 Logisim 中构建了一个手动版的无符号 8 位乘法器。这个过程让你掌握了二进制乘法的硬件实现原理并熟悉了 Logisim 中寄存器、加法器、多路选择器等基本元件的使用。你可以在此基础上进行扩展例如实现有符号乘法Booth算法、增加流水线、或将其封装为一个子电路Subcircuit供更大系统调用。
返回列表