我想在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都相同。
有找到它们的简单方法吗?
此致
答案 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速度很快,它可能比查找表更快。)