Booth算法乘法器-流水线建模

在这里插入图片描述

module operate#(
	parameter DATAWIDTH = 8
)
(
	input                            CLK,
	input                            RSTn,
	input  [ DATAWIDTH * 2 : 0 ]     P,
	input  [ DATAWIDTH * 2 - 1 : 0 ] M,
	
	output [ DATAWIDTH * 2 : 0 ]     P_out,
	output [ DATAWIDTH * 2 - 1 : 0 ] M_out
);


reg [ DATAWIDTH * 2 : 0 ] P_reg;
reg [ DATAWIDTH * 2 - 1 : 0 ] M_reg;
reg [ DATAWIDTH - 1 : 0 ] Pco1;
reg [ DATAWIDTH - 1 : 0 ] Pco2;

always @ ( posedge CLK or negedge RSTn )
begin
	if (!RSTn)
	begin
		P_reg <= 0;
		M_reg <= 0;
		Pco1 <= 0;
		Pco2 <= 0;
	end
	else 
	begin
		Pco1 = P[16:9] + M[7:0];
		Pco2 = P[16:9] + M[15:8];
					
		if (P[1:0] == 2'b01)
			begin
				P_reg <= {Pco1[7],Pco1,P[8:1]};
			end
		else if (P[1:0] == 2'b10)
			begin
				P_reg <= {Pco2[7],Pco2,P[8:1]};
			end
		else 
			begin
				P_reg <= {P[16],P[16:1]};
			end
		M_reg <= M;
	end
end

assign P_out = P_reg;
assign M_out = M_reg;
endmodule
module Booth_multiplier_pipeline#(
	parameter DATAWIDTH = 8
)
(
	input                            CLK,
	input                            RSTn,
	input [ DATAWIDTH - 1 : 0 ]      A,
	input [ DATAWIDTH - 1 : 0 ]      B,
	
	output [ DATAWIDTH * 2 - 1 : 0 ] RESULT
);


wire [ DATAWIDTH * 2 : 0 ] P = { 8'b0, B, 1'b0 };
wire [ DATAWIDTH * 2 - 1 : 0] M = { ~A+1'b1, A};

wire [ DATAWIDTH * 2 : 0 ]    P1;
wire [ DATAWIDTH * 2 - 1 : 0] M1;
wire [ DATAWIDTH * 2 : 0 ]    P2;
wire [ DATAWIDTH * 2 - 1 : 0] M2;
wire [ DATAWIDTH * 2 : 0 ]    P3;
wire [ DATAWIDTH * 2 - 1 : 0] M3;
wire [ DATAWIDTH * 2 : 0 ]    P4;
wire [ DATAWIDTH * 2 - 1 : 0] M4;
wire [ DATAWIDTH * 2 : 0 ]    P5;
wire [ DATAWIDTH * 2 - 1 : 0] M5;
wire [ DATAWIDTH * 2 : 0 ]    P6;
wire [ DATAWIDTH * 2 - 1 : 0] M6;
wire [ DATAWIDTH * 2 : 0 ]    P7;
wire [ DATAWIDTH * 2 - 1 : 0] M7;
wire [ DATAWIDTH * 2 : 0 ]    P8;
wire [ DATAWIDTH * 2 - 1 : 0] M8;

operate I1(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P),
		   .M(M),
		   .P_out(P1),
		   .M_out(M1));
operate I2(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P1),
		   .M(M1),
		   .P_out(P2),
		   .M_out(M2));
operate I3(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P2),
		   .M(M2),
		   .P_out(P3),
		   .M_out(M3));
operate I4(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P3),
		   .M(M3),
		   .P_out(P4),
		   .M_out(M4));
operate I5(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P4),
		   .M(M4),
		   .P_out(P5),
		   .M_out(M5));
operate I6(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P5),
		   .M(M5),
		   .P_out(P6),
		   .M_out(M6));
operate I7(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P6),
		   .M(M6),
		   .P_out(P7),
		   .M_out(M7));
operate I8(.CLK(CLK),
		   .RSTn(RSTn),
		   .P(P7),
		   .M(M7),
		   .P_out(P8),
		   .M_out(M8));

assign RESULT = P8[16:1];

endmodule		   

在这里插入图片描述在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值