diff --git a/lib/fixed/fixed_util_pkg.vhd b/lib/fixed/fixed_util_pkg.vhd index 584f186..77ad162 100644 --- a/lib/fixed/fixed_util_pkg.vhd +++ b/lib/fixed/fixed_util_pkg.vhd @@ -1,159 +1,159 @@ - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; -use IEEE.MATH_REAL.ALL; - -library ieee_proposed; -use ieee_proposed.math_utility_pkg.all; -use ieee_proposed.fixed_pkg.all; - -package fixed_util_pkg is - - ------------------------------------------------------------- - -- Frequently used constants - constant pi : real := 3.141592653589793e+000; - constant sqrt2 : real := 1.414213562373095e+000; - constant sqrt2_inv : real := 7.071067811865475e-001; - - -- Constructor helpers - -- Use: variable v8u6 : ufixed_t(ufixed(8,6)'range); - function uproto (nbits : integer; nbits_frac : integer) return ufixed; - - -- Use: variable v8s6 : sfixed_t(sfixed(8,6)'range); - function sproto (nbits : integer; nbits_frac : integer) return sfixed; - - -- Safe variant of uproto - function uhi (nbits : integer; nbits_frac : integer) return integer; - function ulo (nbits : integer; nbits_frac : integer) return integer; - - -- Safe variant of sproto - function shi (nbits : integer; nbits_frac : integer) return integer; - function slo (nbits : integer; nbits_frac : integer) return integer; - - function to_unsigned (src : ufixed) return UNSIGNED; - function to_signed (src : sfixed) return SIGNED; - - type real_array_t is array (natural range <>) of real; - type ufixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC; - type sfixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC; - - function to_sfixed_array(x : real_array_t; proto : sfixed) return sfixed_array_t; - function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) return sfixed_array_t; - - -- Slicing functions for unconstrained array types - function to_ufixed(src : ufixed_array_t; index : integer) return ufixed; - function to_sfixed(src : sfixed_array_t; index : integer) return sfixed; - -------------------------------------------------------------------------------- -end; -- package fixed_util_pkg; - -package body fixed_util_pkg is - - ------------------------------------------------------------- - -- Constuctor helpers - function uproto (nbits : integer; nbits_frac : integer) return ufixed is - constant result : ufixed (uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac)) := (others => '0'); - begin - return result(uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac)); - end uproto; - - ------------------------------------------------------------- - function sproto (nbits : integer; nbits_frac : integer) return sfixed is - constant result : sfixed (shi(nbits,nbits_frac) downto slo(nbits,nbits_frac)) := (others => '0'); - begin - return result(shi(nbits,nbits_frac) downto slo(nbits,nbits_frac)); - end sproto; - - ------------------------------------------------------------- - function uhi (nbits : integer; nbits_frac : integer) return integer is - begin - return nbits-nbits_frac-1; - end uhi; - - ------------------------------------------------------------- - function ulo (nbits : integer; nbits_frac : integer) return integer is - begin - return -nbits_frac; - end ulo; - - ------------------------------------------------------------- - function shi (nbits : integer; nbits_frac : integer) return integer is - begin - return nbits-nbits_frac; - end shi; - - ------------------------------------------------------------- - function slo (nbits : integer; nbits_frac : integer) return integer is - begin - return -nbits_frac+1; - end slo; - - ------------------------------------------------------------- - function to_unsigned (src : ufixed) return UNSIGNED is - subtype t is UNSIGNED(src'high - src'low downto 0); - variable slv : t; - begin - slv := t(src); - return UNSIGNED(to_X01(std_logic_vector(slv))); - - end function to_unsigned; - - ------------------------------------------------------------- - function to_signed (src : sfixed) return SIGNED is - subtype t is SIGNED(src'high - src'low downto 0); - variable slv : t; - begin - slv := t(src); - return SIGNED(to_X01(std_logic_vector(slv))); - - end function to_signed; - - function to_sfixed_array(x : real_array_t; proto : sfixed) return sfixed_array_t is - variable res : sfixed_array_t(0 to x'length-1, proto'range); - variable tt : sfixed(proto'range); - begin - for i in x'range loop - tt := to_sfixed(x(i), proto); - for j in proto'range loop - res(i,j) := tt(j); - end loop; - end loop; - return res; - end to_sfixed_array; - - --------------------------------------------------------------------------- - function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) return sfixed_array_t is - variable p : sfixed(shi(nbits, nbits_int) downto slo(nbits, nbits_int)); - begin - return to_sfixed_array(x, p); - end to_sfixed_array; - - ------------------------------------------------------------------------------- - -- ufixed <= ufixed_array(i) - function to_ufixed(src : ufixed_array_t; index : integer) return ufixed is - variable dst : ufixed(src'range(2)); - begin - for j in src'range(2) loop - dst(j) := src(index, j); - end loop; - - return dst; - - end to_ufixed; - - ------------------------------------------------------------------------------- - -- sfixed <= sfixed_array(i) - function to_sfixed(src : sfixed_array_t; index : integer) return sfixed is - variable dst : sfixed(src'range(2)); - begin - for j in src'range(2) loop - dst(j) := src(index, j); - end loop; - - return dst; - - end to_sfixed; - -------------------------------------------------------------------------------- -end; -- package fixed_util_pkg; + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; +use IEEE.MATH_REAL.ALL; + +library ieee_proposed; +use ieee_proposed.math_utility_pkg.all; +use ieee_proposed.fixed_pkg.all; + +package fixed_util_pkg is + + ------------------------------------------------------------- + -- Frequently used constants + constant pi : real := 3.141592653589793e+000; + constant sqrt2 : real := 1.414213562373095e+000; + constant sqrt2_inv : real := 7.071067811865475e-001; + + -- Constructor helpers + -- Use: variable v8u6 : ufixed_t(ufixed(8,6)'range); + function uproto (nbits : integer; nbits_frac : integer) return ufixed; + + -- Use: variable v8s6 : sfixed_t(sfixed(8,6)'range); + function sproto (nbits : integer; nbits_frac : integer) return sfixed; + + -- Safe variant of uproto + function uhi (nbits : integer; nbits_frac : integer) return integer; + function ulo (nbits : integer; nbits_frac : integer) return integer; + + -- Safe variant of sproto + function shi (nbits : integer; nbits_frac : integer) return integer; + function slo (nbits : integer; nbits_frac : integer) return integer; + + function to_unsigned (src : ufixed) return UNSIGNED; + function to_signed (src : sfixed) return SIGNED; + + type real_array_t is array (natural range <>) of real; + type ufixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC; + type sfixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC; + + function to_sfixed_array(x : real_array_t; proto : sfixed) return sfixed_array_t; + function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) return sfixed_array_t; + + -- Slicing functions for unconstrained array types + function to_ufixed(src : ufixed_array_t; index : integer) return ufixed; + function to_sfixed(src : sfixed_array_t; index : integer) return sfixed; + +------------------------------------------------------------------------------- +end; -- package fixed_util_pkg; + +package body fixed_util_pkg is + + ------------------------------------------------------------- + -- Constuctor helpers + function uproto (nbits : integer; nbits_frac : integer) return ufixed is + constant result : ufixed (uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac)) := (others => '0'); + begin + return result(uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac)); + end uproto; + + ------------------------------------------------------------- + function sproto (nbits : integer; nbits_frac : integer) return sfixed is + constant result : sfixed (shi(nbits,nbits_frac) downto slo(nbits,nbits_frac)) := (others => '0'); + begin + return result(shi(nbits,nbits_frac) downto slo(nbits,nbits_frac)); + end sproto; + + ------------------------------------------------------------- + function uhi (nbits : integer; nbits_frac : integer) return integer is + begin + return nbits-nbits_frac-1; + end uhi; + + ------------------------------------------------------------- + function ulo (nbits : integer; nbits_frac : integer) return integer is + begin + return -nbits_frac; + end ulo; + + ------------------------------------------------------------- + function shi (nbits : integer; nbits_frac : integer) return integer is + begin + return nbits-nbits_frac; + end shi; + + ------------------------------------------------------------- + function slo (nbits : integer; nbits_frac : integer) return integer is + begin + return -nbits_frac+1; + end slo; + + ------------------------------------------------------------- + function to_unsigned (src : ufixed) return UNSIGNED is + subtype t is UNSIGNED(src'high - src'low downto 0); + variable slv : t; + begin + slv := t(src); + return UNSIGNED(to_X01(std_logic_vector(slv))); + + end function to_unsigned; + + ------------------------------------------------------------- + function to_signed (src : sfixed) return SIGNED is + subtype t is SIGNED(src'high - src'low downto 0); + variable slv : t; + begin + slv := t(src); + return SIGNED(to_X01(std_logic_vector(slv))); + + end function to_signed; + + function to_sfixed_array(x : real_array_t; proto : sfixed) return sfixed_array_t is + variable res : sfixed_array_t(0 to x'length-1, proto'range); + variable tt : sfixed(proto'range); + begin + for i in x'range loop + tt := to_sfixed(x(i), proto); + for j in proto'range loop + res(i,j) := tt(j); + end loop; + end loop; + return res; + end to_sfixed_array; + + --------------------------------------------------------------------------- + function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) return sfixed_array_t is + variable p : sfixed(shi(nbits, nbits_int) downto slo(nbits, nbits_int)); + begin + return to_sfixed_array(x, p); + end to_sfixed_array; + + ------------------------------------------------------------------------------- + -- ufixed <= ufixed_array(i) + function to_ufixed(src : ufixed_array_t; index : integer) return ufixed is + variable dst : ufixed(src'range(2)); + begin + for j in src'range(2) loop + dst(j) := src(index, j); + end loop; + + return dst; + + end to_ufixed; + + ------------------------------------------------------------------------------- + -- sfixed <= sfixed_array(i) + function to_sfixed(src : sfixed_array_t; index : integer) return sfixed is + variable dst : sfixed(src'range(2)); + begin + for j in src'range(2) loop + dst(j) := src(index, j); + end loop; + + return dst; + + end to_sfixed; + +------------------------------------------------------------------------------- +end; -- package fixed_util_pkg;