乘法在硬件设计中的实现

相信很多初学计算机体系架构的伙伴都有这样的疑问,为什么每次提到乘法,总会说到乘在电路中的实现比加减更加复杂?为什么乘除法电路更耗费硬件资源?为什么执行一次乘除法要花费较多个时钟周期?

我们带着这个问题分别讨论一下乘除法电路实现。(本篇文章适用于新手学习,所以只讨论简单的电路实现)

算术逻辑单元ALU:执行加法、减法和常见逻辑操作(如AND和OR)的硬件。

乘法电路

乘法在硬件设计中的实现_第1张图片

编辑

添加图片注释,不超过 140 字(可选)

通过这个例子我们能看出来,乘数和被乘数均是由0、1组成的。可以理解为,共需要进行4次乘法,每次进行一次乘法:被乘数×乘数[i],(i=0,1,2,3)在二进制中,如果乘数[i]为1,就将被乘数复制到合适的位置,如果乘数[i]是0,则将0放进合适的位置。

如果把上述例子改为二进制,结果是一样的。对于上述例子中四位二进制×四位二进制,结果是七位,其实,如果如果不考虑符号位,被乘数和乘数分别是m和n位,那么结果就是m+n位。

我们用串行电路实现一下上述例子,串行电路实现要求被乘数寄存器和积寄存器位宽均为8。

被乘数所在寄存器初始为:00001000。被乘数所在寄存器进行左移位、被乘数所在寄存器初始为:1001,通过乘数所在寄存器进行右移位,每次都选择乘数[0]与乘数相乘,乘后将本次得到的积加到积寄存器中,然后将被乘数寄存器右移。共循环4次,完成乘法。

乘法在硬件设计中的实现_第2张图片

编辑切换为居中

添加图片注释,不超过 140 字(可选)

将上个例子展开就变成了:

乘法在硬件设计中的实现_第3张图片

编辑

添加图片注释,不超过 140 字(可选)

乘法在硬件设计中的实现_第4张图片

编辑

第一版乘法器硬件

以上讨论均不考虑符号位,其实对于有符号数来说,最简单的方法是记录两个数的符号,符号位相同为正,不同为负,所以符号位本身并不参与计算。为了方便大家的理解,先给大家解释了采用串行方式的第一版乘法器,接下来再介绍一种乘法器。

快速乘法器,对于乘数B和被乘数A,其基本原理是将B分解为若干个二进制位,每个二进制位都与A相乘,并将结果相加得到最终结果。

例如,对于一个8位的乘数B和一个8位的加数A,其乘积C可以表示为:

C = (B[7]*A<<7 + B[6]*A<<6 + B[5]*A<<5 + B[4]*A<<4 + B[3]*A<<3 + B[2]*A<<2 - B[1]*A<<1 + B[0]*A)

在这个式子中,B[7]表示乘数B的最高位,A<<7表示加数A向左移动7位,B[6]、B[5]、B[4]等表示乘数B的各个二进制位。有兴趣的同学可以把例一按照这种方式展开计算一下。这种方法充分利用了计算的并行性,能够缩短执行周期,但硬件开销更大。

你可能感兴趣的:(单片机,嵌入式硬件)