在使用乘法器和乘加器中遇到了一些问题,解决后仍有疑问,以此记录
乘法器
乘法器是指只有数据中只有乘法运算,运算时p=a*b
进行如下图所示设置
借用一张描
仿真代码
always #5 clk=~clk;
initial
begin
clk = 1;
a = 0;
b = 0;
ce = 0;
sclr = 1;
#100;
sclr = 0;
ce = 1;
a = 10;
b = 10;
#100;
ce = 0;
end
mult_gen_0 uut (
.CLK(clk), // input wire CLK
.A(a), // input wire [15 : 0] A
.B(b), // input wire [15 : 0] B
.CE(ce), // input wire CE
.SCLR(sclr), // input wire SCLR
.P(s) // output wire [31 : 0] P
);
endmodule
成功得到仿真结果100
乘加器
乘加器的运算时p=ab+c,在此不进行+c的运算,只运行ab的运算,并不进行级联运算
以下为端口定义
A[N:0] Input A输入(乘法操作数1)
B[M:0] Input B输入(乘法操作数2)
C[L:0] Input C输入(加减操作数)
PCIN Input 级联输入
SUBTRACT Input 控制加/减操作(1=减法,0=加法)
CE Input 时钟使能 (高有效)
CLK Input 时钟信号,上升沿有效
SCLR Input 同步复位,高有效
PCOUT Output 输出级联
P[Q:0] Output 输出端口
原文链接:https://blog.csdn.net/weixin_41445387/article/details/119777736
仿真代码
module tb_mult_gen_0;
// Inputs
reg clk;
reg ce;
reg sclr;
reg [31:0] a;
reg [31:0] b;
// Outputs
wire [63:0] s;
// Instantiate the Unit Under Test (UUT)
always #5 clk=~clk;
initial
begin
clk = 1;
a = 0;
b = 0;
ce = 0;
sclr = 1;
#100;
sclr = 0;
ce = 1;
a = 10;
b = 10;
#100;
ce = 0;
end
multiply_add uut (
.CLK(clk), // input wire CLK
.CE(ce), // input wire CE
.SCLR(sclr), // input wire SCLR
.A(a), // input wire [15 : 0] A
.B(b), // input wire [15 : 0] B
.C(0), // input wire [47 : 0] C
.SUBTRACT(0), // input wire SUBTRACT
.P(s) // output wire [40 : 0] P
);
endmodule
得到正确仿真结果100
但当
SUBTRACT(0)改为 SUBTRACT(1)时
输出结果为-100
将例化中c改为1
得到结果为-99
总结
所以乘加器在此次仿真时SUBTRACT 端口为0,乘出的结果为负,为1乘出的结果为正,再去加上c
版权归原作者 qq_51026443 所有, 如有侵权,请联系我们删除。