rtps-fpga/src/math_pkg.vhd

86 lines
2.6 KiB
VHDL

-- altera vhdl_input_version vhdl_2008
-- XXX: QSYS Fix (https://www.intel.com/content/www/us/en/support/programmable/articles/000079458.html)
package math_pkg is
-- calculates the logarithm dualis of the operand and rounds up
-- the result to the next integer value.
function log2c(constant value : in integer) return integer;
-- returns the maximum of the two operands
function max(constant value1, value2 : in integer) return integer;
-- returns the maximum of the three operands
function max(constant value1, value2, value3 : in integer) return integer;
-- returns the minimum of the two operands
function min(constant value1, value2 : in integer) return integer;
function round_div(constant dividend, divisor : in integer) return integer;
end package;
package body math_pkg is
--*****FUNCTION DEFINITION*****
function log2(constant value : in integer) return integer is
variable ret_value : integer;
variable cur_value : integer;
begin
ret_value := 0;
cur_value := 1;
while cur_value < value loop
ret_value := ret_value + 1;
cur_value := cur_value * 2;
end loop;
return ret_value;
end function;
function log2c(constant value : in integer) return integer is
variable ret : natural;
begin
ret := log2(value);
if (ret = 0) then
return 1;
else
return ret;
end if;
end function;
function max(constant value1, value2 : in integer) return integer is
variable ret_value : integer;
begin
if value1 > value2 then
ret_value := value1;
else
ret_value := value2;
end if;
return ret_value;
end function;
function max(constant value1, value2, value3 : in integer) return integer is
begin
return max(max(value1, value2), value3);
end function;
function min(constant value1, value2 : in integer) return integer is
variable ret_value : integer;
begin
if value1 < value2 then
ret_value := value1;
else
ret_value := value2;
end if;
return ret_value;
end function;
-- TODO: Rename to ceil_div, since we do not actually round
function round_div(constant dividend, divisor : in integer) return integer is
variable ret : integer;
begin
ret := dividend / divisor;
if (dividend mod divisor /= 0) then
ret := ret + 1;
end if;
return ret;
end function;
end package body;