----------------------------------------------------------------------- -- $Header: /tmp/cvsroot/VHDL/lib/misc/utils_pkg.vhd,v 1.3 2009-11-03 20:38:30 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_hz : natural) return real; function UTILS_FREQ_M(f_in_hz, f_out_hz : natural) return natural; function UTILS_FREQ_D(f_in_hz, f_out_hz : natural) 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_hz : natural) return real is begin return 1.0E9/real(f_in_hz); end UTILS_PERIOD_NS; function UTILS_FREQ_M(f_in_hz, f_out_hz : natural) return natural is variable f_in_mhz : natural; variable f_out_mhz : natural; variable m : natural; begin f_in_mhz := f_in_hz/1E6; f_out_mhz := f_out_hz/1E6; m := f_out_mhz/GCD(f_in_mhz, f_out_mhz); if m = 1 then m := 2; end if; return m; end UTILS_FREQ_M; function UTILS_FREQ_D(f_in_hz, f_out_hz : natural) return natural is variable f_in_mhz : natural; variable f_out_mhz : natural; variable m : natural; variable d : natural; begin m := UTILS_FREQ_M(f_in_hz, f_out_hz); f_in_mhz := f_in_hz/1E6; f_out_mhz := f_out_hz/1E6; d := m*f_in_mhz/f_out_mhz; return d; end UTILS_FREQ_D; end utils_pkg;