Verilog 投入计算

Verilog 投入计算,verilog,Verilog,我想计算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 ==

我想计算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也是如此


有没有找到答案的简单方法?

您可以在中查找答案。如果速度很重要,空间不是问题,你可以考虑一个256字节的查找表。否则,可能使用并测量它是否实际比查找表慢;如果内存慢,CPU快,它可能比查找表快。

怎么样

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

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

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

…您似乎也犯了一个错误:输入==128?2:0这是针对HDL的,不是CPU编程语言,所以我不确定这些语言中的大多数是否合适。