数字IC习题1--输入一个8bit数,输出其中1的个数。如果只能使用1bit全加器,最少需要几个

发布时间 2023-07-21 18:44:35作者: 傅红雪a

 

【问题分析】

全加器(full_adder):是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器,一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。

 

全加器输入信号有三个 dina、dinb、cin,输出的信号有两个sum、cout。

dina和dinb是输入信号,cin是低位进位,sum是dina和dinb当前位上的和,cout是dina和dinb相加后的高进位。

例如dina = 1,dinb = 0,cin = 1, sum = 0,cout = 1 

 

1bit的全加器的dina、dinb、sum信号的长度是1位。

2bit的全加器可以由两个1bit的全加器连接组成,2bit的全加器的dina、dinb、sum信号的长度是2位。

3bit的全加器可以由一个1bit的全加器+一个2bit的全加器连接组成,也就是三个1bit的全加器,3bit的全加器的dina、dinb、sum信号的长度是3位。

 

1bit的全加器

module full_adder_one(
    input dina,
    input dinb,
    input cin,
    output sum,
    output cout
);

assign {cout,sum} = dina + dinb + cin;

endmodule

 

2bit的全加器

module adder2(
    input[1:0]  dina,
    input[1:0]  dinb,
    input       cin,
    output[1:0] sum,
    output      cout
);

wire co;
    full_adder_one u0(
    .dina (dina[0]),
    .dinb (dinb[0]),
    .cin  (cin),
    .sum  (sum[0]),
    .cout (co)
)
    full_adder_one u1(
    .dina (dina[1]),
    .dinb (dinb[1]),
    .cin  (co),
    .sum  (sum[1]),
    .cout (cout)
)
endmodule
View Code

3bit的全加器

module adder3(
    input[2:0]  dina,
    input[2:0]  dinb,
    input       cin,
    output[2:0] sum,
    output      cout
);

wire co;
    full_adder_one u0(
    .dina (dina[0]),
    .dinb (dinb[0]),
    .cin  (cin),
    .sum  (sum[0]),
    .cout (co)
)
    adder2 u1(
    .dina (dina[2:1]),
    .dinb (dinb[2:1]),
    .cin  (co),
    .sum  (sum[2:1]),
    .cout (cout)
)
endmodule
View Code

 

 

 

 

【最终代码】

module number_one(
    input clk,
    input rest_n;
    input [7:0] din;
    output [3:0] num_one;
);

wire [1:0] sum0;
wire [1:0] sum1;
wire [2:0] sum2;

    full_adder_one u0(
    .dina (din[0]),
    .dinb (din[1]),
    .cin  (din[2]),
    .sum  (sum0[0]),
    .cout (sum0[1])
);

    full_adder_one u1(
    .dina (din[3]),
    .dinb (din[4]),
    .cin  (din[5]),
    .sum  (sum1[0]),
    .cout (sum1[1])
);

    adder2 u3(
    .dina (sum0),
    .dinb (sum1),
    .cin  (din[6]),
    .sum  (sum2[1:0]),
    .cout (sum2[2])
);

    adder3 u2(
    .dina (sum2),
    .dinb (0),
    .cin  (din[7]),
    .sum  (num_one[2:0]),
    .cout (num_one[3])
);

endmodule

module full_adder_one(
    input dina,
    input dinb,
    input cin,
    output sum,
    output cout
);

assign {cout,sum} = dina + dinb + cin;

endmodule


module adder2(
    input[1:0]  dina,
    input[1:0]  dinb,
    input       cin,
    output[1:0] sum,
    output      cout
);

wire co;
    full_adder_one u0(
    .dina (dina[0]),
    .dinb (dinb[0]),
    .cin  (cin),
    .sum  (sum[0]),
    .cout (co)
)
    full_adder_one u1(
    .dina (dina[1]),
    .dinb (dinb[1]),
    .cin  (co),
    .sum  (sum[1]),
    .cout (cout)
)
endmodule

module adder3(
    input[2:0]  dina,
    input[2:0]  dinb,
    input       cin,
    output[2:0] sum,
    output      cout
);

wire co;
    full_adder_one u0(
    .dina (dina[0]),
    .dinb (dinb[0]),
    .cin  (cin),
    .sum  (sum[0]),
    .cout (co)
)
    adder2 u1(
    .dina (dina[2:1]),
    .dinb (dinb[2:1]),
    .cin  (co),
    .sum  (sum[2:1]),
    .cout (cout)
)
endmodule