7bit input 设计电路,算一共有几个1
时间:10-02
整理:3721RD
点击:
如题,硬件电路怎么实现呢?
这种操作叫做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
一个模七计数器 一个移位寄存器 再加一个加法器?
四个一位加法器就可以实现了。
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
还有算1的个数 你们都没说 只是加法了
7bit 输入的每位相加即可:a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6] = 1的个数。
