Verilog 2 的补码 adder/subtractor

Verilog 2's complement adder/subtractor

在Verilog中设计一个四位adder/subtractor并在七段显示器上显示

我的大部分代码都在运行,但是当我需要一个涉及负数的减法时,它会产生错误的结果。

例如, 5 - 7 应该得到 2 但我收到 E

下面是我的代码:

module fullAdder (a0,a1,carry_in,s,carry_out);

    input a0,a1,carry_in;
    output s, carry_out;

    assign s = (a0 ^ a1) ^ carry_in;
    assign carry_out = (a0 & a1 & carry_in)|(a0 & a1 & ~carry_in)|(a0 & ~a1 & carry_in)|(~a0 & a1 & carry_in);

endmodule

module Lab3(a0,a1,s,cout);

    input s;
    input  [3:0] a0, a1;
    output [3:0] cout;
    
    wire c,d,e,f;
    wire input1, input2, input3, input4;
    
    xor(input1, s, a1[0]);
    xor(input2, s, a1[1]);
    xor(input3, s, a1[2]);
    xor(input4, s, a1[3]);
    
    //a0,a1,carry_in,s,carry_out    
    fullAdder fa0(a0[0],input1,s,cout[0],c);
    fullAdder fa1(a0[1],input2,c,cout[1],d);
    fullAdder fa2(a0[2],input3,d,cout[2],e);
    fullAdder fa3(a0[3],input4,e,cout[3],f);

endmodule 

E 是这里的正确结果,因为它是 4 位二进制补码中的 -2。

从负的二进制补码值变为正值的技巧是反转并加一。

  • E在二进制中是1110

  • 1110倒过来就是0001

  • 0001加1为0010(2)