我有一个16位数字,我想除以100。假设它是50000。目标是获得500。但是,我试图避免在我的FPGA上使用推断的分频器,因为它们会破坏时序要求。结果不一定是准确的;一个近似值即可。
我已尝试将硬件乘以0.01,但不支持实数。我现在正在研究流水线分隔符,但我希望它不会成为现实。
从概念上讲:乘以655(= 65536/100),然后向右移16位。当然,在硬件中,右移是免费的。
如果您需要更快的速度,则可以将除法作为除法之和除以2的幂(移位)。例如,
1/100 ~= 1/128 = 0.0078125
1/100 ~= 1/128 + 1/256 = 0.01171875
1/100 ~= 1/128 + 1/512 = 0.009765625
1/100 ~= 1/128 + 1/512 + 1/2048 = 0.01025390625
1/100 ~= 1/128 + 1/512 + 1/4096 = 0.010009765625
etc.
在C代码中,上面的最后一个示例是:
uint16_t divideBy100 (uint16_t input)
{
return (input >> 7) + (input >> 9) + (input >> 12);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句