全加器檢測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