git-svn-id: http://moon:8086/svn/vhdl/trunk@1048 cc03376c-175c-47c8-b038-4cd826a8556b
323 lines
12 KiB
VHDL
323 lines
12 KiB
VHDL
|
|
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use ieee.numeric_std.all;
|
|
|
|
package fixed_ja is
|
|
|
|
|
|
type ufixed_t is array (integer range <>) of STD_LOGIC;
|
|
type sfixed_t is array (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 round_mode_t is (none, round_to_zero, round_pos_infinity, round_neg_infinity, round_half_up, round_half_down, round_nearest, round_convergent);
|
|
type saturate_mode_t is (none, saturate);
|
|
|
|
-- Declare functions and procedure
|
|
|
|
constant ASSERT_NO_WARN : boolean := false;
|
|
constant default_round_mode : round_mode_t := none;
|
|
constant default_saturate_mode : saturate_mode_t := none;
|
|
|
|
-- null array constants
|
|
constant NAUF : ufixed_t (0 downto 1) := (others => '0');
|
|
constant NASF : sfixed_t (0 downto 1) := (others => '0');
|
|
constant NSLV : STD_LOGIC_VECTOR (0 downto 1) := (others => '0');
|
|
|
|
-- Constructor helpers
|
|
-- Use: variable v8u2 : ufixed_t(ufixed(8,2)'range);
|
|
function uproto (nbits : integer; nbits_int : integer) return ufixed_t;
|
|
|
|
-- Use: variable v8s2 : sfixed_t(sfixed(8,2)'range);
|
|
function sproto (nbits : integer; nbits_int : integer) return sfixed_t;
|
|
|
|
function uproto (a : ufixed_t; op : character; b : ufixed_t) return ufixed_t;
|
|
function sproto (a : sfixed_t; op : character; b : sfixed_t) return sfixed_t;
|
|
|
|
-- Conversion Functions
|
|
function to_ufixed(src : ufixed_t) return ufixed_t;
|
|
function to_sfixed(src : sfixed_t) return sfixed_t;
|
|
function to_ufixed(src : sfixed_t) return ufixed_t;
|
|
function to_sfixed(src : ufixed_t) return sfixed_t;
|
|
|
|
function to_ufixed
|
|
(
|
|
src : ufixed_t;
|
|
nbits : integer;
|
|
nbits_int : integer;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return ufixed_t;
|
|
|
|
function to_ufixed
|
|
(
|
|
src : ufixed_t;
|
|
proto : ufixed_t;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return ufixed_t;
|
|
|
|
function to_sfixed
|
|
(
|
|
src : sfixed_t;
|
|
nbits : integer;
|
|
nbits_int : integer;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return sfixed_t;
|
|
|
|
function to_sfixed
|
|
(
|
|
src : sfixed_t;
|
|
proto : sfixed_t;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return sfixed_t;
|
|
|
|
-- fixed <= integer
|
|
function to_ufixed (src : integer; nbits : integer; nbits_int : integer) return ufixed_t;
|
|
function to_ufixed (src : integer; proto : ufixed_t) return ufixed_t;
|
|
|
|
-- fixed <= integer
|
|
function to_sfixed (src : integer; nbits : integer; nbits_int : integer) return sfixed_t;
|
|
function to_sfixed (src : integer; proto : sfixed_t) return sfixed_t;
|
|
|
|
-- ufixed <= unsigned
|
|
function to_ufixed (src : unsigned; nbits : integer; nbits_int : integer) return ufixed_t;
|
|
function to_ufixed (src : unsigned; proto : ufixed_t) return ufixed_t;
|
|
|
|
-- sfixed <= signed
|
|
function to_sfixed (src : signed; nbits : integer; nbits_int : integer) return sfixed_t;
|
|
function to_sfixed (src : signed; proto : sfixed_t) return sfixed_t;
|
|
|
|
-- fixed <= slv
|
|
function to_ufixed (src : STD_LOGIC_VECTOR; nbits : integer; nbits_int : integer) return ufixed_t;
|
|
function to_ufixed (src : STD_LOGIC_VECTOR; proto : ufixed_t) return ufixed_t;
|
|
function to_sfixed (src : STD_LOGIC_VECTOR; nbits : integer; nbits_int : integer) return sfixed_t;
|
|
function to_sfixed (src : STD_LOGIC_VECTOR; proto : sfixed_t) return sfixed_t;
|
|
|
|
-- ufixed <= real
|
|
function to_ufixed
|
|
(
|
|
src : real;
|
|
nbits : integer;
|
|
nbits_int : integer;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return ufixed_t;
|
|
|
|
function to_ufixed
|
|
(
|
|
src : real;
|
|
proto : ufixed_t;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return ufixed_t;
|
|
|
|
-- sfixed <= real
|
|
function to_sfixed
|
|
(
|
|
src : real;
|
|
nbits : integer;
|
|
nbits_int : integer;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return sfixed_t;
|
|
|
|
function to_sfixed
|
|
(
|
|
src : real;
|
|
proto : sfixed_t;
|
|
rnd_mode : round_mode_t := default_round_mode;
|
|
sat_mode : saturate_mode_t := default_saturate_mode
|
|
) return sfixed_t;
|
|
|
|
-- Slicing functions for unconstrained array types
|
|
function to_ufixed(src : ufixed_array_t; index : integer) return ufixed_t;
|
|
function to_sfixed(src : sfixed_array_t; index : integer) return sfixed_t;
|
|
|
|
-- ufixed <= string
|
|
function to_ufixed (src : string) return ufixed_t;
|
|
|
|
-- sfixed <= string
|
|
function to_sfixed (src : string) return sfixed_t;
|
|
|
|
-- real <= ufixed
|
|
function to_real(src : ufixed_t) return real;
|
|
|
|
-- real <= sfixed
|
|
function to_real(src : sfixed_t) return real;
|
|
|
|
-- slv <= ufixed
|
|
function to_slv(src : ufixed_t) return std_logic_vector;
|
|
|
|
-- slv <= sfixed
|
|
function to_slv(src : sfixed_t) return std_logic_vector;
|
|
|
|
-- UNSIGNED <= ufixed
|
|
function to_unsigned (src : ufixed_t) return UNSIGNED;
|
|
|
|
-- SIGNED <= sfixed
|
|
function to_signed (src : sfixed_t) return SIGNED;
|
|
|
|
-- integer <= ufixed
|
|
function to_integer (src : ufixed_t) return integer;
|
|
|
|
-- integer <= sfixed
|
|
function to_integer (src : sfixed_t) return integer;
|
|
|
|
function to_string(src : ufixed_t) return string;
|
|
function to_string(src : sfixed_t) return string;
|
|
function to_string(src : std_logic_vector) return string;
|
|
|
|
-------------------------------------------------------------
|
|
-- Arithmetic shift left
|
|
-------------------------------------------------------------
|
|
function "sla" (src : ufixed_t; count : integer) return ufixed_t;
|
|
function "sla" (src : sfixed_t; count : integer) return sfixed_t;
|
|
|
|
-------------------------------------------------------------
|
|
-- Arithmetic shift right
|
|
-------------------------------------------------------------
|
|
function "sra" (src : ufixed_t; count : integer) return ufixed_t;
|
|
function "sra" (src : sfixed_t; count : integer) return sfixed_t;
|
|
|
|
-------------------------------------------------------------
|
|
-- Multiplication
|
|
-------------------------------------------------------------
|
|
function "*" (a : ufixed_t; b : ufixed_t) return ufixed_t;
|
|
function "*" (a : sfixed_t; b : sfixed_t) return sfixed_t;
|
|
function "*" (a : ufixed_t; b : sfixed_t) return sfixed_t;
|
|
function "*" (a : sfixed_t; b : ufixed_t) return sfixed_t;
|
|
|
|
-------------------------------------------------------------
|
|
-- Sum
|
|
-------------------------------------------------------------
|
|
function "+" (a : ufixed_t; b : integer) return ufixed_t;
|
|
function "+" (a : sfixed_t; b : integer) return sfixed_t;
|
|
function "+" (a : ufixed_t; b : unsigned) return ufixed_t;
|
|
function "+" (a : sfixed_t; b : signed) return sfixed_t;
|
|
function "+" (a : ufixed_t; b : ufixed_t) return ufixed_t;
|
|
function "+" (a : sfixed_t; b : sfixed_t) return sfixed_t;
|
|
function "+" (a : ufixed_t; b : sfixed_t) return sfixed_t;
|
|
function "+" (a : sfixed_t; b : ufixed_t) return sfixed_t;
|
|
function "+" (a : ufixed_t; b : std_logic) return ufixed_t;
|
|
function "+" (a : sfixed_t; b : std_logic) return sfixed_t;
|
|
|
|
|
|
-------------------------------------------------------------
|
|
-- Difference
|
|
-------------------------------------------------------------
|
|
function "-" (a : ufixed_t; b : integer) return ufixed_t;
|
|
function "-" (a : sfixed_t; b : integer) return sfixed_t;
|
|
function "-" (a : ufixed_t; b : unsigned) return ufixed_t;
|
|
function "-" (a : sfixed_t; b : signed) return sfixed_t;
|
|
function "-" (a : ufixed_t; b : ufixed_t) return ufixed_t;
|
|
function "-" (a : sfixed_t; b : sfixed_t) return sfixed_t;
|
|
function "-" (a : ufixed_t; b : sfixed_t) return sfixed_t;
|
|
function "-" (a : sfixed_t; b : ufixed_t) return sfixed_t;
|
|
function "-" (a : ufixed_t; b : std_logic) return ufixed_t;
|
|
function "-" (a : sfixed_t; b : std_logic) return sfixed_t;
|
|
|
|
-------------------------------------------------------------
|
|
-- Equality
|
|
-------------------------------------------------------------
|
|
function "=" (a : ufixed_t; b : ufixed_t) return boolean;
|
|
function "=" (a : sfixed_t; b : sfixed_t) return boolean;
|
|
function "=" (a : ufixed_t; b : sfixed_t) return boolean;
|
|
function "=" (a : sfixed_t; b : ufixed_t) return boolean;
|
|
|
|
-------------------------------------------------------------
|
|
-- Inequality
|
|
-------------------------------------------------------------
|
|
function "/=" (a : ufixed_t; b : ufixed_t) return boolean;
|
|
function "/=" (a : sfixed_t; b : sfixed_t) return boolean;
|
|
function "/=" (a : ufixed_t; b : sfixed_t) return boolean;
|
|
function "/=" (a : sfixed_t; b : ufixed_t) return boolean;
|
|
|
|
-------------------------------------------------------------
|
|
-- Less than
|
|
-------------------------------------------------------------
|
|
function "<" (a : ufixed_t; b : ufixed_t) return boolean;
|
|
function "<" (a : sfixed_t; b : sfixed_t) return boolean;
|
|
function "<" (a : ufixed_t; b : sfixed_t) return boolean;
|
|
function "<" (a : sfixed_t; b : ufixed_t) return boolean;
|
|
|
|
-------------------------------------------------------------
|
|
-- Greater than
|
|
-------------------------------------------------------------
|
|
function ">" (a : ufixed_t; b : ufixed_t) return boolean;
|
|
function ">" (a : sfixed_t; b : sfixed_t) return boolean;
|
|
function ">" (a : ufixed_t; b : sfixed_t) return boolean;
|
|
function ">" (a : sfixed_t; b : ufixed_t) return boolean;
|
|
|
|
-------------------------------------------------------------
|
|
-- Less or equal than
|
|
-------------------------------------------------------------
|
|
function "<=" (a : ufixed_t; b : ufixed_t) return boolean;
|
|
function "<=" (a : sfixed_t; b : sfixed_t) return boolean;
|
|
function "<=" (a : ufixed_t; b : sfixed_t) return boolean;
|
|
function "<=" (a : sfixed_t; b : ufixed_t) return boolean;
|
|
|
|
-------------------------------------------------------------
|
|
-- Greater or equal than
|
|
-------------------------------------------------------------
|
|
function ">=" (a : ufixed_t; b : ufixed_t) return boolean;
|
|
function ">=" (a : sfixed_t; b : sfixed_t) return boolean;
|
|
function ">=" (a : ufixed_t; b : sfixed_t) return boolean;
|
|
function ">=" (a : sfixed_t; b : ufixed_t) return boolean;
|
|
|
|
-------------------------------------------------------------
|
|
-- Unary Arithmetic Operators
|
|
-------------------------------------------------------------
|
|
function "abs" (src : sfixed_t) return sfixed_t;
|
|
function "-" (src : ufixed_t) return sfixed_t;
|
|
function "-" (src : sfixed_t) return sfixed_t;
|
|
|
|
-------------------------------------------------------------
|
|
-- Misc. Operators
|
|
-------------------------------------------------------------
|
|
function ipart (src : ufixed_t) return ufixed_t;
|
|
function fpart (src : ufixed_t) return ufixed_t;
|
|
function ipart (src : sfixed_t) return sfixed_t;
|
|
function fpart (src : sfixed_t) return sfixed_t;
|
|
|
|
-------------------------------------------------------------
|
|
-- Print function
|
|
-------------------------------------------------------------
|
|
procedure print_info(src : in ufixed_t; prefix : in string);
|
|
procedure print_info(src : in sfixed_t; prefix : in string);
|
|
procedure print_info(src : in string; prefix : in string);
|
|
|
|
-------------------------------------------------------------
|
|
-- Helpers
|
|
-------------------------------------------------------------
|
|
function cmsb(src : ufixed_t) return integer;
|
|
function clsb(src : ufixed_t) return integer;
|
|
|
|
function MIN (X, Y: INTEGER) return INTEGER;
|
|
function MAX (X, Y: INTEGER) return INTEGER;
|
|
|
|
function "MOD" (X, Y: in REAL ) return REAL;
|
|
function ipart(src : real) return real;
|
|
function fpart(src : real) return real;
|
|
|
|
function and_red(arg : ufixed_t) return STD_ULOGIC;
|
|
function nand_red(arg : ufixed_t) return STD_ULOGIC;
|
|
function or_red(arg : ufixed_t) return STD_ULOGIC;
|
|
function nor_red(arg : ufixed_t) return STD_ULOGIC;
|
|
function xor_red(arg : ufixed_t) return STD_ULOGIC;
|
|
function xnor_red(arg : ufixed_t) return STD_ULOGIC;
|
|
function and_red(arg : sfixed_t) return STD_ULOGIC;
|
|
function nand_red(arg : sfixed_t) return STD_ULOGIC;
|
|
function or_red(arg : sfixed_t) return STD_ULOGIC;
|
|
function nor_red(arg : sfixed_t) return STD_ULOGIC;
|
|
function xor_red(arg : sfixed_t) return STD_ULOGIC;
|
|
function xnor_red(arg : sfixed_t) return STD_ULOGIC;
|
|
|
|
--------------------------------------------------------------
|
|
|
|
end; -- package fixed_ja;
|
|
|