git-svn-id: http://moon:8086/svn/vhdl/trunk@1047 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
2014-07-23 20:08:11 +00:00
parent 0c41791956
commit 87298253d2
+159 -159
View File
@@ -1,159 +1,159 @@
library IEEE; library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL; use IEEE.NUMERIC_STD.ALL;
use IEEE.MATH_REAL.ALL; use IEEE.MATH_REAL.ALL;
library ieee_proposed; library ieee_proposed;
use ieee_proposed.math_utility_pkg.all; use ieee_proposed.math_utility_pkg.all;
use ieee_proposed.fixed_pkg.all; use ieee_proposed.fixed_pkg.all;
package fixed_util_pkg is package fixed_util_pkg is
------------------------------------------------------------- -------------------------------------------------------------
-- Frequently used constants -- Frequently used constants
constant pi : real := 3.141592653589793e+000; constant pi : real := 3.141592653589793e+000;
constant sqrt2 : real := 1.414213562373095e+000; constant sqrt2 : real := 1.414213562373095e+000;
constant sqrt2_inv : real := 7.071067811865475e-001; constant sqrt2_inv : real := 7.071067811865475e-001;
-- Constructor helpers -- Constructor helpers
-- Use: variable v8u6 : ufixed_t(ufixed(8,6)'range); -- Use: variable v8u6 : ufixed_t(ufixed(8,6)'range);
function uproto (nbits : integer; nbits_frac : integer) return ufixed; function uproto (nbits : integer; nbits_frac : integer) return ufixed;
-- Use: variable v8s6 : sfixed_t(sfixed(8,6)'range); -- Use: variable v8s6 : sfixed_t(sfixed(8,6)'range);
function sproto (nbits : integer; nbits_frac : integer) return sfixed; function sproto (nbits : integer; nbits_frac : integer) return sfixed;
-- Safe variant of uproto -- Safe variant of uproto
function uhi (nbits : integer; nbits_frac : integer) return integer; function uhi (nbits : integer; nbits_frac : integer) return integer;
function ulo (nbits : integer; nbits_frac : integer) return integer; function ulo (nbits : integer; nbits_frac : integer) return integer;
-- Safe variant of sproto -- Safe variant of sproto
function shi (nbits : integer; nbits_frac : integer) return integer; function shi (nbits : integer; nbits_frac : integer) return integer;
function slo (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_unsigned (src : ufixed) return UNSIGNED;
function to_signed (src : sfixed) return SIGNED; function to_signed (src : sfixed) return SIGNED;
type real_array_t is array (natural range <>) of real; type real_array_t is array (natural range <>) of real;
type ufixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC; 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; 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; proto : sfixed) return sfixed_array_t;
function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) 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 -- Slicing functions for unconstrained array types
function to_ufixed(src : ufixed_array_t; index : integer) return ufixed; function to_ufixed(src : ufixed_array_t; index : integer) return ufixed;
function to_sfixed(src : sfixed_array_t; index : integer) return sfixed; function to_sfixed(src : sfixed_array_t; index : integer) return sfixed;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
end; -- package fixed_util_pkg; end; -- package fixed_util_pkg;
package body fixed_util_pkg is package body fixed_util_pkg is
------------------------------------------------------------- -------------------------------------------------------------
-- Constuctor helpers -- Constuctor helpers
function uproto (nbits : integer; nbits_frac : integer) return ufixed is function uproto (nbits : integer; nbits_frac : integer) return ufixed is
constant result : ufixed (uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac)) := (others => '0'); constant result : ufixed (uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac)) := (others => '0');
begin begin
return result(uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac)); return result(uhi(nbits,nbits_frac) downto ulo(nbits,nbits_frac));
end uproto; end uproto;
------------------------------------------------------------- -------------------------------------------------------------
function sproto (nbits : integer; nbits_frac : integer) return sfixed is function sproto (nbits : integer; nbits_frac : integer) return sfixed is
constant result : sfixed (shi(nbits,nbits_frac) downto slo(nbits,nbits_frac)) := (others => '0'); constant result : sfixed (shi(nbits,nbits_frac) downto slo(nbits,nbits_frac)) := (others => '0');
begin begin
return result(shi(nbits,nbits_frac) downto slo(nbits,nbits_frac)); return result(shi(nbits,nbits_frac) downto slo(nbits,nbits_frac));
end sproto; end sproto;
------------------------------------------------------------- -------------------------------------------------------------
function uhi (nbits : integer; nbits_frac : integer) return integer is function uhi (nbits : integer; nbits_frac : integer) return integer is
begin begin
return nbits-nbits_frac-1; return nbits-nbits_frac-1;
end uhi; end uhi;
------------------------------------------------------------- -------------------------------------------------------------
function ulo (nbits : integer; nbits_frac : integer) return integer is function ulo (nbits : integer; nbits_frac : integer) return integer is
begin begin
return -nbits_frac; return -nbits_frac;
end ulo; end ulo;
------------------------------------------------------------- -------------------------------------------------------------
function shi (nbits : integer; nbits_frac : integer) return integer is function shi (nbits : integer; nbits_frac : integer) return integer is
begin begin
return nbits-nbits_frac; return nbits-nbits_frac;
end shi; end shi;
------------------------------------------------------------- -------------------------------------------------------------
function slo (nbits : integer; nbits_frac : integer) return integer is function slo (nbits : integer; nbits_frac : integer) return integer is
begin begin
return -nbits_frac+1; return -nbits_frac+1;
end slo; end slo;
------------------------------------------------------------- -------------------------------------------------------------
function to_unsigned (src : ufixed) return UNSIGNED is function to_unsigned (src : ufixed) return UNSIGNED is
subtype t is UNSIGNED(src'high - src'low downto 0); subtype t is UNSIGNED(src'high - src'low downto 0);
variable slv : t; variable slv : t;
begin begin
slv := t(src); slv := t(src);
return UNSIGNED(to_X01(std_logic_vector(slv))); return UNSIGNED(to_X01(std_logic_vector(slv)));
end function to_unsigned; end function to_unsigned;
------------------------------------------------------------- -------------------------------------------------------------
function to_signed (src : sfixed) return SIGNED is function to_signed (src : sfixed) return SIGNED is
subtype t is SIGNED(src'high - src'low downto 0); subtype t is SIGNED(src'high - src'low downto 0);
variable slv : t; variable slv : t;
begin begin
slv := t(src); slv := t(src);
return SIGNED(to_X01(std_logic_vector(slv))); return SIGNED(to_X01(std_logic_vector(slv)));
end function to_signed; end function to_signed;
function to_sfixed_array(x : real_array_t; proto : sfixed) return sfixed_array_t is 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 res : sfixed_array_t(0 to x'length-1, proto'range);
variable tt : sfixed(proto'range); variable tt : sfixed(proto'range);
begin begin
for i in x'range loop for i in x'range loop
tt := to_sfixed(x(i), proto); tt := to_sfixed(x(i), proto);
for j in proto'range loop for j in proto'range loop
res(i,j) := tt(j); res(i,j) := tt(j);
end loop; end loop;
end loop; end loop;
return res; return res;
end to_sfixed_array; end to_sfixed_array;
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) return sfixed_array_t is 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)); variable p : sfixed(shi(nbits, nbits_int) downto slo(nbits, nbits_int));
begin begin
return to_sfixed_array(x, p); return to_sfixed_array(x, p);
end to_sfixed_array; end to_sfixed_array;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- ufixed <= ufixed_array(i) -- ufixed <= ufixed_array(i)
function to_ufixed(src : ufixed_array_t; index : integer) return ufixed is function to_ufixed(src : ufixed_array_t; index : integer) return ufixed is
variable dst : ufixed(src'range(2)); variable dst : ufixed(src'range(2));
begin begin
for j in src'range(2) loop for j in src'range(2) loop
dst(j) := src(index, j); dst(j) := src(index, j);
end loop; end loop;
return dst; return dst;
end to_ufixed; end to_ufixed;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- sfixed <= sfixed_array(i) -- sfixed <= sfixed_array(i)
function to_sfixed(src : sfixed_array_t; index : integer) return sfixed is function to_sfixed(src : sfixed_array_t; index : integer) return sfixed is
variable dst : sfixed(src'range(2)); variable dst : sfixed(src'range(2));
begin begin
for j in src'range(2) loop for j in src'range(2) loop
dst(j) := src(index, j); dst(j) := src(index, j);
end loop; end loop;
return dst; return dst;
end to_sfixed; end to_sfixed;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
end; -- package fixed_util_pkg; end; -- package fixed_util_pkg;