乘法器
两数相乘,本质上是执行的加法运算。假设被乘数为A,乘数为B,位宽均为
size
,那么两数相乘的积的位宽不会超过2*size
。积mult_out的结果是将B的低位到高位依次和A相乘并移位相加的结果,所以最后是size
个数相加。举一个简单的4-bit 乘 4-bit地例子:
由上图可见,积(product)是由乘数(multiplier)由低到高比特与被乘数(multiplicand)相乘并相加得出的结果。
- verilog代码
module mult_pipe #( parameter size=4)(
input clk,
input rst_n,
input [size-1:0] mult_a,
input [size-1:0] mult_b,
output[2*size-1:0] mult_out
);
reg[2*size-1:0] mult_add[0:size-1]; //存放mult_b每个bit与mult_a相乘后移位的结果
integer i;
//=====================phase0=====================
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
for(i=0; i<size; i=i+1)begin
mult_add[i] <= 'b0;
end
end
else begin
for(i=0; i<size; i=i+1)begin
mult_add[i] <= mult_b[i]? mult_a<<i:'b0;
end
end
end
reg[2*size-1:0] mult_res[0:size-1];
integer j;
always@(*)begin
for(j=0; j<size; j=j+1)begin
if(0==j)begin
mult_res[j] <= mult_add[j];
end
else begin
mult_res[j] <= mult_res[j-1] + mult_add[j];
end
end
end
//======================phase1============================
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
mult_out <= 'b0;
end
else begin
mult_out <= mult_res;
end
end
endmodule
- 仿真结果