微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 7bit input 设计电路,算一共有几个1

7bit input 设计电路,算一共有几个1

时间:10-02 整理:3721RD 点击:
如题,硬件电路怎么实现呢?

一个模七计数器  一个移位寄存器 再加一个加法器?

四个一位加法器就可以实现了。

7位的输入很简单, 可以用加法器做, 如果位数多了,用加法器的delay就比较大了。
对于7位的输入, 正好可以用2个一位加法器和一个2位加法器,这样速度也会快些。

  1. module popcnt(di, vcnt);
  2. input [6:0] di;
  3. output [2:0] vcnt;

  4. wire sum0, sum1;
  5. wire [1:0] sum2;
  6. wire [2:0] co;

  7. DW01_add #(1) add1b0 (.A(di[1]), .B(di[2]), .CI[di[0]), .SUM(sum0), .CO(co[0]));
  8. DW01_add #(1) add1b1 (.A(di[4]), .B(di[5]), .CI[di[3]), .SUM(sum1), .CO(co[1]));

  9. DW01_add #(2) add2b0 (.A({co[0], sum0}), .B({co[1], sum1}), .CI(di[6]), .SUM(sum2), .CO(co[2]));

  10. assign vcnt = {co[2], sum2};

  11. 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的个数。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top