实现4bit无符号数流水线乘法器设计。
4bit乘法器,最终结果不超过八位。
module multi_pipe #(parameter size =4)
(
input clk,
input rst_n,
input [size -1:0] mul_a,
input [size -1:0] mul_b,
output reg [size*2-1:0] mul_out);
//寄存器暂存,实现流水线
reg [7:0] addr01;
reg [7:0] addr23;
//寄存四个位的结果
wire [7:0] temp0;
wire [7:0] temp1;
wire [7:0] temp2;
wire [7:0] temp3;
//计算对应位的与运算,相乘
assign temp0 = mul_b[0] ?{4'b0,mul_a} : 'd0;
assign temp1 = mul_b[1] ?{3'b0,mul_a,1'b0} : 'd0;
assign temp2 = mul_b[0] ?{2'b0,mul_a,2'b0} : 'd0;
assign temp3 = mul_b[0] ?{1'b0,mul_a,3'b0} : 'd0;
always@(posedge clk or negedge rst_n)
if(!rst_n)begin
addr01 <= 'd0;
addr23 <= 'd0;
end
else begin
addr01 <= temp0 + temp1;
addr23 <= temp2 + temp3;
mul_out <= addr01 = addr23;
end
endmodule
使用generate简化代码:
通过移位实现对应位乘法运算。 通过左移,上面是通过位拼接实现。 计算四次乘法运算,最后相加。
//output genvar i; generate for(i = 0; i < 4; i = i + 1)begin : loop assign temp[i] = mul_b[i] ? mul_a << i : 'd0; end
module multi_pipe#(
parameter size = 4
)(
input clk ,
input rst_n ,
input [size-1:0] mul_a ,
input [size-1:0] mul_b ,
output reg [size*2-1:0] mul_out
);
//parameter
wire [N - 1 : 0] temp [0 : 3];
reg [N - 1 : 0] adder_0;
reg [N - 1 : 0] adder_1;
//output
genvar i;
generate
for(i = 0; i < 4; i = i + 1)begin : loop
assign temp[i] = mul_b[i] ? mul_a << i : 'd0;
end
endgenerate
always@(posedge clk or negedge rst_n)begin
if(!rst_n) adder_0 <= 'd0;
else adder_0 <= temp[0] + temp[1];
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n) adder_1 <= 'd0;
else adder_1 <= temp[2] + temp[3];
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n) mul_out <= 'd0;
else mul_out <= adder_0 + adder_1;
end
endmodule