Power function in vhdl

25,657

Solution 1

For simulation, you will find suitable power functions in the IEEE.math_real library

library IEEE;
use IEEE.math_real.all;
...
X <= 2 ** Y;
or
X <= 2.0 ** Y;

This is probably not synthesisable. If I needed a similar operation for synthesis, I would use a lookup table of values, slopes and second derivatives, and a quadratic interpolator. I have used this approach for reciprocal and square root functions to single precision accuracy; 2**n over a reasonable range of n is smooth enough that the same approach should work.

Solution 2

If an approximation would do, I think I would use the integer part of my exponent to determine the integer power of 2, like if the floating point number is 111.011010111 You know that the integer power of 2 part is 0b10000000. Then I would do a left to right conditional add based on the fractional bit, so for 111.011010111 you know you need to add implement 0b10000000 times ( 0*(1/2) + 1*(1/4) + 1*(1/8) + 0*(1/16).....and so on). 1/2, 1/4, 1/8, et cetera are right shifts of 0b10000000. This implements the integer part of the exponentiation, and then approximates the fractional part as multiplication of the integer part.

Share:
25,657
user1673892
Author by

user1673892

Updated on February 19, 2020

Comments

  • user1673892
    user1673892 about 4 years

    I want to make power function using vhdl where the power is floating number and the number is integer (will be always "2").

    2^ some floating number.

    I use ieee library and (fixed_float_types.all, fixed_pkg.all, and float_pkg.all).

    I thought of calculating all the possible outputs and save them in ROM, but i don't know the ranges of the power.

    How to implement this function and if there is any implemented function like this where to find it?

    thanks