4位加法器返回错误的结果

时间:2014-10-16 19:00:41

标签: verilog

module adder4(
output[3:0] sum,
output c_out,       // carry out
input[3:0] a, b,    // operands
input c_in);        // carry in

wire [2:0] c_o;
full_adder fa1(c_o[0],sum[0],a[0],b[0],c_in);
full_adder fa2(c_o[1],sum[1],a[1],b[1],c_o[0]);
full_adder fa3(c_o[2],sum[2],a[2],b[2],c_o[1]);
full_adder fa4(c_out,sum[3],a[3],b[3],c_o[2]);

endmodule

module full_adder(
    output sum,
    output c_out,   // carry out
    input a,
    input b,
    input c_in);    // carry in

wire sum1;
wire c_in1;
wire c_out2;
    half_adder ha1(sum1,c_in1,a,b);
    half_adder ha2(sum,c_out2,sum1,c_in);
    or(c_out,c_out2,c_in1);
endmodule


module half_adder(
    output sum,
    output c_out,   // carry out
    input a,
    input b);

assign sum=a^b;
assign c_out=a&&b;

endmodule

嗨,伙计们!我尝试从4个完整加法器中制作一个4位加法器,但我一直得到错误的结果。当a = 3和b = 8时,我得到的总和是9而不是11.我没有看到错误。有人在这里弄清楚我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

你的一些联系是错误的。您正在将c_o[0]与[{1}}的{​​{1}}端口相连(sumfull_adder的端口相同)。按位置实例化时,端口顺序很重要。最快的解决方法是使用:

c_o[2:1]

通过名称而不是位置进行实例化通常是更好的做法。显然,这更详细,但它确实有助于避免您的布线错误类型:

c_out

更新:您还可以利用实例数组:

module full_adder(
    output c_out,   // carry out
    output sum,