----------------------------------------------------------------------- -- $Header: /tmp/cvsroot/VHDL/lib/misc/utils_pkg.vhd,v 1.4 2010-02-09 07:46:19 Jens Exp $ ----------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; use IEEE.MATH_REAL.ALL; package utils_pkg is -- Constants -- Functions function NextPowerOfTwo(x : real) return real; function NextExpBaseTwo(x : real) return real; function NextPowerOfTwo(x : natural) return natural; function NextExpBaseTwo(x : natural) return natural; function GCD(a, b : natural) return natural; function LCM(a, b : natural) return natural; function UTILS_PERIOD_NS(f_in_MHz : real) return real; function UTILS_FREQ_M(f_in_MHz, f_out_MHz : real) return natural; function UTILS_FREQ_D(f_in_MHz, f_out_MHz : real) return natural; end utils_pkg; package body utils_pkg is function NextExpBaseTwo(x : real) return real is begin return ceil(log2(x)); end NextExpBaseTwo; function NextPowerOfTwo(x : real) return real is begin return 2.0**NextExpBaseTwo(x); end NextPowerOfTwo; function NextExpBaseTwo(x : natural) return natural is begin return natural(NextExpBaseTwo(real(x))); end NextExpBaseTwo; function NextPowerOfTwo(x : natural) return natural is begin return 2**NextExpBaseTwo(x); end NextPowerOfTwo; function GCD(a, b : natural) return natural is variable aa : natural; variable bb : natural; begin aa := a; bb := b; while bb /= 0 loop if aa > bb then aa := aa - bb; else bb := bb - aa; end if; end loop; return aa; end GCD; function LCM(a, b : natural) return natural is begin return (a * b)/GCD(a, b); end LCM; function UTILS_PERIOD_NS(f_in_MHz : real) return real is begin return 1.0E3/f_in_MHz; end UTILS_PERIOD_NS; function UTILS_FREQ_M(f_in_MHz, f_out_MHz : real) return natural is variable f_in_hz : natural; variable f_out_hz : natural; variable m : natural; begin f_in_hz := natural(f_in_MHz*1.0E6); f_out_hz := natural(f_out_MHz*1.0E6); m := f_out_hz/GCD(f_in_hz, f_out_hz); if m = 1 then m := 2; end if; return m; end UTILS_FREQ_M; function UTILS_FREQ_D(f_in_MHz, f_out_MHz : real) return natural is variable f_in_hz : natural; variable f_out_hz : natural; variable m : natural; variable d : natural; begin m := UTILS_FREQ_M(f_in_MHz, f_out_MHz); f_in_hz := natural(f_in_MHz*1.0E6); f_out_hz := natural(f_out_MHz*1.0E6); d := m*f_in_hz/f_out_hz; return d; end UTILS_FREQ_D; end utils_pkg;