Booth算法乘法器-时钟优化

前面写过Booth算法的乘法器,只是简单的实现了逻辑功能,计算结果用了16个时钟。https://blog.csdn.net/weixin_42183170/article/details/100743362
Booth算法是先判断P[1:0],然后操作P空间,最后P空间移位,最高位补0 or 补1。
可以将消耗的8个时钟的移位操作压缩在同一步骤下:

module Boost_multiplier_youhua#(
	parameter DATAWIDTH = 8
)
(
	input                            CLK,
	input                            RSTn,
	input                            START,
	input  [ DATAWIDTH - 1 : 0 ]     A,
	input  [ DATAWIDTH - 1 : 0 ]     B,
	
	output [ DATAWIDTH * 2 - 1 : 0 ] RESULT,
	output                           Done
);

reg [ DATAWIDTH - 1 : 0 ] i;
reg [ DATAWIDTH * 2 : 0 ] P;
reg [ DATAWIDTH - 1 : 0 ] A_reg;
reg [ DATAWIDTH - 1 : 0 ] A_bm;
//reg [ DATAWIDTH - 1 : 0 ] N;
reg                       isDone;
reg [ DATAWIDTH - 1 : 0 ] Pco1;
reg [ DATAWIDTH - 1 : 0 ] Pco2;

always @ ( posedge CLK or negedge RSTn )
begin
	if (!RSTn)
	begin
		i <= 0;
		P <= 0;
		A_reg <= 0;
		A_bm <= 0;
		//N <=0;
		isDone <= 0;
		Pco1 <= 0;
		Pco2 <= 0;
	end
	else if (START)
	begin
		case (i)
		
			0:
				begin
					A_reg <= A;
					A_bm <= ~A + 1'b1;
					P <= { 8'd0, B, 1'b0 };
					i <= i + 1'b1;
					//N <= 0;
					Pco1 <= 0;
					Pco2 <= 0;
				end
			1,2,3,4,5,6,7,8:
				begin
					Pco1 = P[16:9] + A_reg;
					Pco2 = P[16:9] + A_bm;
					
					if (P[1:0] == 2'b01)
					begin
						P <= {Pco1[7],Pco1,P[8:1]};
					end
					else if (P[1:0] == 2'b10)
					begin
						P <= {Pco2[7],Pco2,P[8:1]};
					end
					else 
					begin
						P <= {P[16],P[16:1]};
					end
					i <= i + 1'b1;
					
//					if (N == 8)
//						begin
//							N <= 0;
//							i <= i + 2'b10;
//						end
//					else if (P[1:0] == 2'b00 | P[1:0] == 2'b11)
//						begin
//							P <= P;
//							i <= i + 1'b1;
//						end
//					else if (P[1:0] == 2'b01)
//						begin
//							P <= {P[16:9] + A_reg,P[8:0]};
//							i <= i + 1'b1;
//						end
//					else if (P[1:0] == 2'b10)
//						begin
//							P <= {P[16:9] + A_bm,P[8:0]};
//							i <= i + 1'b1;
//						end

				end
//			2:
//				begin
//					P <= {P[16],P[16:1]};
//					N <= N + 1'b1;
//					i <= i - 1'b1;
//				end
			9:
				begin
					isDone <= 1;
					i <= i + 1'b1;
				end
			10:
				begin
					isDone <= 0;
					i <= 0;
				end
		
		endcase
	end
end

assign Done = isDone;
assign RESULT = P[16:1];

endmodule

仿真:
在这里插入图片描述在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值