牛客网Verilog刷题——VL56
- 题目
- 答案
题目
实现4bit无符号数流水线乘法器设计。电路的接口如下图所示:
输入输出描述:
信号 | 类型 | 输入/输出 | 位宽 | 描述 |
---|---|---|---|---|
clk | wire | Input | 1 | 系统时钟信号 |
rst_n | wire | Input | 1 | 异步复位信号,低电平有效 |
mul_a | wire | Input | size | 乘数 |
mul_b | wire | Input | size | 被乘数 |
mul_out | wire | Output | 2*size | 输出乘法结果 |
答案
`timescale 1ns/1ns
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
);
//无符号流水线乘法器:每个时钟都更新输入的乘数和被乘数,在一个或者多个时钟后连续输出乘法器乘法结果
wire [7:0] temp [size-1:0]; //逐个比特乘法
reg [7:0] adder01,adder23; //加法器
genvar i;
//逐个比特乘法
generate
for(i=0;i<size;i=i+1) begin:temp_block
assign temp[i] = mul_b[i] ? mul_a<<i : 'd0; //用移位寄存器
//assign temp[i] = mul_b[i] ? {{(size-i){1'b0}},mul_a,{(i){1'b0}}} : 'd0; //用拼接符
end
endgenerate
//加法器
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
adder01 <= 'd0;
adder23 <= 'd0;
mul_out <= 'd0;
end
else begin
adder01 <= temp[0] + temp[1];
adder23 <= temp[2] + temp[3];
mul_out <= adder01 + adder23;
end
end
endmodule