Skip to content

Popcount3

Problem Statement

A "population count" circuit counts the number of '1's in an input vector. Build a population count circuit for a 3-bit input vector.

Official Solution

module top_module (
    input [2:0] in,
    output [1:0] out
);

    // This is a function of 3 inputs. One method is to use a 8-entry truth table:
    // in[2:0] out[1:0]
    // 000      00
    // 001      01
    // 010      01
    // 011      10
    // 100      01
    // 101      10
    // 110      10
    // 111      11
    assign out[0] = (~in[2] & ~in[1] & in[0]) | (~in[2] & in[1] & ~in[0]) | (in[2] & ~in[1] & ~in[0]) | (in[2] & in[1] & in[0]);
    assign out[1] = (in[1] & in[0]) | (in[2] & in[0]) | (in[2] & in[1]);

    // Using the addition operator works too:
    // assign out = in[0]+in[1]+in[2];

    // Yet another method uses behavioural code inside a procedure (combinational always block)
    // to directly implement the truth table:
    /*
    always @(*) begin
        case (in)
            3'd0: out = 2'd0;
            3'd1: out = 2'd1;
            3'd2: out = 2'd1;
            3'd3: out = 2'd2;
            3'd4: out = 2'd1;
            3'd5: out = 2'd2;
            3'd6: out = 2'd2;
            3'd7: out = 2'd3;
        endcase
    end
    */

endmodule

My Solution

module top_module( 
    input [2:0] in,
    output [1:0] out );

    assign out = in[0] + in[1] + in[2];

endmodule