计算输入

时间:2013-03-03 05:36:56

标签: verilog

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

module 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都相同。

有找到它们的简单方法吗?

此致

3 个答案:

答案 0 :(得分:5)

怎么样

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

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

答案 1 :(得分:1)

如果您不需要合成代码,并且您的模拟器支持SystemVerilog语法,则可以使用$countones系统函数。例如,请参阅IEEE Std 1800-2009。

答案 2 :(得分:0)

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