牛客网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/1nsmodule 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;
//逐个比特乘法
generatefor(i=0;i<size;i=i+1) begin:temp_blockassign 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) beginif(!rst_n) beginadder01 <= 'd0;adder23 <= 'd0;mul_out <= 'd0;endelse beginadder01 <= temp[0] + temp[1];adder23 <= temp[2] + temp[3];mul_out <= adder01 + adder23;end
endendmodule