Skip to content

XJTUSE-数电-第四次作业 ​

答案不一定对。老师很严格的,不要轻易拿图,也不要直接照搬文字(一旦发现抄袭平时分真的会扣很多的!!!!没有开玩笑,80左右的分都是正常的)

数电第四次作业 ​

1、学习基于Booth编码器的乘法器,并画出模块图。

2、课后习题:4.4、4.17。

题目1 ​

学习Booth编码器[1]的乘法器前,先要了解传统的乘法器,如下图:

可以看到这与我们小学学习的乘法法则并无差别。不过我们从小学习的是十进制的乘法,在数电当中是二进制的乘法,就是上图中的a和b要么是1要么是0。

传统的乘法法则存在以下不足:

1.乘数与被乘数固定,就导致时钟完全由乘数定,这就有问题了:比如2×10就是把2累加10次,这样乘数递减,时钟就为10,太浪费时钟了。

2.当数字一大,就会产生很多非零的部分积,计算量和计算时间增加。

因此,我们需要改进传统的乘法器,这就引出了Booth编码器的乘法器,该乘法器主要利用了计算机中的反码补码和加法改减法的思想,优化了计算时间。

我们假设有一个8位乘数(Multiplier),它的二进制值为0111_1110,它将产生6行非零的部分积,因为它有6个非零值(即1)。如果我们利用公式2将这个二进制值改为1000_00-10,其中低四位中的-1表示负1,可以证明两个值是相等的。可以这样简单理解,那就是现在原值得末尾加辅助位0,变为0111_1110_0,然后利用低位减去高位,即得到1000_00-10。这样一变换可以减少0的数目,从而减少加的次数,我们只需相加两个部分积,但是终的加法器必须也能执行减法。这种形式的变换称为booth encoding(即booth编码),它保证了在每两个连续位中最多只有一个是1或-1。部分积数目的减少意味着相加次数的减少,从而加快了运算速度(并减少了面积)。从形式上来说,这一变换相当于把乘数变换成一个四进制形式。

最经常使用的是改进的booth编码。乘数按三位一组进行划分,相互重叠一位。其实就是把公式1重写为公式3。每一组按下表编码,并形成一个部分积。

再考虑前面提及的8位二进制数0111_1110。从msb到lsb,可以把它分为三位一组首尾重叠的四组:01(1),11(1),11(1),10(0),末尾补了一个辅助位0。根据上表编码得到:10(2),00(0),00(0),-10(-2),或者表示为1000_000-10,这与前面得到结果是一样的。这时,乘2就是移位。所以布斯算法仅涉及加法,减法和移位操作。

即对于一个X×Y,设Y补=y7y6y5y4y3y2y1y0,我们可以列出booth二位乘:

举个简单的例子计算:

在实际编码中,减法变加法的思想:减去一个数,等于加上这个数的相反数;减去一个数,也等于加上这个数的补码。这个过程中的减数也默认是正数,因为正数的补码还是正数,只有正数前面加一个符号再去补码才有用。那么如上面竖式所写,减去一个负补码,就应该等于加上“这个负补码的补码的相反数”: 模块图如下:

题目2 ​

课后习题4.4:题目省略

为了表达方便,强制命名,从左到右分别命名为:D2D1D0

激励方程如下:

激励/转换表如下:

激励

转化

A

A

B

E

C

B

D

F

E

G

F

C

G

D

H

H

(注:A~H为000~111)

该题没有输入,因此输入/输出表未给出。

状态图如下:

分析该电路用途:

该电路没有输入,输出可以取Q。可以看到存在一个节点数为6的环,可以看成模数为6的计数器。

课后习题4.17:题目省略 ​

激励函数如下:

状态表如下:

A~P表示0000~1111

状态图如下:

功能分析:可以看到一共形成了三个划分,而且没有形成环,均终止于自循环中。

[1] 参考资料:【龙芯班笔记】基于booth二位乘的八位乘法器 - 知乎 (zhihu.com)