在看别人的面试经历中,有一个有意思的问题,就是求一个32bits数据中1的个数。
一、移位计数法
在看到这个问题的第一反应,想到的是用移位的方法检测输入数据每一个bit的数据,再将数据为1的bit进行计数,得到最终结果。代码如下:
module count_bits(
input rst, clk,
input [31:0] data_in,
input request,
output idle, // 空闲信号
output count_done, // 完成信号
output [5:0] result // 最多为32个数据都为1
);
integer i;
reg [7:0] count;
reg idle_flag, count_done_flag;
always @(negedge rst or posedge clk) begin
if (!rst) begin
count <= 8'h0;
i <= 0;
idle_flag <= 1'b1;
count_done <= 1'b0;
end
else if (!request) begin
count <= 8'h0;
i <= 0;
idle_flag <= 1'b1;
count_done <= 1'b0;
end
else if (request) begin
idle <= 1'b0;
if (i < 'd32) begin
count <= count + data_in[i];
i <= i + 1'