Si tiene un reloj, puede usar un mux para recorrer y contar las entradas.
Si esta debe ser una lógica combinatoria, puede buscar en el "árbol de compresores" métodos eficientes.
La idea básica de un árbol de compresores es reducir el número de señales en cada etapa en cascada hasta que las señales representen la suma final:
Un sumador de 2 entradas no ayuda mucho en esta situación porque la suma de dos bits de entrada todavía necesita dos bits de salida para representar la cuenta de 0, 1 o 2 bits de entrada alta. Pero como Jotorius señaló en los comentarios, puede crear una lógica que agregue grupos de tres bits de entrada para generar las correspondientes sumas de dos bits (0, 1, 2 o 3 entradas altas). Esto está progresando porque la cantidad de señales se ha reducido en un factor de 2/3. La siguiente etapa utiliza el mismo enfoque, pero ahora los bits de entrada tienen diferentes ponderaciones o "rangos". La mitad de los bits tienen un peso de 1 (los LSB de las sumas de dos bits) y los otros tienen un peso de 2 (los MSB de las sumas de dos bits).
En la segunda etapa, los bits del 1 se suman en grupos de tres y los bits del 2 se agrupan y se suman en grupos de tres, lo que resulta en un conjunto aún más pequeño de señales con pesos de 1, 2 y 4. (La suma los bits de las entradas de 2 tendrán un peso de 2 y 4.)
Las etapas del compresor continúan hasta que solo quedan dos o menos bits de cada peso. En este punto, puede utilizar un sumador de arrastre de ondulación estándar para obtener el resultado final.
Dependiendo de la cantidad exacta de bits en cada etapa, algunos sumadores de tres bits no utilizarán todas sus entradas.
Un árbol de compresores no se limita a una compresión de 3: 2 en cada etapa. Por ejemplo, un FPGA con LUT de 6 entradas podría implementar de manera eficiente la compresión 6: 3 en cada etapa del árbol.
Si N es pequeña, puedes hacer trampa y usar una EEPROM paralela estática para hacer una tabla de búsqueda.