|
发表于 2013-5-1 13:11:57
|
显示全部楼层
本帖最后由 mipsgreen 于 2013-5-1 13:21 编辑
7位的输入很简单, 可以用加法器做, 如果位数多了,用加法器的delay就比较大了。
对于7位的输入, 正好可以用2个一位加法器和一个2位加法器,这样速度也会快些。
- module popcnt(di, vcnt);
- input [6:0] di;
- output [2:0] vcnt;
- wire sum0, sum1;
- wire [1:0] sum2;
- wire [2:0] co;
- DW01_add #(1) add1b0 (.A(di[1]), .B(di[2]), .CI[di[0]), .SUM(sum0), .CO(co[0]));
- DW01_add #(1) add1b1 (.A(di[4]), .B(di[5]), .CI[di[3]), .SUM(sum1), .CO(co[1]));
- DW01_add #(2) add2b0 (.A({co[0], sum0}), .B({co[1], sum1}), .CI(di[6]), .SUM(sum2), .CO(co[2]));
- assign vcnt = {co[2], sum2};
- endmodule
复制代码
这种操作叫做population count, 常见于X86的SSE4和一些DSP中的POPCNT指令。
当位数比较大,比如64位时, POPCNT的计算就不能这样实现,实现的方法
主要看设计的约束,是需要追求速度,还是追求面积,
http://en.wikipedia.org/wiki/Hamming_weight
这里介绍了64b数据POPCNT的算法, 硬件实现也是可以借鉴的
下面是一个popcnt的generator:
http://opencores.org/project,popcount_gen |
|