Booth乘法器设计

1. 乘法器原理
在计算两个补码相乘时,可以通过Booth算法来实现定点补码一位乘的功能。布斯(Booth)算法采用相加和相减的操作计算补码数据的乘积,Booth算法对乘数从低位开始判断,根据后两个数据位的情况决定进行加法、减法还是仅仅进行移位操作。讨论当相乘的两个数中有一个或二个为负数的情况,在讨论补码乘法运算时,对被乘数或部分积的处理上与原码乘法有某些类似,差别仅表现在被乘数和部分积的符号位要和数值一起参加运算。
Booth乘法规则如下:
假设X、Y都是用补码形式表示的机器数,[X]补和[Y]补=Ys.Y1Y2…Yn,都是任意符号表示的数。比较法求新的部分积,取决于两个比较位的数位,即Yi+1Yi的状态。
首先设置附加位Yn+1=0,部分积初值[Z0]补=0。
当n≠0时,判断YnYn+1,
若YnYn+1=00或11,即相邻位相同时,上次部分积右移一位,直接得部分积。
若YnYn+1=01,上次部分积加[X]补,然后右移一位得新部分积。
若YnYn+1=10,上次部分积加[-X]补,然后右移一位得新部分积。
当n=0时,判YnYn+1(对应于Y0Y1),运算规则同(1)只是不移位。即在运算的最
后一步,乘积不再右移。
2. 设计思想
程序首先进行判0操作,如果乘数中有一个或两个为0,则直接输出结果0,否则进入程序主体。程序主体分成三个判断模块进行,当乘数最低位与次低位值相等时,先将乘数右移一位,再将原部分累加和右移一位至乘数最高位,同时部分积累加和的最高位根据次高位正负补0或1;如果乘数最低位与次低位分别为1,0时,将原部分累加和加上被乘数X补后,再右移一位至乘数最高位,同时部分积累加和的最高位根据次高位正负补0或1;如果乘数最低位与次低位分别为0,1时,将原部分累加和减去被乘数X补后,再右移一位至乘数最高位,同时部分积累加和的最高位根据次高位正负补0或1。每次比较一次乘数的最末两位,进行相应运算后,共循环4次。循环结束后,再进行一次判断,如果乘数最低位与次低位分别为1、0,将原部分累加和加上被乘数X补。如果乘数最低位与次低位分别为0、1,将原部分累加和减去被乘数X补。此时,最终累加和就是乘积的高位结果,取乘数的高四位作为低位结果,拼接即为最终乘法结果。
3. 程序设计
module Multiplication(Mx,My,Mout);//补码一位乘法模块

input [5:0]Mx,My;//定义六位数输入,其中前两位为符号位
output reg [9:0]Mout;//定义九位数输出,其中前两位为符号位
reg [5:0] a;//a寄存器存放部分积累加和
reg [5:0] b,c;//b寄存器存放补码表示的被乘数,c寄存器存放补码表示的乘数
reg [3:0] n;//n作为临时变量,用来存放循环次数
reg p,q;//p用于负数移位补1操作,q用于存放添加的附加位Cn+1,初始化为0

always @ (Mx,My)
begin
	if((Mx==0)||(My==0))
		Mout=0;
	else
		begin
			a=6'b000000;
			n=4'b1111;
			p=1'b1;
			q=1'b0;
			b=Mx;
			c=My;
			c={c[4:0],q};
			while(n)
				begin
					n=n>>1;
					if(((c[0]==0)&&(c[1]==0))||((c[0]==1)&&(c[1]==1)))//如果Cn+1和Cn同为0或1,则只进行移位
						begin
							c=c/2;//除2表示右移一位
							c[5]=a[0];//高位由部分累加和的低位补充
							a=a/2;
							if(a[4]==1)
								a={p,a[4:0]};//累加和的最高位保持不变(此时补1)
							else
								a=a;//不进行任何操作,默认高位补0
						end
					else if((c[0]==1)&&(c[1]==0))//如果Cn=0,Cn+1=1,则先加上被乘数的补码,再移位
						begin
							a=a+b;
							c=c/2;
							c[5]=a[0];
							a=a/2;
							if(a[4]==1)
								a={p,a[4:0]};
							else
								a=a;
						end
					else if((c[0]==0)&&(c[1]==1))//如果Cn=1,Cn+1=0,则先减去被乘数的补码,再移位
						begin
							a=a-b;
							c=c/2;
							c[5]=a[0];
							a=a/2;
							if(a[4]==1)
								a={p,a[4:0]};
							else
								a=a;
						end
				end
			//四次循环后,进行最后一步,此步不移位,用来处理符号位
			if((c[0]==1)&&(c[1]==0))
				begin
					a=a+b;
				end
			else if((c[0]==0)&&(c[1]==1))
				begin
					a=a-b;
				end
		Mout={a,c[5:2]};
		end
end
endmodule
4. 设计验证
例:已知X=0.1010,Y=-0.1101,求X*Y:
1. 两数用补码表示 X补=00.1010 Y补=11.0011 -X补=11.0110
2. 设置输入为001010和110011

3. 仿真得结果为1101111110,即 X*Y补=1101111110,即为-0.0111111



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值