|
|
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.numeric_std.all;
-
-
-
- package UtilsP is
-
-
- function and_reduce (data : in std_logic_vector) return std_logic;
- function and_reduce (data : in boolean_vector) return boolean;
-
- function or_reduce (data : in std_logic_vector) return std_logic;
- function or_reduce (data : in boolean_vector) return boolean;
-
- function xor_reduce (data : in std_logic_vector) return std_logic;
-
- function even_parity (data : in std_logic_vector) return std_logic;
- function odd_parity (data : in std_logic_vector) return std_logic;
-
- function count_ones (data : in std_logic_vector) return natural;
-
- function one_hot (data : in std_logic_vector) return boolean;
-
- function is_unknown (data : in std_logic_vector) return boolean;
-
- function uint_to_slv (data: in natural; len : in positive) return std_logic_vector;
- function slv_to_uint (data: in std_logic_vector) return natural;
-
- function uint_bitsize(data : in natural) return natural;
-
-
- end package UtilsP;
-
-
-
- package body UtilsP is
-
-
- function and_reduce (data : in std_logic_vector) return std_logic is
- variable v_return : std_logic := '1';
- begin
- for i in data'range loop
- v_return := v_return and data(i);
- end loop;
- return v_return;
- end function and_reduce;
-
- function and_reduce (data : in boolean_vector) return boolean is
- begin
- for i in data'range loop
- if (not(data(i))) then
- return false;
- end if;
- end loop;
- return true;
- end function and_reduce;
-
-
- function or_reduce (data : in std_logic_vector) return std_logic is
- variable v_return : std_logic := '0';
- begin
- for i in data'range loop
- v_return := v_return or data(i);
- end loop;
- return v_return;
- end function or_reduce;
-
- function or_reduce (data : in boolean_vector) return boolean is
- begin
- for i in data'range loop
- if data(i) then
- return true;
- end if;
- end loop;
- return false;
- end function or_reduce;
-
-
- function xor_reduce (data : in std_logic_vector) return std_logic is
- variable v_return : std_logic := '0';
- begin
- for i in data'range loop
- v_return := v_return xor data(i);
- end loop;
- return v_return;
- end function xor_reduce;
-
-
- function even_parity (data : in std_logic_vector) return std_logic is
- begin
- return xor_reduce(data);
- end function even_parity;
-
- function odd_parity (data : in std_logic_vector) return std_logic is
- begin
- return not(xor_reduce(data));
- end function odd_parity;
-
-
- function count_ones (data : in std_logic_vector) return natural is
- variable v_return : natural := 0;
- begin
- for i in data'range loop
- if (to_ux01(data(i)) = '1') then
- v_return := v_return + 1;
- end if;
- end loop;
- return v_return;
- end function count_ones;
-
-
- function one_hot (data : in std_logic_vector) return boolean is
- begin
- return count_ones(data) = 1;
- end function one_hot;
-
-
- function is_unknown (data : in std_logic_vector) return boolean is
- begin
- for i in data'range loop
- if (to_ux01(data(i)) = 'U') then
- return true;
- end if;
- end loop;
- end function is_unknown;
-
-
- function uint_to_slv (data: in natural; len : in positive) return std_logic_vector is
- begin
- assert len >= uint_bitsize(data)
- report "Warning: std_logic_vector result truncated"
- severity warning;
- return std_logic_vector(to_unsigned(data, len));
- end function uint_to_slv;
-
- function slv_to_uint (data: in std_logic_vector) return natural is
- begin
- if data'ascending then
- assert data'length <= 31 or or_reduce(data(data'left to data'right-31)) = '0'
- report "WARNING: integer result overflow"
- severity warning;
- else
- assert data'length <= 31 or or_reduce(data(data'left downto data'right+31)) = '0'
- report "WARNING: integer result overflow"
- severity warning;
- end if;
- return to_integer(unsigned(data));
- end function slv_to_uint;
-
-
- function uint_bitsize(data : in natural) return natural is
- variable v_nlz : natural := 0;
- variable v_data : unsigned(30 downto 0) := to_unsigned(data, 31);
- begin
- if (data = 0) then
- return 1;
- end if;
- for i in 30 downto 0 loop
- if(v_data(i) /= '0') then
- exit;
- else
- v_nlz := v_nlz + 1;
- end if;
- end loop;
- return 31 - v_nlz;
- end function uint_bitsize;
-
-
- end package body UtilsP;
|