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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
123
返回列表 发新帖
楼主: 大林

[求助] 如何快速定位一个二进制数字中第一个1的位置

[复制链接]
 楼主| 发表于 2017-6-15 13:36:29 | 显示全部楼层
回复 20# 冲出藩篱
这样应该可以吧
always@(*)  //data2 64 bits
begin
  if(data1[127:64] == 0)
  begin
    pos[6] = 1'b0;
    data2  = data1[63:0];
  end
  else
  begin
    pos[6] = 1'b1;
    data2  = data1[127:64];
  end
  
end
always@(*)  //data3 32 bits
begin
  if(data2[63:32] == 0)
  begin
    pos[5] = 1'b0;
    data3  = data2[31:0];
  end
  else
  begin
    pos[5] = 1'b1;
    data3  = data2[63:32];
  end
  
end
always@(*)  //data4 16 bits
begin
  if(data3[31:16] == 0)
  begin
    pos[4] = 1'b0;
    data4  = data3[15:0];
  end
  else
  begin
    pos[4] = 1'b1;
    data4  = data3[31:16];
  end
  
end
always@(*)  //data5 8 bits
begin
  if(data4[15:8] == 0)
  begin
    pos[3] = 1'b0;
    data5  = data4[7:0];
  end
  else
  begin
    pos[3] = 1'b1;
    data5  = data4[15:8];
  end
  
end
always@(*)  //data6 4 bits
begin
  if(data5[7:4] == 0)
  begin
    pos[2] = 1'b0;
    data6  = data5[3:0];
  end
  else
  begin
    pos[2] = 1'b1;
    data6  = data5[7:4];
  end
  
end
always@(*)  //data7 2 bits
begin
  if(data6[3:2] == 0)
  begin
    pos[1] = 1'b0;
    data7  = data6[1:0];
  end
  else
  begin
    pos[1] = 1'b1;
    data7  = data6[3:2];
  end
  
end
always@(*)
begin
    if(data7[1] == 0)
      pos[0] = 1'b0;
  else
      pos[1] = 1'b1;
  
end
发表于 2017-6-15 14:22:40 | 显示全部楼层
回复 21# 大林
个人的看法:
这样和使用并行if的优先级编码方式,理论上是一个道理。这种方法是你代替编译工具,完成了优先级编码。
而使用并行if的方法是把这个工作交给编译软件去做,性能和资源的使用方面我认为是一样的。
不过你这样写,比写128个if要简洁一些。
发表于 2017-6-15 19:48:52 | 显示全部楼层
回复 14# 大林

我写了一个16位的可以试试,我仿真过了,可以的
always @ (posedge clk)begin
    data_vld_d1 <= data_vld;
end

always @ (*)begin
if (data_vld) begin
     data = data_in;
     cnt = 'b0;
end
else begin
     if (data_vld_d1) begin
         if ((~data[15]) && (cnt <= 4'd15)) begin
             cnt = cnt + 1;
             data = data << 1;
          end
          else begin
          end
//       else begin
//       end
       end
end
end

always @ (posedge clk or negedge resetn)begin
if (data_vld_d1) begin
     firstbit <= 4'd15 - cnt;
     end
end
发表于 2017-6-15 19:49:50 | 显示全部楼层
回复 14# 大林


    我谢了一个16位的,仿真过了,你可以试试
always @ (posedge clk)begin
    data_vld_d1 <= data_vld;
end

always @ (*)begin
if (data_vld) begin
     data = data_in;
     cnt = 'b0;
end
else begin
     if (data_vld_d1) begin
         if ((~data[15]) && (cnt <= 4'd15)) begin
             cnt = cnt + 1;
             data = data << 1;
          end
          else begin
          end
//       else begin
//       end
       end
end
end

always @ (posedge clk or negedge resetn)begin
if (data_vld_d1) begin
     firstbit <= 4'd15 - cnt;
     end
end
 楼主| 发表于 2017-6-16 09:37:53 | 显示全部楼层
回复 24# 殷工


    谢谢啦
 楼主| 发表于 2017-6-21 15:02:34 | 显示全部楼层
回复 19# njithjw


    这个确实比分级查找的要快一点,特别是位数很多的时候;如果全部改为组合逻辑,估计会更快。
发表于 2018-11-19 17:55:55 | 显示全部楼层
就1个1把还不简单吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-14 11:20 , Processed in 0.018499 second(s), 6 queries , Gzip On, Redis On.

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