在博文《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文件。轉載請注明出處。