描述
编写一个4bit乘法器模块,并例化该乘法器求解c=12*a+5*b,其中输入信号a,b为4bit无符号数,c为输出。注意请不要直接使用*符号实现乘法功能。
模块的信号接口图如下:
要求使用Verilog HDL语言实现以上功能,并编写testbench验证模块的功能。
输入描述:
clk:系统时钟信号
rst_n:复位信号,低电平有效
a:输入信号,位宽为4bit
b:输入信号,位宽为4bit
输出描述:
c:输出信号
参考答案
`timescale 1ns/1nsmodule calculation(input clk,input rst_n,input [3:0] a,input [3:0] b,output [8:0] c);wire [7:0] product_1;wire [7:0] product_2;reg[3:0] mult_1 = 12;reg[3:0] mult_2 = 5;mult multiplier_1(.clk(clk),.rst_n(rst_n),.multiplicand(a),.multiplier(mult_1),.product(product_1) );mult multiplier_2(.clk(clk),.rst_n(rst_n),.multiplicand(b),.multiplier(mult_2),.product(product_2) ); assign c = product_1+product_2;
endmodulemodule mult(input clk , input rst_n ,input [3:0] multiplicand,input [3:0] multiplier ,output reg [7:0] product
);wire [7:0] temp0 ;
wire [7:0] temp1 ;
wire [7:0] temp2 ;
wire [7:0] temp3 ;assign temp0 = multiplicand[0]? {4'b0, multiplier} : 1'd0;
assign temp1 = multiplicand[1]? {3'b0, multiplier, 1'b0} : 1'd0;
assign temp2 = multiplicand[2]? {2'b0, multiplier, 2'b0} : 1'd0;
assign temp3 = multiplicand[3]? {1'b0, multiplier, 3'b0} : 1'd0;always @(posedge clk or negedge rst_n) begin if(~rst_n) beginproduct <= 1'd0;end else beginproduct <= temp0 + temp1 + temp2 + temp3;end
endendmodule