如何在verilog中实现4位adder/subtractor

How to implement a 4-bit adder/subtractor in verilog

我正在尝试确定如何使用全加器将此代码转换为 4 位 adder/subtractor。现在它正在做加法,但我不知道如何做减法部分。

module Adder #(parameter N = 4)(
         output wire [N-1:0] sum, // sum
         output wire         co,  // carry
         input  wire [N-1:0]  x,
         input  wire [N-1:0]  y,
         input  wire        is_sub;
         );

    wire [N:0] c;
    assign c[0] = 1'b0;
    assign co = c[N];
    genvar i;
    generate
    for (i = 0; i < N; i=i+1)
    begin : counter_gen_label
    FA FAInst (
        .s(sum[i]),
        .co(c[i+1]),
        .a(x[i]),
        .b(y[i]),
        .cin(c[i]),
        .is_sub(is_sub)
        );
    end
    endgenerate
endmodule

module FA(
      output reg  s,
      output reg  co,
      input  wire a,
          input  wire b,
          input  wire cin,
          input  wire is_sub
          );

    always @(*)
        begin   
            s = a ^ b ^ cin;
            co = (a & b) | (a & cin) | (b & cin);
        end

endmodule

如何在 FA 模块中进行减法? 谢谢!

FA 不需要使用 is_sub 输入。

c[0] = 1'b0; 替换为 c[0] = is_sub;,并将 .b(y[i]) 替换为 .b(y[i] ^ is_sub)

这是 x - y = x + y' + 1 的结果,其中 y' 表示反转的 y。