乘法运算器的设计
一,原码一位乘法器设计
图
1
图1
图1
图1左是实现原码一位乘法器的流程图,右边根据流程图设计的概要图,左边的循环由右边的计数器CNT控制,每次移位,得出Yi的值(i及乘数Y的第i位的值,0或1),由右图可以看出,Yi=0时,|X|通道关闭,0通道打开,A通过ALU加0,当Yi=1时,0通道关闭,|X|通道打开,A通过ALU加|X|,之后ALU再把得出的结果赋给A,依次循环这样的操作,最后所得的结果就在A中(当然,第一次ALU求和时A得确保为零)。
二,原码阵列乘法器设计
图1可以实现原码一位乘法器的设计,但是拥有循环的它是很低效的,我们必须得改进一下。图2是我们的手工乘法,我们需从这上面找到新的方法。
图
2
图2
图2
A*B的部分积部分,有与运算和与项求和,我们如图3设计运算方法。
图
3
图3
图3
整个图3均为乘法的部分积部分,从最右边开始,a0b0得出p0,a1b0+a0b1再加低位进位(由于低位没有加法,就直接进零)得出p1,且有进位就进位,然后a2b0+a1b1+前面的进位得出的结果(有进位就进位)再加a0b2得出p2(有进位就进位),以此类推可得出全部结果。但我们可以发现每一组部分积都是串行进位,必须先得出低位才能进行下一位计算,这样的效率还是不高,所以还需改进。
图
4
图4
图4
我们可以把每一组部分及的进位都接入下一组部分积,这样同一组部分积就能同时计算了,如图4,但是最后一组部分积往下就没有部分积了,那他把进位送到哪呢,我们可以自己再在下面添加一组这样就能解决这个问题了。
图
5
图5
图5
我们先将乘数与被乘数各位先与再根据图4做出n*n原码乘法阵列,符号位单独进行异或运算。
三,补码一位乘法器设计
图
6
图6
图6
我想如果看懂了图一,那么此图也一定不在话下。当然,图6也比较效率低下,我们可以根据改进的原码阵列乘法器再加以改进做出补码阵列乘法器(真的很简单,只需把补码先变为原码,得出结果后,再求一次补不就出来了吗),如图7
图
7
图7
图7