补码一位乘(Radix-2 Booth)

目录


用于计算单符号位定点小数乘法 x × y x×y x×y ,常用于CPU作乘法运算,伪代码如下:

function mult_signed_fix(x,y);
	bit	[n+1:0]	x_ext;								//扩位x,双符号位
	bit	[n:0]	y_ext;								//扩位y
	bit	[n+1:0]	x_ext_inv; 							//-扩位x,双符号位
	bit	[2*n+3:0]	pp;								//部分积

	//------------------------------------------------------------------------------------------
	// step 1. 将x和y扩位为 整数位宽和小数位宽一致,记扩位后 x[n+1:n]为双符号位、x[n-1:m]为整数部分、x[m-1:0]为小数部分
	//------------------------------------------------------------------------------------------

	x_ext[n:0] = extract_bit(x,y);					//扩位
	x_ext[n+1] = x_ext[n];							//双符号位
	
	y_ext[n:0] = extract_bit(x,y);					//扩位
	
	//------------------------------------------------------------------------------------------
	// step 2. 计算 双符号位[-x_ext]_补
	//------------------------------------------------------------------------------------------
	
	x_ext_inv[n+1:0] = ~x_ext[n+1:0] + 'd1;
	
	//------------------------------------------------------------------------------------------
	// step 3. 初始化部分积
	//------------------------------------------------------------------------------------------
	
	pp = {(n+2){1'b0},y_ext,1'b0};
	
	//------------------------------------------------------------------------------------------
	// step 4. 迭代运算(n+1)次,前n次需要算术右移1位,第n+1次不用移位
	//------------------------------------------------------------------------------------------
	
	for i = 1:n+1 begin
		if(pp[1:0] == 2'b01)
			pp = pp + {x_ext,(n+2){1'b0}};		//部分积高(n+2)位加x_ext_comp
		else if(pp[1:0] == 2'b10)
			pp = pp + {x_ext_inv,(n+2){1'b0}};
		
		if(i < n+1)
			pp = arithmetic_shift_right(pp);		//算术右移一位
	end

	//------------------------------------------------------------------------------------------
	// step 5. 整理结果,部分积去掉低2位为最终积。最终积为双符号位,低2*m位为小数部分
	//------------------------------------------------------------------------------------------	

	return pp[2*n+3-1:2*(m-1)+3].pp[2*(m-1)+2:2];		//取单符号位形式
	
endfunction	

例如计算1.5 = 3’b01.1与-2.25 = 5’b101.11步骤如下:

Step 1. 扩位,得到x_ext = 6'b0001.10;y_ext = 5'b101.11;。得到n = 4;m=2

Step 2. 计算补码,有x_ext_inv = 6'b1110.10;

Step 3. 初始化部分积,有pp = {6'b0,6'b101110};

Step 4. 迭代运算5次。
第1次算得pp = {6'b111101,6'b010111};
第2次算得pp = {6'b111110,6'b101011};
第3次算得pp = {6'b111111,6'b010101};
第4次算得pp = {6'b000010,6'b101010};
第5次算得pp = {6'111100,6'b101010};

Step 5. 整理结果,得到单符号最终积为9'b11100.1010,即-3.375

定点数的运算 —— 原码、补码的乘法运算

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starry丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值