86 lines
2.6 KiB
VHDL
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;
|