FPGA实现最高非零位的快速确定问题
对于任意一个16位数据,如何快速确定它的最高非零位的位置。 我的思路与上1000_0000_0000_0000,结果为1,那左起第一位为最高非零位,如果为0再与0100_0000_0000_0000,以此类推 感谢2楼,这个行到是行,有没有更省时省事的做法,比如说比较一次就可以判断出来的。回复 板凳crazy31415926 的帖子
这个方案还不够省事吗,本身就不是多复杂,干嘛要非常简化? 精益求精回复 5楼chenzhufly 的帖子
想到啥好的办法没? <div class='shownolgin' data-isdigest='no'>别忘了 FPGA是并行运算,可以按位取bit的哦</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <div class='shownolgin' data-isdigest='no'>reg data;wire out;
assign out = (data == 0) ?8'd15 :
(data == 0) ?8'd14 :
....................................
(data == 0) ?8'd1 :8'd0</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'><p>版主还在吗?我这有一套更好的找最高非零的算法,不仅仅可以找16位的,更多位宽的也可以找,我贴一个我自己写的8位的代码。</p>
<pre>
<code>module DetectionSequence8BitFirst1 #(
parameter LATENCY = 1
)(
inputwire clk,
inputwire nUsrRst,
inputwire iData,
output logic oFirst1Location,
output logic oNonZeroFlag
);
logic data;
logic dataTmp0;
logic dataTmp1;
logic dataTmp2;
logic 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 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3;
end
end
else if(LATENCY == 1) begin
always_ff @(posedge clk) begin
oFirst1Location <= dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3 + dataTmp3;
end
end
endgenerate
endmodule</code></pre>
<p> </p>
</div><script>showreplylogin();</script>
页:
[1]