微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > Verilog如何判别一个多bit数中含有1的个数

Verilog如何判别一个多bit数中含有1的个数

时间:10-02 整理:3721RD 点击:
如题
//bow

象c一样写循环?

可否具体些,给出几条代码

1.如果位数少的话可以用查找表,就是事先罗列所有的可能的一个表格
2,如果位数较多的话,一步步移位,判断移出位为1还是0,对已进行计数
想到的就是这些,不知道那位大大有更方便的!

可以用逐次移位比较的办法

对于第二种方法,可否给出几个关键语句
谢谢!

愿闻其详!

自己顶一下

可以这样吧,每一位取出来相加,等于多少就是几位1啊
我记得又一次我们还讨论的

关键是怎么把多bit数里的每一个bit取出来?
ps:我们之前有讨论过吗?

位数的的话就直接移位相加就行了。时序也比较好控制。

可以移位操作 每移一次加一次

我想方法还是比较多的。
如果不用流水线设计,单纯复用一个加法模块的话,移位加就好,每个周期移位一次,加一次,设定好对位数的寄存,加过一遍后锁存,就行了。
如果是想用流水,那么就要将加法展开,比如对于一个8bits的数字,你想计一个的个数的话,先分成四个1bit_add,然后再将四个结果分成两个2_bits_add,最后再用一个3_bits_add就能算出结果了。

单周期运算
reg  [7:0] data;
wire bit0,bit1,bit2,bit3,bit4,bit5,bit6,bit7;
wire [3:0] sum;
assign bit0 = data[0];
assign bit1 = data[1];
assign bit2 = data[2];
assign bit3 = data[3];
assign bit4 = data[4];
assign bit5 = data[5];
assign bit6 = data[6];
assign bit7 = data[7];
assign sum = ((bit0+bit1) + ( bit2+bit3)) + ((bit4+bit5) + (bit6+bit7));
多周期运算的话,每次对data[0]累加,加完一次后把data右移一位,直到全部加完,这种面积小,但需要8个周期

这个问题很简单吧

这个在verilog语法书中是最基本的例子:
parameter WIDTH=8;
input [WIDTH-1:0] data;
integer i;
always @(posedge clk ) begin
  if (~reset)
    crc=0;
  else begin
    for (i=0;i<=[WIDTH-1];i=i+1)
      crc=crc+data[i];
  end
end

帮你顶下

这个问题很好的阐述了area and speed的trade off.

总宽度知道不?如果这个是固定的就好办,我都是写:
d[0]+d[1]+d[2].....
虽然有点费资源,但是简单

   我比较死板,从来不在时序逻辑里用阻塞赋值


我来深化一下:
1>在verilog层面用loop, 在硬件层面就是用shift逐位比较,为一就用个counter计数
for (i = size; i > 0; i = i - 1) begin
        cnt < = cnt + in(i);
end骚年把这个记住吧,在电路实现层面verilog能用到loop的地方屈指可数。
用这个的好处是输入数据位width未知,当lsb被shift out后cnt的数值就是输入数据1的个数
缺点是比较慢,多少width就要多少个时钟cycle。
2>用FA来实现,前提是已知width。优点是整个电路是pure combination,所以运算速度会很快,但是这是牺牲面积的前提下。
从这点出发上面两种选择很好的体现了面积和速度的trade off。
这是个很常规的面试问题,如果我是面试官上面讲的是一定要说到的。

for循环一下,直接加不就搞定了?



   那综合的问题?怎么解决

逐次移位比较

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

网站地图

Top