5219|8

6

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

FPGA实现最高非零位的快速确定问题 [复制链接]

对于任意一个16位数据,如何快速确定它的最高非零位的位置。
此帖出自FPGA/CPLD论坛

最新回复

版主还在吗?我这有一套更好的找最高非零的算法,不仅仅可以找16位的,更多位宽的也可以找,我贴一个我自己写的8位的代码。 module DetectionSequence8BitFirst1 #( parameter LATENCY = 1 )( input wire clk, input wire nUsrRst, input wire [7 :0] iData, output logic [2 :0] oFirst1Location, output logic oNonZeroFlag ); logic [7 :0] data; logic [7 :0] dataTmp0; logic [7 :0] dataTmp1; logic [7 :0] dataTmp2; logic [7 :0] dataTmp3; always_comb begin dataTmp0 = iData - 8'd1; dataTmp1 = ~dataTmp0; dataTmp2 = iData & dataTmp1; dataTmp3 = dataTmp2 - 8'd1; end assign oNonZeroFlag = (dataTmp3 == 8'hff) ? 1'b0 : 1'b1; generate if(LATENCY == 0) begin always_comb begin oFirst1Location = dataTmp3[0] + dataTmp3[1] + dataTmp3[2] + dataTmp3[3] + dataTmp3[4] + dataTmp3[5] + dataTmp3[6] + dataTmp3[7]; end end else if(LATENCY == 1) begin always_ff @(posedge clk) begin oFirst1Location <= dataTmp3[0] + dataTmp3[1] + dataTmp3[2] + dataTmp3[3] + dataTmp3[4] + dataTmp3[5] + dataTmp3[6] + dataTmp3[7]; end end endgenerate endmodule     详情 回复 发表于 2024-5-30 11:25
点赞 关注
 

回复
举报

6423

帖子

16

TA的资源

版主

沙发
 
我的思路与上1000_0000_0000_0000,结果为1,那左起第一位为最高非零位,如果为0再与0100_0000_0000_0000,以此类推
此帖出自FPGA/CPLD论坛
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
感谢2楼,这个行到是行,有没有更省时省事的做法,比如说比较一次就可以判断出来的。
此帖出自FPGA/CPLD论坛

点评

这个方案还不够省事吗,本身就不是多复杂,干嘛要非常简化?  详情 回复 发表于 2013-8-26 21:56
 
 
 

回复

6423

帖子

16

TA的资源

版主

4
 

回复 板凳crazy31415926 的帖子

这个方案还不够省事吗,本身就不是多复杂,干嘛要非常简化?
此帖出自FPGA/CPLD论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

5
 
精益求精
此帖出自FPGA/CPLD论坛

点评

想到啥好的办法没?  详情 回复 发表于 2013-8-27 19:35
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

6423

帖子

16

TA的资源

版主

6
 

回复 5楼chenzhufly 的帖子

想到啥好的办法没?
此帖出自FPGA/CPLD论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

7
 
别忘了 FPGA是并行运算,可以按位取bit的哦
此帖出自FPGA/CPLD论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

5979

帖子

8

TA的资源

版主

8
 
reg [15:0] data;
wire [7:0]out;
assign out = (data[15] == 0) ?  8'd15 :
                        (data[14] == 0) ?  8'd14 :
                           ....................................
                        (data[1] == 0) ?  8'd1 :  8'd0
此帖出自FPGA/CPLD论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 

版主还在吗?我这有一套更好的找最高非零的算法,不仅仅可以找16位的,更多位宽的也可以找,我贴一个我自己写的8位的代码。

module DetectionSequence8BitFirst1 #(
  parameter LATENCY = 1
)(
  input  wire         clk,
  input  wire         nUsrRst,
  input  wire  [7 :0] iData,
  output logic [2 :0] oFirst1Location,
  output logic        oNonZeroFlag
);
  logic [7 :0] data;
  logic [7 :0] dataTmp0;
  logic [7 :0] dataTmp1;
  logic [7 :0] dataTmp2;
  logic [7 :0] dataTmp3;

  always_comb begin
    dataTmp0 = iData - 8'd1;
    dataTmp1 = ~dataTmp0;
    dataTmp2 = iData & dataTmp1;
    dataTmp3 = dataTmp2 - 8'd1;
  end

  assign oNonZeroFlag = (dataTmp3 == 8'hff) ? 1'b0 : 1'b1;

generate
  if(LATENCY == 0) begin
    always_comb begin
      oFirst1Location = dataTmp3[0] + dataTmp3[1] + dataTmp3[2] + dataTmp3[3] + dataTmp3[4] + dataTmp3[5] + dataTmp3[6] + dataTmp3[7];
    end
  end
  else if(LATENCY == 1) begin
    always_ff @(posedge clk) begin
      oFirst1Location <= dataTmp3[0] + dataTmp3[1] + dataTmp3[2] + dataTmp3[3] + dataTmp3[4] + dataTmp3[5] + dataTmp3[6] + dataTmp3[7];
    end
  end
endgenerate
endmodule

 

此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表