用verilog實現log2的一種方法


在博文《Computing the Logarithm Base 2》和《Getting the Log Base 2 Algorithm to Synthesize》中,作者把log2(x)的運算分成了整數部分和小數部分。其中,整數部分通過一個遞歸模塊來實現(這個我是第一次看到,原來還能這么用),小數部分通過查找表來實現。

在網上找log2的verilog實現基本都是下面的function:

function integer log2;
  input integer value;
  begin
    value = value-1;
    for (log2=0; value>0; log2=log2+1)
      value = value>>1;
  end
endfunction

這個是無法綜合實現的。仔細分析一下可以發現這是log2(x)運算的整數部分,等效於去找value的最左邊第一個1出現的位置。上面博文中的作者用遞歸算法實現,正常還可以用二分法實現。

綜上所述,我使用的方法同樣是把log2(x)的運算分成整數部分和小數部分。其中,整數部分通過二分法實現來實現,小數部分通過查找表來實現。

綜合后的時序仿真結果如下圖所示:

使用matlab驗證結果,將仿真得到的結果和實際的結果相減,如下圖所示。可以看到最大偏差不超過0.03。

Implementation后的實際測試結果我沒有試過,估計問題不大。我的輸入和輸出都是8位數,輸出整數部分為3位(因為log2(255)=7.9944<8,所以3位夠了),小數部分為8-3=5位。如果你需要提高精度,可以增大小數位數,相應的查找表需要修改。

工程下載地址,包括全部仿真文件和matlab文件。轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM