From 1b28175222b4b33bb5554a25b10de34a6bfe194c Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Thu, 10 Mar 2022 09:05:24 +0100 Subject: [PATCH] Added functions COMPLEX_*() to convert between polar and rectangular coordinates. --- libraries/base/common/src/vhdl/common_pkg.vhd | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd index 13d8042484..23437891ac 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 -- GitLab