无符号数的乘法,根据乘数的数位计算位积,再将一系列位积相加。便可以得到两个无符号二进制数的乘积。这里可以选择移位的方式。比如out= in * 13,in为4位,则out为8位,的计算:assign out = a + a << 2 + a <<3;实现。
组合逻辑电路乘法器实现:
module mult_module#(
parameter WIDTH = 8
)
(
input [WIDTH-1:0] S_data1,
input [WIDTH-1:0] S_data2,
output reg [2*WIDTH-1:0] F_mult
);
integer index;
reg [2*WIDTH-1:0] S_data2_temp;
always@(*)
begin
F_mult = 0;
S_data2_temp = { {WIDTH{1'b0}}, S_data2 };
for(index = 0;index <WIDTH ; index = index + 1 )
begin
F_mult = F_mult + ({ 2*WIDTH{S_data1[index]}} & (S_data2_temp << index));
end
end
endmodule
仿真文件:
module tb_mult_module(
);
parameter WIDTH = 8;
reg [WIDTH-1:0] S_data1;
reg [WIDTH-1:0] S_data2;
wire [2*WIDTH-1:0] F_mult;
reg clk;
initial begin
clk = 0;
S_data1 = 0;
S_data2 = 0;
#20;
S_data1 = 2;
S_data2 = 5;
#20;
S_data1 = 2;
S_data2 = 7;
#20;
S_data1 = 5;
S_data2 = 10;
#10;
S_data1 = 0;
S_data2 = 0;
#10;
repeat(30) @(posedge clk)
begin
S_data1[WIDTH-1:0] <= $random;
S_data2[WIDTH-1:0] <= $random;
end
end
always #5 clk <= ~clk;
mult_module
#(
.WIDTH(WIDTH)
)
mult_module_inst
(
.S_data1(S_data1),
.S_data2(S_data2),
.F_mult(F_mult)
);
endmodule
仿真: