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.我没有看到错误。有人在这里弄清楚我做错了什么吗?
答案 0 :(得分:0)
你的一些联系是错误的。您正在将c_o[0]
与[{1}}的{{1}}端口相连(sum
和full_adder
的端口相同)。按位置实例化时,端口顺序很重要。最快的解决方法是使用:
c_o[2:1]
通过名称而不是位置进行实例化通常是更好的做法。显然,这更详细,但它确实有助于避免您的布线错误类型:
c_out
更新:您还可以利用实例数组:
module full_adder(
output c_out, // carry out
output sum,