diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd index 13d8042484abd05f906b0b30d243174e12139cb2..23437891ac8dc05577d823710b3c9c687c2f4025 100644 --- a/libraries/base/common/src/vhdl/common_pkg.vhd +++ b/libraries/base/common/src/vhdl/common_pkg.vhd @@ -470,7 +470,16 @@ PACKAGE common_pkg IS FUNCTION COMPLEX_MULT_REAL(a_re, a_im, b_re, b_im : INTEGER) RETURN INTEGER; -- Calculate real part of complex multiplication: a_re*b_re - a_im*b_im FUNCTION COMPLEX_MULT_IMAG(a_re, a_im, b_re, b_im : INTEGER) RETURN INTEGER; -- Calculate imag part of complex multiplication: a_im*b_re + a_re*b_im - + + FUNCTION COMPLEX_RADIUS(re, im : REAL) RETURN REAL; + FUNCTION COMPLEX_RADIUS(re, im : INTEGER) RETURN REAL; + FUNCTION COMPLEX_PHASE( re, im : REAL) RETURN REAL; -- in degrees + FUNCTION COMPLEX_PHASE( re, im : INTEGER) RETURN REAL; -- in degrees + FUNCTION COMPLEX_RE(ampl, phase : REAL) RETURN REAL; -- phase in degrees + FUNCTION COMPLEX_RE(ampl, phase : INTEGER) RETURN REAL; -- phase in degrees + FUNCTION COMPLEX_IM(ampl, phase : REAL) RETURN REAL; -- phase in degrees + FUNCTION COMPLEX_IM(ampl, phase : INTEGER) RETURN REAL; -- phase in degrees + FUNCTION SHIFT_UVEC(vec : STD_LOGIC_VECTOR; shift : INTEGER) RETURN STD_LOGIC_VECTOR; -- < 0 shift left, > 0 shift right FUNCTION SHIFT_SVEC(vec : STD_LOGIC_VECTOR; shift : INTEGER) RETURN STD_LOGIC_VECTOR; -- < 0 shift left, > 0 shift right @@ -2255,6 +2264,49 @@ PACKAGE BODY common_pkg IS RETURN (a_im*b_re + a_re*b_im); END; + FUNCTION COMPLEX_RADIUS(re, im : REAL) RETURN REAL IS + BEGIN + -- Must use ABS() with ** of real, because (negative)**2.0 yields error and value 0.0. + -- Must must use brackets (ABS()) to avoid compile error. + -- Alternative equivalent code would be: SQRT(re * re + im * im). + RETURN SQRT((ABS(re))**2.0 + (ABS(im))**2.0); + END; + + FUNCTION COMPLEX_RADIUS(re, im : INTEGER) RETURN REAL IS + BEGIN + RETURN COMPLEX_RADIUS(REAL(re), REAL(im)); + END; + + FUNCTION COMPLEX_PHASE(re, im : REAL) RETURN REAL IS -- in degrees + BEGIN + RETURN ATAN2(Y => im, X => re) * 360.0 / MATH_2_PI; + END; + + FUNCTION COMPLEX_PHASE(re, im : INTEGER) RETURN REAL IS -- in degrees + BEGIN + RETURN COMPLEX_PHASE(REAL(re), REAL(im)); + END; + + FUNCTION COMPLEX_RE(ampl, phase : REAL) RETURN REAL IS -- phase in degrees + BEGIN + RETURN ampl * COS(phase * MATH_2_PI / 360.0); + END; + + FUNCTION COMPLEX_RE(ampl, phase : INTEGER) RETURN REAL IS -- phase in degrees + BEGIN + RETURN COMPLEX_RE(REAL(ampl), REAL(phase)); + END; + + FUNCTION COMPLEX_IM(ampl, phase : REAL) RETURN REAL IS -- phase in degrees + BEGIN + RETURN ampl * SIN(phase * MATH_2_PI / 360.0); + END; + + FUNCTION COMPLEX_IM(ampl, phase : INTEGER) RETURN REAL IS -- phase in degrees + BEGIN + RETURN COMPLEX_IM(REAL(ampl), REAL(phase)); + END; + FUNCTION SHIFT_UVEC(vec : STD_LOGIC_VECTOR; shift : INTEGER) RETURN STD_LOGIC_VECTOR IS BEGIN IF shift < 0 THEN