0

我想计算 8 位输入中 1 的数量并输出其中有多少个。我发现这一点的方式非常粗糙和多余。我想知道是否有任何简单而好的方法可以找到它们。我的代码如下所示:

module my_8to4bit(in,out);

input [7:0]in;
output [3:0]out;


assign out=(input == 1 || input == 2 || input == 4 || input == 8 || input == 16 || input == 32 || input == 64 || input == 128)?1:
(input == 3 || input == 5 || input == 6 || input == 9 || input == 10 || input == 12 || input == 24 || input == 128)?2:0;

...同样适用于 8 位输入中的所有 1。

有没有一种简单的方法可以找到它们?

4

3 回答 3

5

怎么样

always @* begin
  out = 0;
  for(i=0;i<8;i=i+1) begin
    out = out + in[i];
  end
end

应该只合成 8 个加法器,每个位一个。

于 2013-03-03T07:00:00.293 回答
2

If you don't need to synthesize the code, and your simulator supports SystemVerilog syntax, you can use the $countones system function. Refer to the IEEE Std 1800-2009, for example.

于 2013-03-03T14:37:10.657 回答
0

您可以在Bit Twiddling Hacks中查找答案。如果速度很重要并且空间不是问题,您可以考虑使用 256 字节的查找表。否则,可能使用Brian Kernighan的方式(并测量它是否实际上比查找表慢;如果内存慢而CPU快,它可能比查找表快)。

于 2013-03-03T05:57:36.160 回答