全加器检测8位数中的1


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

先来了解一下全加器和半加器:

http://m.elecfans.com/article/716153.html

 

 

 所以解题思路如下:

https://forum.allaboutcircuits.com/threads/count-number-of-logic-1s-in-7-bit-number.49821/

 

 

module f_add(a,
            b,
            ci,
            s,
            co
            );
    input a;
    input b;
    input ci;
    output s;
    output co;
    
    assign {co,s}=a+b+ci;
//    assign s=(a^b)^ci;
//    assign co=(a&&b)||(ci&&(a^b));
endmodule
module count_1_add(
                    data_in,
                    data_out
                    );
    input [7:0]data_in;
    output [3:0]data_out;//最多只需要四位就可表示8,即输入的8位二进制全是1的情况
    wire s0,s1,s2,s3,s4,s5,s6;
    wire c0,c1,c2,c3,c4,c5,c6;
    f_add f_add0(
            .a(data_in[0]),
            .b(data_in[1]),
            .ci(data_in[2]),
            .s(s0),
            .co(c0)
            );
    f_add f_add1(
            .a(data_in[3]),
            .b(data_in[4]),
            .ci(data_in[5]),
            .s(s1),
            .co(c1)
            );
    f_add f_add2(
            .a(s0),
            .b(s1),
            .ci(data_in[6]),
            .s(s2),
            .co(c2)
            );
    f_add f_add3(
            .a(s2),
            .b(data_in[7]),
            .ci(1'b0),
            .s(s3),
            .co(c3)
            );
    f_add f_add4(
            .a(c0),
            .b(c1),
            .ci(c2),
            .s(s4),
            .co(c4)
            );
    f_add f_add5(
            .a(s4),
            .b(c3),
            .ci(1'b0),
            .s(s5),
            .co(c5)
            );
    f_add f_add6(
            .a(c5),
            .b(c4),
            .ci(1'b0),
            .s(s6),
            .co(c6)
            );
    assign data_out={c6,s6,s5,s3};
    
endmodule
`timescale 1ns/1ns
module tb;
    reg [7:0]data_in;
    wire [3:0]data_out;
    reg clk;
    count_1_add count_1_add(
                    .data_in(data_in),
                    .data_out(data_out)
                    );
    initial clk=0;
    always #1 clk=~clk;
    initial begin
        data_in=8'b1101_0010;
        #10;
        data_in=8'b1001_0000;
    end
endmodule 

可以看到用了七个全加器,点开其中一个,可以看到一个全加器由两个半加器和一个或门组成。

 

 

 

 

 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM