乘法在数字信号处理中被广泛应用,二进制的乘法与十进制的乘法类似,也是将乘数的每一位分别与被乘数相乘后叠加起来。二进制数由0和1组成,因此它的乘法又有其自身的特点,可以分解为被乘数的移位的累加,这大大便利了乘法器的硬件实现,二进制的乘法如下图所示,下图为3*6的计算过程。
1.基于移位相加的乘法器
1.1组合逻辑并行实现
module multiply_parallel(
input [3:0] a,
input [3:0] b,
output [7:0] c
);
wire [7:0] a1;
wire [7:0] a2;
wire [7:0] a3;
wire [7:0] a4;
assign a1 = b[0] ?{ 4'd0, a } : 8'd0;
assign a2 = b[1] ?{ 3'd0, a, 1'b0 } : 8'd0;
assign a3 = b[2] ?{ 2'd0, a, 2'b0 } : 8'd0;
assign a4 = b[3] ?{ 1'b0, a, 3'b0 } : 8'd0;
assign c = a1 + a2 + a3 + a4;
endmodule
仿真:
1.2 时序逻辑串行实现
乘法器串行结构如下图所示 ,其中 SL 为左移,SR为右移
时序图如下
时序图说明 :
1.vld拉高,表示开始进行计算,接收到vld高电平,将a_in和b_in的值寄存到a_in_r1和b_in_r1,拉高cal_en, 开始进行乘法计算