在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: abonic

[求助] Verilog如何判别一个多bit数中含有1的个数

[复制链接]
发表于 2010-3-18 17:24:26 | 显示全部楼层
位数的的话就直接移位相加就行了。时序也比较好控制。
发表于 2010-3-18 22:53:42 | 显示全部楼层
可以移位操作 每移一次加一次
发表于 2010-3-19 14:12:08 | 显示全部楼层
我想方法还是比较多的。
如果不用流水线设计,单纯复用一个加法模块的话,移位加就好,每个周期移位一次,加一次,设定好对位数的寄存,加过一遍后锁存,就行了。
如果是想用流水,那么就要将加法展开,比如对于一个8bits的数字,你想计一个的个数的话,先分成四个1bit_add,然后再将四个结果分成两个2_bits_add,最后再用一个3_bits_add就能算出结果了。
发表于 2010-3-19 14:26:12 | 显示全部楼层
单周期运算
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个周期
发表于 2010-3-19 15:28:01 | 显示全部楼层
这个问题很简单吧
发表于 2010-3-19 16:38:01 | 显示全部楼层
这个在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
发表于 2010-3-19 19:37:09 | 显示全部楼层
帮你顶下
发表于 2013-6-17 12:20:33 | 显示全部楼层
这个问题很好的阐述了area and speed的trade off.
发表于 2013-6-29 22:40:27 | 显示全部楼层
总宽度知道不?如果这个是固定的就好办,我都是写:
d[0]+d[1]+d[2].....
虽然有点费资源,但是简单
发表于 2013-6-30 12:20:13 | 显示全部楼层




   我比较死板,从来不在时序逻辑里用阻塞赋值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-3 13:07 , Processed in 0.029041 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表