加法器-减法器可以通过选择性地否定其中一个输入从加法器构建,这相当于反转输入然后添加1。最终结果是一个可以执行两个操作的电路:(a + b + 0)和(a + ~b + 1)。。
在下面构建加法器-减法器。
为您提供了一个 16 位加法器模块,您需要对其进行实例化两次:
module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
使用 32 位宽 XOR 栅极,在 sub 为 1 时反转 b 输入。
(这也可以看作是b[31:0]XORed,子复制了32次。看复制运算符.).
module top_module(
input [31:0] a,
input [31:0] b,
input sub,
output [31:0] sum
);
// b^sub = b'sub + sub'b;
// 当sub为0时,b^sub = 0+b = +b,此时为加法器;
// 当sub为1时,b^sub ='b+0 = 'b,此时为减法器;
wire [31:0] c;
wire cout0,cout1;
wire [15:0] sum0,sum1;
assign c = b^{32{sub}};//一开始这个32位的sub没有考虑到
add16 inst1
(
.a(a[15:0]),
.b(c[15:0]),
.cin(sub),//这个sub充当的是取反加一的那个一的作用
.cout(cout0),
.sum(sum0)
);
add16 inst2
(
.a(a[31:16]),
.b(c[31:16]),
.cin(cout0),
.cout(cout1),
.sum(sum1)
);
assign sum={sum1[15:0],sum0[15:0]};
endmodule