diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd index 23437891ac8dc05577d823710b3c9c687c2f4025..98085930720f4bbdfe088f1323d2114f72b802ee 100644 --- a/libraries/base/common/src/vhdl/common_pkg.vhd +++ b/libraries/base/common/src/vhdl/common_pkg.vhd @@ -471,14 +471,24 @@ 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 + -- Convert between polar and rectangular coordinates 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 COMPLEX_PHASE( re, im : REAL; radians : BOOLEAN) RETURN REAL; -- phase in radians or degrees + FUNCTION COMPLEX_PHASE( re, im : INTEGER; radians : BOOLEAN) RETURN REAL; -- phase in radians or degrees + FUNCTION COMPLEX_PHASE( re, im : REAL) RETURN REAL; -- phase in degrees + FUNCTION COMPLEX_PHASE( re, im : INTEGER) RETURN REAL; -- phase in degrees + + FUNCTION COMPLEX_RE(ampl, phase : REAL; radians : BOOLEAN) RETURN REAL; -- phase in radians or degrees + FUNCTION COMPLEX_RE(ampl, phase : INTEGER; radians : BOOLEAN) RETURN REAL; -- phase in radians or 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; radians : BOOLEAN) RETURN REAL; -- phase in radians or degrees + FUNCTION COMPLEX_IM(ampl, phase : INTEGER; radians : BOOLEAN) RETURN REAL; -- phase in radians or 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 @@ -2263,6 +2273,7 @@ PACKAGE BODY common_pkg IS BEGIN RETURN (a_im*b_re + a_re*b_im); END; + FUNCTION COMPLEX_RADIUS(re, im : REAL) RETURN REAL IS BEGIN @@ -2277,36 +2288,79 @@ PACKAGE BODY common_pkg IS RETURN COMPLEX_RADIUS(REAL(re), REAL(im)); END; - FUNCTION COMPLEX_PHASE(re, im : REAL) RETURN REAL IS -- in degrees + FUNCTION COMPLEX_PHASE(re, im : REAL; radians : BOOLEAN) RETURN REAL IS BEGIN - RETURN ATAN2(Y => im, X => re) * 360.0 / MATH_2_PI; + IF radians = TRUE THEN + RETURN ATAN2(Y => im, X => re); + ELSE + RETURN ATAN2(Y => im, X => re) * 360.0 / MATH_2_PI; + END IF; END; - FUNCTION COMPLEX_PHASE(re, im : INTEGER) RETURN REAL IS -- in degrees + FUNCTION COMPLEX_PHASE(re, im : INTEGER; radians : BOOLEAN) RETURN REAL IS BEGIN - RETURN COMPLEX_PHASE(REAL(re), REAL(im)); + RETURN COMPLEX_PHASE(REAL(re), REAL(im), radians); END; - FUNCTION COMPLEX_RE(ampl, phase : REAL) RETURN REAL IS -- phase in degrees + FUNCTION COMPLEX_PHASE(re, im : REAL) RETURN REAL IS BEGIN - RETURN ampl * COS(phase * MATH_2_PI / 360.0); + RETURN COMPLEX_PHASE(re, im, FALSE); END; - FUNCTION COMPLEX_RE(ampl, phase : INTEGER) RETURN REAL IS -- phase in degrees + FUNCTION COMPLEX_PHASE(re, im : INTEGER) RETURN REAL IS BEGIN - RETURN COMPLEX_RE(REAL(ampl), REAL(phase)); + RETURN COMPLEX_PHASE(REAL(re), REAL(im), FALSE); END; - FUNCTION COMPLEX_IM(ampl, phase : REAL) RETURN REAL IS -- phase in degrees + FUNCTION COMPLEX_RE(ampl, phase : REAL; radians : BOOLEAN) RETURN REAL IS BEGIN - RETURN ampl * SIN(phase * MATH_2_PI / 360.0); + IF radians = TRUE THEN + RETURN ampl * COS(phase); + ELSE + RETURN ampl * COS(phase * MATH_2_PI / 360.0); + END IF; END; - FUNCTION COMPLEX_IM(ampl, phase : INTEGER) RETURN REAL IS -- phase in degrees + FUNCTION COMPLEX_RE(ampl, phase : INTEGER; radians : BOOLEAN) RETURN REAL IS BEGIN - RETURN COMPLEX_IM(REAL(ampl), REAL(phase)); + RETURN COMPLEX_RE(REAL(ampl), REAL(phase), radians); END; + FUNCTION COMPLEX_RE(ampl, phase : REAL) RETURN REAL IS + BEGIN + RETURN COMPLEX_RE(ampl, phase, FALSE); + END; + + FUNCTION COMPLEX_RE(ampl, phase : INTEGER) RETURN REAL IS + BEGIN + RETURN COMPLEX_RE(REAL(ampl), REAL(phase), FALSE); + END; + + FUNCTION COMPLEX_IM(ampl, phase : REAL; radians : BOOLEAN) RETURN REAL IS + BEGIN + IF radians = TRUE THEN + RETURN ampl * SIN(phase); + ELSE + RETURN ampl * SIN(phase * MATH_2_PI / 360.0); + END IF; + END; + + FUNCTION COMPLEX_IM(ampl, phase : INTEGER; radians : BOOLEAN) RETURN REAL IS + BEGIN + RETURN COMPLEX_IM(REAL(ampl), REAL(phase), radians); + END; + + FUNCTION COMPLEX_IM(ampl, phase : REAL) RETURN REAL IS + BEGIN + RETURN COMPLEX_IM(ampl, phase, FALSE); + END; + + FUNCTION COMPLEX_IM(ampl, phase : INTEGER) RETURN REAL IS + BEGIN + RETURN COMPLEX_IM(REAL(ampl), REAL(phase), FALSE); + END; + + FUNCTION SHIFT_UVEC(vec : STD_LOGIC_VECTOR; shift : INTEGER) RETURN STD_LOGIC_VECTOR IS BEGIN IF shift < 0 THEN