git-svn-id: http://moon:8086/svn/vhdl/trunk@1073 cc03376c-175c-47c8-b038-4cd826a8556b
1892 lines
67 KiB
VHDL
1892 lines
67 KiB
VHDL
------------------------------------------------------------------------------
|
|
-- "numeric_std_unsigned" package contains functions that treat
|
|
-- "std_logic_vector" like an "unsigned" from "numeric_std".
|
|
-- There is a dependancey on this package with "numeric_std_additions.vhd".
|
|
-- This package should be compiled into "ieee_proposed" and used as follows:
|
|
-- use ieee.std_logic_1164.all;
|
|
-- use ieee.numeric_std.all;
|
|
-- use ieee_proposed.numeric_std_unsigned.all;
|
|
-- Last Modified: $Date: 2006-03-14 12:34:06-05 $
|
|
-- RCS ID: $Id: numeric_std_unsigned_c.vhd,v 1.2 2006-03-14 12:34:06-05 l435385 Exp l435385 $
|
|
--
|
|
-- Created for VHDL-200X par, David Bishop (dbishop@vhdl.org)
|
|
------------------------------------------------------------------------------
|
|
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.all;
|
|
package NUMERIC_STD_UNSIGNED is
|
|
-- Id: A.3
|
|
function "+" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Result: Adds two UNSIGNED vectors that may be of different lengths.
|
|
|
|
-- Id: A.3R
|
|
function "+"(L : STD_LOGIC_VECTOR; R : STD_ULOGIC) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'RANGE)
|
|
-- Result: Similar to A.3 where R is a one bit std_logic_vector
|
|
|
|
-- Id: A.3L
|
|
function "+"(L : STD_ULOGIC; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'RANGE)
|
|
-- Result: Similar to A.3 where L is a one bit UNSIGNED
|
|
|
|
-- Id: A.5
|
|
function "+" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0).
|
|
-- Result: Adds an UNSIGNED vector, L, with a non-negative INTEGER, R.
|
|
|
|
-- Id: A.6
|
|
function "+" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0).
|
|
-- Result: Adds a non-negative INTEGER, L, with an UNSIGNED vector, R.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.9
|
|
function "-" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: UNSIGNED(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Result: Subtracts two UNSIGNED vectors that may be of different lengths.
|
|
|
|
-- Id: A.9R
|
|
function "-"(L : STD_LOGIC_VECTOR; R : STD_ULOGIC) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'RANGE)
|
|
-- Result: Similar to A.9 where R is a one bit UNSIGNED
|
|
|
|
-- Id: A.9L
|
|
function "-"(L : STD_ULOGIC; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'RANGE)
|
|
-- Result: Similar to A.9 where L is a one bit UNSIGNED
|
|
|
|
-- Id: A.11
|
|
function "-" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0).
|
|
-- Result: Subtracts a non-negative INTEGER, R, from an UNSIGNED vector, L.
|
|
|
|
-- Id: A.12
|
|
function "-" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0).
|
|
-- Result: Subtracts an UNSIGNED vector, R, from a non-negative INTEGER, L.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.15
|
|
function "*" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector((L'LENGTH+R'LENGTH-1) downto 0).
|
|
-- Result: Performs the multiplication operation on two UNSIGNED vectors
|
|
-- that may possibly be of different lengths.
|
|
|
|
-- Id: A.17
|
|
function "*" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector((L'LENGTH+L'LENGTH-1) downto 0).
|
|
-- Result: Multiplies an UNSIGNED vector, L, with a non-negative
|
|
-- INTEGER, R. R is converted to an UNSIGNED vector of
|
|
-- SIZE L'LENGTH before multiplication.
|
|
|
|
-- Id: A.18
|
|
function "*" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector((R'LENGTH+R'LENGTH-1) downto 0).
|
|
-- Result: Multiplies an UNSIGNED vector, R, with a non-negative
|
|
-- INTEGER, L. L is converted to an UNSIGNED vector of
|
|
-- SIZE R'LENGTH before multiplication.
|
|
|
|
--============================================================================
|
|
--
|
|
-- NOTE: If second argument is zero for "/" operator, a severity level
|
|
-- of ERROR is issued.
|
|
|
|
-- Id: A.21
|
|
function "/" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Divides an UNSIGNED vector, L, by another UNSIGNED vector, R.
|
|
|
|
-- Id: A.23
|
|
function "/" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Divides an UNSIGNED vector, L, by a non-negative INTEGER, R.
|
|
-- If NO_OF_BITS(R) > L'LENGTH, result is truncated to L'LENGTH.
|
|
|
|
-- Id: A.24
|
|
function "/" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Divides a non-negative INTEGER, L, by an UNSIGNED vector, R.
|
|
-- If NO_OF_BITS(L) > R'LENGTH, result is truncated to R'LENGTH.
|
|
|
|
--============================================================================
|
|
--
|
|
-- NOTE: If second argument is zero for "rem" operator, a severity level
|
|
-- of ERROR is issued.
|
|
|
|
-- Id: A.27
|
|
function "rem" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L rem R" where L and R are UNSIGNED vectors.
|
|
|
|
-- Id: A.29
|
|
function "rem" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Computes "L rem R" where L is an UNSIGNED vector and R is a
|
|
-- non-negative INTEGER.
|
|
-- If NO_OF_BITS(R) > L'LENGTH, result is truncated to L'LENGTH.
|
|
|
|
-- Id: A.30
|
|
function "rem" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L rem R" where R is an UNSIGNED vector and L is a
|
|
-- non-negative INTEGER.
|
|
-- If NO_OF_BITS(L) > R'LENGTH, result is truncated to R'LENGTH.
|
|
|
|
--============================================================================
|
|
--
|
|
-- NOTE: If second argument is zero for "mod" operator, a severity level
|
|
-- of ERROR is issued.
|
|
|
|
-- Id: A.33
|
|
function "mod" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L mod R" where L and R are UNSIGNED vectors.
|
|
|
|
-- Id: A.35
|
|
function "mod" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Computes "L mod R" where L is an UNSIGNED vector and R
|
|
-- is a non-negative INTEGER.
|
|
-- If NO_OF_BITS(R) > L'LENGTH, result is truncated to L'LENGTH.
|
|
|
|
-- Id: A.36
|
|
function "mod" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L mod R" where R is an UNSIGNED vector and L
|
|
-- is a non-negative INTEGER.
|
|
-- If NO_OF_BITS(L) > R'LENGTH, result is truncated to R'LENGTH.
|
|
|
|
--============================================================================
|
|
-- Comparison Operators
|
|
--============================================================================
|
|
|
|
-- Id: C.1
|
|
function ">" (L, R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L > R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.3
|
|
function ">" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L > R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.5
|
|
function ">" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L > R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.7
|
|
function "<" (L, R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L < R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.9
|
|
function "<" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L < R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.11
|
|
function "<" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L < R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.13
|
|
function "<=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L <= R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.15
|
|
function "<=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L <= R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.17
|
|
function "<=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L <= R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.19
|
|
function ">=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L >= R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.21
|
|
function ">=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L >= R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.23
|
|
function ">=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L >= R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.25
|
|
function "=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L = R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.27
|
|
function "=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L = R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.29
|
|
function "=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L = R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.31
|
|
function "/=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L /= R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.33
|
|
function "/=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L /= R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.35
|
|
function "/=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L /= R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
-- Id: M.2B
|
|
-- %%% function "?=" (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?/=" (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?>" (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?>=" (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?<" (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?<=" (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
function \?=\ (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
function \?/=\ (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
function \?>\ (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
function \?>=\ (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
function \?<\ (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
function \?<=\ (L, R : STD_LOGIC_VECTOR) return std_ulogic;
|
|
--============================================================================
|
|
-- Shift and Rotate Functions
|
|
--============================================================================
|
|
|
|
-- Id: S.1
|
|
function SHIFT_LEFT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a shift-left on an UNSIGNED vector COUNT times.
|
|
-- The vacated positions are filled with '0'.
|
|
-- The COUNT leftmost elements are lost.
|
|
|
|
-- Id: S.2
|
|
function SHIFT_RIGHT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_LOGIC_VECTOR;
|
|
-- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a shift-right on an UNSIGNED vector COUNT times.
|
|
-- The vacated positions are filled with '0'.
|
|
-- The COUNT rightmost elements are lost.
|
|
--============================================================================
|
|
|
|
-- Id: S.5
|
|
function ROTATE_LEFT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a rotate-left of an UNSIGNED vector COUNT times.
|
|
|
|
-- Id: S.6
|
|
function ROTATE_RIGHT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a rotate-right of an UNSIGNED vector COUNT times.
|
|
|
|
|
|
--============================================================================
|
|
-- RESIZE Functions
|
|
--============================================================================
|
|
|
|
-- Id: R.2
|
|
function RESIZE (ARG : STD_LOGIC_VECTOR; NEW_SIZE : NATURAL)
|
|
return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(NEW_SIZE-1 downto 0)
|
|
|
|
-- size_res version, uses the size of the "size_res" input
|
|
-- to resize the output
|
|
function RESIZE (ARG, SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR;
|
|
|
|
--============================================================================
|
|
-- Conversion Functions
|
|
--============================================================================
|
|
|
|
-- Id: D.1
|
|
function TO_INTEGER (ARG : STD_LOGIC_VECTOR) return NATURAL;
|
|
-- Result subtype: NATURAL. Value cannot be negative since parameter is an
|
|
-- UNSIGNED vector.
|
|
-- Result: Converts the UNSIGNED vector to an INTEGER.
|
|
|
|
-- Id: D.3
|
|
function To_StdLogicVector (ARG, SIZE : NATURAL) return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(SIZE-1 downto 0)
|
|
-- Result: Converts a non-negative INTEGER to an UNSIGNED vector with
|
|
-- the specified SIZE.
|
|
-- alias to_slv is
|
|
-- To_StdLogicVector [NATURAL, NATURAL return STD_LOGIC_VECTOR];
|
|
-- alias to_std_logic_vector is
|
|
-- To_StdLogicVector [NATURAL, NATURAL return STD_LOGIC_VECTOR];
|
|
function to_slv (ARG, SIZE : NATURAL) return STD_LOGIC_VECTOR;
|
|
function to_std_logic_vector (ARG, SIZE : NATURAL) return STD_LOGIC_VECTOR;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_StdLogicVector (ARG : NATURAL; SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(SIZE-1 downto 0)
|
|
-- Result: Converts a non-negative INTEGER to an UNSIGNED vector with
|
|
-- the specified SIZE.
|
|
-- alias to_slv is
|
|
-- To_StdLogicVector [NATURAL, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR];
|
|
-- alias to_std_logic_vector is
|
|
-- To_StdLogicVector [NATURAL, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR];
|
|
function to_slv (ARG : NATURAL; SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR;
|
|
function to_std_logic_vector (ARG : NATURAL; SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR;
|
|
|
|
--============================================================================
|
|
-- Translation Functions
|
|
--============================================================================
|
|
|
|
-- Id: T.1
|
|
function TO_01 (S : STD_LOGIC_VECTOR; XMAP : STD_LOGIC := '0')
|
|
return STD_LOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(S'RANGE)
|
|
-- Result: Termwise, 'H' is translated to '1', and 'L' is translated
|
|
-- to '0'. If a value other than '0'|'1'|'H'|'L' is found,
|
|
-- the array is set to (others => XMAP), and a warning is
|
|
-- issued.
|
|
|
|
-- add_carry procedures, to provide a carry in and a carry out
|
|
procedure add_carry (
|
|
L, R : in STD_LOGIC_VECTOR;
|
|
c_in : in STD_ULOGIC;
|
|
result : out STD_LOGIC_VECTOR;
|
|
c_out : out STD_ULOGIC);
|
|
-- Result subtype: STD_LOGIC_VECTOR(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Procedure takes a carry in into the adder, and provides a carry out.
|
|
|
|
-- These are here to override the defaults for these functions
|
|
function "sra" (ARG : STD_LOGIC_VECTOR; COUNT : INTEGER)
|
|
return STD_LOGIC_VECTOR;
|
|
function "sla" (ARG : STD_LOGIC_VECTOR; COUNT : INTEGER)
|
|
return STD_LOGIC_VECTOR;
|
|
|
|
-- Returns the maximum (or minimum) of the two numbers provided.
|
|
-- All types (both inputs and the output) must be the same.
|
|
function maximum (
|
|
L, R : STD_LOGIC_VECTOR) -- inputs
|
|
return STD_LOGIC_VECTOR;
|
|
|
|
function minimum (
|
|
L, R : STD_LOGIC_VECTOR) -- inputs
|
|
return STD_LOGIC_VECTOR;
|
|
|
|
-- Finds the first "Y" in the input string. Returns an integer index
|
|
-- into that string. If "Y" does not exist in the string, then the
|
|
-- "find_lsb" returns arg'low -1, and "find_msb" returns -1
|
|
function find_lsb (
|
|
arg : STD_LOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER;
|
|
|
|
function find_msb (
|
|
arg : STD_LOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER;
|
|
|
|
-- Repeat the same functions for STD_ULOGIC_VECTOR
|
|
-- Id: A.3
|
|
function "+" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Result: Adds two UNSIGNED vectors that may be of different lengths.
|
|
|
|
-- Id: A.3R
|
|
function "+"(L : STD_ULOGIC_VECTOR; R : STD_ULOGIC) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Similar to A.3 where R is a one bit std_logic_vector
|
|
|
|
-- Id: A.3L
|
|
function "+"(L : STD_ULOGIC; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Similar to A.3 where L is a one bit UNSIGNED
|
|
|
|
-- Id: A.5
|
|
function "+" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0).
|
|
-- Result: Adds an UNSIGNED vector, L, with a non-negative INTEGER, R.
|
|
|
|
-- Id: A.6
|
|
function "+" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0).
|
|
-- Result: Adds a non-negative INTEGER, L, with an UNSIGNED vector, R.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.9
|
|
function "-" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: UNSIGNED(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Result: Subtracts two UNSIGNED vectors that may be of different lengths.
|
|
|
|
-- Id: A.9R
|
|
function "-"(L : STD_ULOGIC_VECTOR; R : STD_ULOGIC) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Similar to A.9 where R is a one bit UNSIGNED
|
|
|
|
-- Id: A.9L
|
|
function "-"(L : STD_ULOGIC; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Similar to A.9 where L is a one bit UNSIGNED
|
|
|
|
-- Id: A.11
|
|
function "-" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0).
|
|
-- Result: Subtracts a non-negative INTEGER, R, from an UNSIGNED vector, L.
|
|
|
|
-- Id: A.12
|
|
function "-" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0).
|
|
-- Result: Subtracts an UNSIGNED vector, R, from a non-negative INTEGER, L.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.15
|
|
function "*" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector((L'LENGTH+R'LENGTH-1) downto 0).
|
|
-- Result: Performs the multiplication operation on two UNSIGNED vectors
|
|
-- that may possibly be of different lengths.
|
|
|
|
-- Id: A.17
|
|
function "*" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector((L'LENGTH+L'LENGTH-1) downto 0).
|
|
-- Result: Multiplies an UNSIGNED vector, L, with a non-negative
|
|
-- INTEGER, R. R is converted to an UNSIGNED vector of
|
|
-- SIZE L'LENGTH before multiplication.
|
|
|
|
-- Id: A.18
|
|
function "*" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector((R'LENGTH+R'LENGTH-1) downto 0).
|
|
-- Result: Multiplies an UNSIGNED vector, R, with a non-negative
|
|
-- INTEGER, L. L is converted to an UNSIGNED vector of
|
|
-- SIZE R'LENGTH before multiplication.
|
|
|
|
--============================================================================
|
|
--
|
|
-- NOTE: If second argument is zero for "/" operator, a severity level
|
|
-- of ERROR is issued.
|
|
|
|
-- Id: A.21
|
|
function "/" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Divides an UNSIGNED vector, L, by another UNSIGNED vector, R.
|
|
|
|
-- Id: A.23
|
|
function "/" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Divides an UNSIGNED vector, L, by a non-negative INTEGER, R.
|
|
-- If NO_OF_BITS(R) > L'LENGTH, result is truncated to L'LENGTH.
|
|
|
|
-- Id: A.24
|
|
function "/" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Divides a non-negative INTEGER, L, by an UNSIGNED vector, R.
|
|
-- If NO_OF_BITS(L) > R'LENGTH, result is truncated to R'LENGTH.
|
|
|
|
--============================================================================
|
|
--
|
|
-- NOTE: If second argument is zero for "rem" operator, a severity level
|
|
-- of ERROR is issued.
|
|
|
|
-- Id: A.27
|
|
function "rem" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L rem R" where L and R are UNSIGNED vectors.
|
|
|
|
-- Id: A.29
|
|
function "rem" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Computes "L rem R" where L is an UNSIGNED vector and R is a
|
|
-- non-negative INTEGER.
|
|
-- If NO_OF_BITS(R) > L'LENGTH, result is truncated to L'LENGTH.
|
|
|
|
-- Id: A.30
|
|
function "rem" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L rem R" where R is an UNSIGNED vector and L is a
|
|
-- non-negative INTEGER.
|
|
-- If NO_OF_BITS(L) > R'LENGTH, result is truncated to R'LENGTH.
|
|
|
|
--============================================================================
|
|
--
|
|
-- NOTE: If second argument is zero for "mod" operator, a severity level
|
|
-- of ERROR is issued.
|
|
|
|
-- Id: A.33
|
|
function "mod" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L mod R" where L and R are UNSIGNED vectors.
|
|
|
|
-- Id: A.35
|
|
function "mod" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(L'LENGTH-1 downto 0)
|
|
-- Result: Computes "L mod R" where L is an UNSIGNED vector and R
|
|
-- is a non-negative INTEGER.
|
|
-- If NO_OF_BITS(R) > L'LENGTH, result is truncated to L'LENGTH.
|
|
|
|
-- Id: A.36
|
|
function "mod" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(R'LENGTH-1 downto 0)
|
|
-- Result: Computes "L mod R" where R is an UNSIGNED vector and L
|
|
-- is a non-negative INTEGER.
|
|
-- If NO_OF_BITS(L) > R'LENGTH, result is truncated to R'LENGTH.
|
|
|
|
--============================================================================
|
|
-- Comparison Operators
|
|
--============================================================================
|
|
|
|
-- Id: C.1
|
|
function ">" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L > R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.3
|
|
function ">" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L > R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.5
|
|
function ">" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L > R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.7
|
|
function "<" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L < R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.9
|
|
function "<" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L < R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.11
|
|
function "<" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L < R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.13
|
|
function "<=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L <= R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.15
|
|
function "<=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L <= R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.17
|
|
function "<=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L <= R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.19
|
|
function ">=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L >= R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.21
|
|
function ">=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L >= R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.23
|
|
function ">=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L >= R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.25
|
|
function "=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L = R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.27
|
|
function "=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L = R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.29
|
|
function "=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L = R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.31
|
|
function "/=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L /= R" where L and R are UNSIGNED vectors possibly
|
|
-- of different lengths.
|
|
|
|
-- Id: C.33
|
|
function "/=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L /= R" where L is a non-negative INTEGER and
|
|
-- R is an UNSIGNED vector.
|
|
|
|
-- Id: C.35
|
|
function "/=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN;
|
|
-- Result subtype: BOOLEAN
|
|
-- Result: Computes "L /= R" where L is an UNSIGNED vector and
|
|
-- R is a non-negative INTEGER.
|
|
|
|
-- Id: M.2B
|
|
-- %%% function "?=" (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?/=" (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?>" (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?>=" (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?<" (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
-- %%% function "?<=" (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
function \?=\ (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
function \?/=\ (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
function \?>\ (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
function \?>=\ (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
function \?<\ (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
function \?<=\ (L, R : STD_ULOGIC_VECTOR) return std_ulogic;
|
|
--============================================================================
|
|
-- Shift and Rotate Functions
|
|
--============================================================================
|
|
|
|
-- Id: S.1
|
|
function SHIFT_LEFT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a shift-left on an UNSIGNED vector COUNT times.
|
|
-- The vacated positions are filled with '0'.
|
|
-- The COUNT leftmost elements are lost.
|
|
|
|
-- Id: S.2
|
|
function SHIFT_RIGHT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a shift-right on an UNSIGNED vector COUNT times.
|
|
-- The vacated positions are filled with '0'.
|
|
-- The COUNT rightmost elements are lost.
|
|
--============================================================================
|
|
|
|
-- Id: S.5
|
|
function ROTATE_LEFT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a rotate-left of an UNSIGNED vector COUNT times.
|
|
|
|
-- Id: S.6
|
|
function ROTATE_RIGHT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL)
|
|
return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(ARG'LENGTH-1 downto 0)
|
|
-- Result: Performs a rotate-right of an UNSIGNED vector COUNT times.
|
|
|
|
|
|
--============================================================================
|
|
-- RESIZE Functions
|
|
--============================================================================
|
|
|
|
-- Id: R.2
|
|
function RESIZE (ARG : STD_ULOGIC_VECTOR; NEW_SIZE : NATURAL)
|
|
return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(NEW_SIZE-1 downto 0)
|
|
|
|
-- size_res version, uses the size of the "size_res" input
|
|
-- to resize the output
|
|
function RESIZE (ARG, SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR;
|
|
|
|
--============================================================================
|
|
-- Conversion Functions
|
|
--============================================================================
|
|
|
|
-- Id: D.1
|
|
function TO_INTEGER (ARG : STD_ULOGIC_VECTOR) return NATURAL;
|
|
-- Result subtype: NATURAL. Value cannot be negative since parameter is an
|
|
-- UNSIGNED vector.
|
|
-- Result: Converts the UNSIGNED vector to an INTEGER.
|
|
|
|
-- Id: D.3
|
|
function To_StdULogicVector (ARG, SIZE : NATURAL) return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(SIZE-1 downto 0)
|
|
-- Result: Converts a non-negative INTEGER to an UNSIGNED vector with
|
|
-- the specified SIZE.
|
|
-- alias to_sulv is
|
|
-- To_StdULogicVector [NATURAL, NATURAL return STD_ULOGIC_VECTOR];
|
|
-- alias to_std_ulogic_vector is
|
|
-- To_StdULogicVector [NATURAL, NATURAL return STD_ULOGIC_VECTOR];
|
|
function to_sulv (ARG, SIZE : NATURAL) return STD_ULOGIC_VECTOR;
|
|
function to_std_ulogic_vector (ARG, SIZE : NATURAL) return STD_ULOGIC_VECTOR;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_StdULogicVector (ARG : NATURAL; SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: STD_ULOGIC_VECTOR(SIZE_RES'length-1 downto 0)
|
|
-- Result: Converts a non-negative INTEGER to an STD_ULOGIC_VECTOR with
|
|
-- the same size as SIZE_RES.
|
|
-- alias to_sulv is
|
|
-- To_StdULogicVector [NATURAL, STD_ULOGIC_VECTOR return STD_ULOGIC_VECTOR];
|
|
-- alias to_std_ulogic_vector is
|
|
-- To_StdULogicVector [NATURAL, STD_ULOGIC_VECTOR return STD_ULOGIC_VECTOR];
|
|
function to_sulv (ARG : NATURAL; SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR;
|
|
function to_std_ulogic_vector (ARG : NATURAL; SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR;
|
|
|
|
--============================================================================
|
|
-- Translation Functions
|
|
--============================================================================
|
|
|
|
-- Id: T.1
|
|
function TO_01 (S : STD_ULOGIC_VECTOR; XMAP : STD_LOGIC := '0')
|
|
return STD_ULOGIC_VECTOR;
|
|
-- Result subtype: std_logic_vector(S'RANGE)
|
|
-- Result: Termwise, 'H' is translated to '1', and 'L' is translated
|
|
-- to '0'. If a value other than '0'|'1'|'H'|'L' is found,
|
|
-- the array is set to (others => XMAP), and a warning is
|
|
-- issued.
|
|
|
|
-- add_carry procedures, to provide a carry in and a carry out
|
|
procedure add_carry (
|
|
L, R : in STD_ULOGIC_VECTOR;
|
|
c_in : in STD_ULOGIC;
|
|
result : out STD_ULOGIC_VECTOR;
|
|
c_out : out STD_ULOGIC);
|
|
-- Result subtype: STD_ULOGIC_VECTOR(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Procedure takes a carry in into the adder, and provides a carry out.
|
|
|
|
-- These are here to override the defaults for these functions
|
|
function "sra" (ARG : STD_ULOGIC_VECTOR; COUNT : INTEGER)
|
|
return STD_ULOGIC_VECTOR;
|
|
function "sla" (ARG : STD_ULOGIC_VECTOR; COUNT : INTEGER)
|
|
return STD_ULOGIC_VECTOR;
|
|
|
|
-- Returns the maximum (or minimum) of the two numbers provided.
|
|
-- All types (both inputs and the output) must be the same.
|
|
function maximum (
|
|
L, R : STD_ULOGIC_VECTOR) -- inputs
|
|
return STD_ULOGIC_VECTOR;
|
|
|
|
function minimum (
|
|
L, R : STD_ULOGIC_VECTOR) -- inputs
|
|
return STD_ULOGIC_VECTOR;
|
|
|
|
-- Finds the first "Y" in the input string. Returns an integer index
|
|
-- into that string. If "Y" does not exist in the string, then a
|
|
-- -1 is returned.
|
|
function find_lsb (
|
|
arg : STD_ULOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER;
|
|
|
|
function find_msb (
|
|
arg : STD_ULOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER;
|
|
end package NUMERIC_STD_UNSIGNED;
|
|
|
|
library ieee;
|
|
use ieee.numeric_std.all;
|
|
use work.numeric_std_additions.all;
|
|
package body NUMERIC_STD_UNSIGNED is
|
|
|
|
-- Id: A.3
|
|
function "+" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) + UNSIGNED(R));
|
|
end function "+";
|
|
|
|
-- Id: A.5
|
|
function "+" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) + R);
|
|
end function "+";
|
|
|
|
-- Id: A.6
|
|
function "+" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (L + UNSIGNED(R));
|
|
end function "+";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.9
|
|
function "-" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) - UNSIGNED(R));
|
|
end function "-";
|
|
|
|
-- Id: A.11
|
|
function "-" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) - R);
|
|
end function "-";
|
|
|
|
-- Id: A.12
|
|
function "-" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (L - UNSIGNED(R));
|
|
end function "-";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.15
|
|
function "*" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) * UNSIGNED(R));
|
|
end function "*";
|
|
|
|
-- Id: A.17
|
|
function "*" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) * R);
|
|
end function "*";
|
|
|
|
-- Id: A.18
|
|
function "*" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (L * UNSIGNED(R));
|
|
end function "*";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.21
|
|
function "/" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) / UNSIGNED(R));
|
|
end function "/";
|
|
|
|
-- Id: A.23
|
|
function "/" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) / R);
|
|
end function "/";
|
|
|
|
-- Id: A.24
|
|
function "/" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (L / UNSIGNED(R));
|
|
end function "/";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.27
|
|
function "rem" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) rem UNSIGNED(R));
|
|
end function "rem";
|
|
|
|
-- Id: A.29
|
|
function "rem" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) rem R);
|
|
end function "rem";
|
|
|
|
-- Id: A.30
|
|
function "rem" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (L rem UNSIGNED(R));
|
|
end function "rem";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.33
|
|
function "mod" (L, R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) mod UNSIGNED(R));
|
|
end function "mod";
|
|
|
|
-- Id: A.35
|
|
function "mod" (L : STD_LOGIC_VECTOR; R : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (UNSIGNED(L) mod R);
|
|
end function "mod";
|
|
|
|
-- Id: A.36
|
|
function "mod" (L : NATURAL; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (L mod UNSIGNED(R));
|
|
end function "mod";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.1
|
|
function ">" (L, R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) > UNSIGNED(R);
|
|
end function ">";
|
|
|
|
-- Id: C.3
|
|
function ">" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L > UNSIGNED(R);
|
|
end function ">";
|
|
|
|
-- Id: C.5
|
|
function ">" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) > R;
|
|
end function ">";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.7
|
|
function "<" (L, R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) < UNSIGNED(R);
|
|
end function "<";
|
|
|
|
-- Id: C.9
|
|
function "<" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L < UNSIGNED(R);
|
|
end function "<";
|
|
|
|
-- Id: C.11
|
|
function "<" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) < R;
|
|
end function "<";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.13
|
|
function "<=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) <= UNSIGNED(R);
|
|
end function "<=";
|
|
|
|
-- Id: C.15
|
|
function "<=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L <= UNSIGNED(R);
|
|
end function "<=";
|
|
|
|
-- Id: C.17
|
|
function "<=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) <= R;
|
|
end function "<=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.19
|
|
function ">=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) >= UNSIGNED(R);
|
|
end function ">=";
|
|
|
|
-- Id: C.21
|
|
function ">=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L >= UNSIGNED(R);
|
|
end function ">=";
|
|
|
|
-- Id: C.23
|
|
function ">=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) >= R;
|
|
end function ">=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.25
|
|
function "=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) = UNSIGNED(R);
|
|
end function "=";
|
|
|
|
-- Id: C.27
|
|
function "=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L = UNSIGNED(R);
|
|
end function "=";
|
|
|
|
-- Id: C.29
|
|
function "=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) = R;
|
|
end function "=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.31
|
|
function "/=" (L, R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) /= UNSIGNED(R);
|
|
end function "/=";
|
|
|
|
-- Id: C.33
|
|
function "/=" (L : NATURAL; R : STD_LOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L /= UNSIGNED(R);
|
|
end function "/=";
|
|
|
|
-- Id: C.35
|
|
function "/=" (L : STD_LOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return UNSIGNED(L) /= R;
|
|
end function "/=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: S.1
|
|
function SHIFT_LEFT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (SHIFT_LEFT(unsigned(ARG), COUNT));
|
|
end function SHIFT_LEFT;
|
|
|
|
-- Id: S.2
|
|
function SHIFT_RIGHT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (SHIFT_RIGHT(unsigned(ARG), COUNT));
|
|
end function SHIFT_RIGHT;
|
|
|
|
--============================================================================
|
|
|
|
-- Id: S.5
|
|
function ROTATE_LEFT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (ROTATE_LEFT(unsigned(ARG), COUNT));
|
|
end function ROTATE_LEFT;
|
|
|
|
-- Id: S.6
|
|
function ROTATE_RIGHT (ARG : STD_LOGIC_VECTOR; COUNT : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (ROTATE_RIGHT(unsigned(ARG), COUNT));
|
|
end function ROTATE_RIGHT;
|
|
|
|
--============================================================================
|
|
|
|
-- Id: D.1
|
|
function TO_INTEGER (ARG : STD_LOGIC_VECTOR) return NATURAL is
|
|
begin
|
|
return TO_INTEGER(UNSIGNED(ARG));
|
|
end function TO_INTEGER;
|
|
|
|
-- Id: D.3
|
|
function To_StdLogicVector (ARG, SIZE : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (to_unsigned(ARG => ARG,
|
|
SIZE => SIZE));
|
|
end function To_StdLogicVector;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_StdLogicVector (ARG : NATURAL; SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (to_unsigned(ARG => ARG,
|
|
SIZE_RES => unsigned(SIZE_RES)));
|
|
end function To_StdLogicVector;
|
|
|
|
function To_slv (ARG, SIZE : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (to_unsigned(ARG => ARG,
|
|
SIZE => SIZE));
|
|
end function To_slv;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_slv (ARG : NATURAL; SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (to_unsigned(ARG => ARG,
|
|
SIZE_RES => unsigned(SIZE_RES)));
|
|
end function To_slv;
|
|
|
|
function To_Std_Logic_Vector (ARG, SIZE : NATURAL) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (to_unsigned(ARG => ARG,
|
|
SIZE => SIZE));
|
|
end function To_Std_Logic_Vector;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_Std_Logic_Vector (ARG : NATURAL; SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (to_unsigned(ARG => ARG,
|
|
SIZE_RES => unsigned(SIZE_RES)));
|
|
end function To_Std_Logic_Vector;
|
|
|
|
--============================================================================
|
|
|
|
-- function TO_01 is used to convert vectors to the
|
|
-- correct form for exported functions,
|
|
-- and to report if there is an element which
|
|
-- is not in (0, 1, H, L).
|
|
|
|
-- Id: T.1
|
|
function TO_01 (S : STD_LOGIC_VECTOR; XMAP : STD_LOGIC := '0')
|
|
return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (
|
|
to_01 (S => unsigned(S),
|
|
XMAP => XMAP));
|
|
end function TO_01;
|
|
|
|
-- Id: R.2
|
|
function RESIZE (ARG : STD_LOGIC_VECTOR; NEW_SIZE : NATURAL)
|
|
return STD_LOGIC_VECTOR is
|
|
begin
|
|
return std_logic_vector (
|
|
RESIZE (ARG => unsigned(ARG),
|
|
NEW_SIZE => NEW_SIZE));
|
|
end function RESIZE;
|
|
|
|
-- size_res version, uses the size of the "size_res" input
|
|
-- to resize the output
|
|
function RESIZE (ARG, SIZE_RES : STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR is
|
|
begin
|
|
return STD_LOGIC_VECTOR (
|
|
RESIZE (ARG => unsigned(ARG),
|
|
SIZE_RES => unsigned(SIZE_RES)));
|
|
end function RESIZE;
|
|
--==============================================================================
|
|
--============================= New subprograms ================================
|
|
--==============================================================================
|
|
|
|
-- Id: A.3R
|
|
function "+"(L : STD_LOGIC_VECTOR; R : STD_ULOGIC) return STD_LOGIC_VECTOR is
|
|
variable XR : STD_LOGIC_VECTOR(L'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XR(0) := R;
|
|
return (L + XR);
|
|
end function "+";
|
|
|
|
-- Id: A.3L
|
|
function "+"(L : STD_ULOGIC; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
variable XL : STD_LOGIC_VECTOR(R'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XL(0) := L;
|
|
return (XL + R);
|
|
end function "+";
|
|
|
|
-- Id: A.9R
|
|
function "-"(L : STD_LOGIC_VECTOR; R : STD_ULOGIC) return STD_LOGIC_VECTOR is
|
|
variable XR : STD_LOGIC_VECTOR(L'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XR(0) := R;
|
|
return (L - XR);
|
|
end function "-";
|
|
|
|
-- Id: A.9L
|
|
function "-"(L : STD_ULOGIC; R : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
variable XL : STD_LOGIC_VECTOR(R'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XL(0) := L;
|
|
return (XL - R);
|
|
end function "-";
|
|
|
|
-- Result subtype: UNSIGNED(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Procedure takes a carry in into the adder, and provides a carry out.
|
|
procedure add_carry (
|
|
L, R : in STD_LOGIC_VECTOR;
|
|
c_in : in STD_ULOGIC;
|
|
result : out STD_LOGIC_VECTOR;
|
|
c_out : out STD_ULOGIC) is
|
|
variable result_i : UNSIGNED (L'length-1 downto 0);
|
|
begin
|
|
add_carry (L => unsigned(L),
|
|
R => unsigned(R),
|
|
c_in => c_in,
|
|
result => result_i,
|
|
c_out => c_out);
|
|
result := STD_LOGIC_VECTOR (result_i);
|
|
end procedure add_carry;
|
|
|
|
-- These are here to override the defaults for these functions
|
|
function "sra" (ARG : STD_LOGIC_VECTOR; COUNT : INTEGER)
|
|
RETURN STD_LOGIC_VECTOR is
|
|
variable result_i : UNSIGNED (ARG'length-1 downto 0); -- unsigned version of arg
|
|
begin
|
|
result_i := UNSIGNED (arg);
|
|
result_i := result_i sra COUNT;
|
|
return STD_LOGIC_VECTOR (result_i);
|
|
end function "sra";
|
|
|
|
function "sla" (ARG : STD_LOGIC_VECTOR; COUNT : INTEGER)
|
|
RETURN STD_LOGIC_VECTOR is
|
|
variable result_i : UNSIGNED (ARG'length-1 downto 0); -- unsigned version of arg
|
|
begin
|
|
result_i := UNSIGNED (arg);
|
|
result_i := result_i sla COUNT;
|
|
return STD_LOGIC_VECTOR (result_i);
|
|
end function "sla";
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- New/updated functions for VHDL-200X fast track
|
|
-----------------------------------------------------------------------------
|
|
-- These override the implicit functions.
|
|
function maximum (
|
|
L, R : STD_LOGIC_VECTOR) -- inputs
|
|
return STD_LOGIC_VECTOR is
|
|
begin -- function maximum
|
|
if L > R then return L;
|
|
else return R;
|
|
end if;
|
|
end function maximum;
|
|
|
|
-- std_logic_vector output
|
|
function minimum (
|
|
L, R : STD_LOGIC_VECTOR) -- inputs
|
|
return STD_LOGIC_VECTOR is
|
|
begin -- function minimum
|
|
if L > R then return R;
|
|
else return L;
|
|
end if;
|
|
end function minimum;
|
|
|
|
function find_lsb (
|
|
arg : STD_LOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER is
|
|
begin
|
|
return find_lsb (arg => unsigned(arg),
|
|
y => y);
|
|
end function find_lsb;
|
|
|
|
function find_msb (
|
|
arg : STD_LOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER is
|
|
begin
|
|
return find_msb (arg => unsigned(arg),
|
|
y => y);
|
|
end function find_msb;
|
|
|
|
-- These need to be overloaded because the meaning of the compare operators
|
|
-- has changed.
|
|
-- %%% Replace with the following (new syntax)
|
|
-- %%% function "?=" (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC;
|
|
function \?=\ (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?=\ (UNSIGNED (L), UNSIGNED (R));
|
|
end function \?=\;
|
|
-- %%% end function "?=";
|
|
|
|
-- %%% function "?/=" (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?/=\ (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?/=\ (UNSIGNED (L), UNSIGNED (R));
|
|
end function \?/=\;
|
|
-- %%% end function "?/=";
|
|
|
|
-- %%% function "?>" (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?>\ (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?>\ (UNSIGNED (L), UNSIGNED (R));
|
|
end function \?>\;
|
|
-- %%% end function "?>";
|
|
|
|
-- %%% function "?>=" (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?>=\ (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?>=\ (UNSIGNED (L), UNSIGNED (R));
|
|
end function \?>=\;
|
|
-- %%% end function "?>=";
|
|
|
|
-- %%% function "?<" (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?<\ (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?<\ (UNSIGNED (L), UNSIGNED (R));
|
|
end function \?<\;
|
|
-- %%% end function "?<";
|
|
|
|
-- %%% function "?<=" (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?<=\ (L, R : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?<=\ (UNSIGNED (L), UNSIGNED (R));
|
|
end function \?<=\;
|
|
-- %%% end function "?<=";
|
|
----------------------------------------------------------------------------
|
|
-- Std_Ulogic_Vector versions
|
|
----------------------------------------------------------------------------
|
|
-- Conversion functions, these are needed because the base type of "UNSIGNED"
|
|
-- is std_logic, not STD_ULOGIC
|
|
-- purpose: Converts a std_ulogic_vector to an unsigned
|
|
function to_unsigned (
|
|
arg : STD_ULOGIC_VECTOR)
|
|
return UNSIGNED is
|
|
begin
|
|
return UNSIGNED (to_stdlogicvector (arg));
|
|
end function to_unsigned;
|
|
|
|
-- purpose: Converts an unsiged to a std_ulogic_vector
|
|
function to_sulv (
|
|
arg : UNSIGNED)
|
|
return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_stdulogicvector (STD_LOGIC_VECTOR (arg));
|
|
end function to_sulv;
|
|
--
|
|
-- Id: A.3
|
|
function "+" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) + to_unsigned(R));
|
|
end function "+";
|
|
|
|
-- Id: A.5
|
|
function "+" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) + R);
|
|
end function "+";
|
|
|
|
-- Id: A.6
|
|
function "+" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (L + to_unsigned(R));
|
|
end function "+";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.9
|
|
function "-" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) - to_unsigned(R));
|
|
end function "-";
|
|
|
|
-- Id: A.11
|
|
function "-" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) - R);
|
|
end function "-";
|
|
|
|
-- Id: A.12
|
|
function "-" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (L - to_unsigned(R));
|
|
end function "-";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.15
|
|
function "*" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) * to_unsigned(R));
|
|
end function "*";
|
|
|
|
-- Id: A.17
|
|
function "*" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) * R);
|
|
end function "*";
|
|
|
|
-- Id: A.18
|
|
function "*" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (L * to_unsigned(R));
|
|
end function "*";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.21
|
|
function "/" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) / to_unsigned(R));
|
|
end function "/";
|
|
|
|
-- Id: A.23
|
|
function "/" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) / R);
|
|
end function "/";
|
|
|
|
-- Id: A.24
|
|
function "/" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (L / to_unsigned(R));
|
|
end function "/";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.27
|
|
function "rem" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) rem to_unsigned(R));
|
|
end function "rem";
|
|
|
|
-- Id: A.29
|
|
function "rem" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) rem R);
|
|
end function "rem";
|
|
|
|
-- Id: A.30
|
|
function "rem" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (L rem to_unsigned(R));
|
|
end function "rem";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: A.33
|
|
function "mod" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) mod to_unsigned(R));
|
|
end function "mod";
|
|
|
|
-- Id: A.35
|
|
function "mod" (L : STD_ULOGIC_VECTOR; R : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(L) mod R);
|
|
end function "mod";
|
|
|
|
-- Id: A.36
|
|
function "mod" (L : NATURAL; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (L mod to_unsigned(R));
|
|
end function "mod";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.1
|
|
function ">" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) > to_unsigned(R);
|
|
end function ">";
|
|
|
|
-- Id: C.3
|
|
function ">" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L > to_unsigned(R);
|
|
end function ">";
|
|
|
|
-- Id: C.5
|
|
function ">" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) > R;
|
|
end function ">";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.7
|
|
function "<" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) < to_unsigned(R);
|
|
end function "<";
|
|
|
|
-- Id: C.9
|
|
function "<" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L < to_unsigned(R);
|
|
end function "<";
|
|
|
|
-- Id: C.11
|
|
function "<" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) < R;
|
|
end function "<";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.13
|
|
function "<=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) <= to_unsigned(R);
|
|
end function "<=";
|
|
|
|
-- Id: C.15
|
|
function "<=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L <= to_unsigned(R);
|
|
end function "<=";
|
|
|
|
-- Id: C.17
|
|
function "<=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) <= R;
|
|
end function "<=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.19
|
|
function ">=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) >= to_unsigned(R);
|
|
end function ">=";
|
|
|
|
-- Id: C.21
|
|
function ">=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L >= to_unsigned(R);
|
|
end function ">=";
|
|
|
|
-- Id: C.23
|
|
function ">=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) >= R;
|
|
end function ">=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.25
|
|
function "=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) = to_unsigned(R);
|
|
end function "=";
|
|
|
|
-- Id: C.27
|
|
function "=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L = to_unsigned(R);
|
|
end function "=";
|
|
|
|
-- Id: C.29
|
|
function "=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) = R;
|
|
end function "=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: C.31
|
|
function "/=" (L, R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) /= to_unsigned(R);
|
|
end function "/=";
|
|
|
|
-- Id: C.33
|
|
function "/=" (L : NATURAL; R : STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
begin
|
|
return L /= to_unsigned(R);
|
|
end function "/=";
|
|
|
|
-- Id: C.35
|
|
function "/=" (L : STD_ULOGIC_VECTOR; R : NATURAL) return BOOLEAN is
|
|
begin
|
|
return to_unsigned(L) /= R;
|
|
end function "/=";
|
|
|
|
--============================================================================
|
|
|
|
-- Id: S.1
|
|
function SHIFT_LEFT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (SHIFT_LEFT(unsigned(ARG), COUNT));
|
|
end function SHIFT_LEFT;
|
|
|
|
-- Id: S.2
|
|
function SHIFT_RIGHT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (SHIFT_RIGHT(unsigned(ARG), COUNT));
|
|
end function SHIFT_RIGHT;
|
|
|
|
--============================================================================
|
|
|
|
-- Id: S.5
|
|
function ROTATE_LEFT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (ROTATE_LEFT(unsigned(ARG), COUNT));
|
|
end function ROTATE_LEFT;
|
|
|
|
-- Id: S.6
|
|
function ROTATE_RIGHT (ARG : STD_ULOGIC_VECTOR; COUNT : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (ROTATE_RIGHT(unsigned(ARG), COUNT));
|
|
end function ROTATE_RIGHT;
|
|
|
|
--============================================================================
|
|
|
|
-- Id: D.1
|
|
function TO_INTEGER (ARG : STD_ULOGIC_VECTOR) return NATURAL is
|
|
begin
|
|
return TO_INTEGER(to_unsigned(ARG));
|
|
end function TO_INTEGER;
|
|
|
|
-- Id: D.3
|
|
function To_StdULogicVector (ARG, SIZE : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(ARG => ARG,
|
|
SIZE => SIZE));
|
|
end function To_StdULogicVector;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_StdULogicVector (ARG : NATURAL; SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(ARG => ARG,
|
|
SIZE_RES => unsigned(SIZE_RES)));
|
|
end function To_StdULogicVector;
|
|
|
|
function To_sulv (ARG, SIZE : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return To_sulv (to_unsigned(ARG => ARG,
|
|
SIZE => SIZE));
|
|
end function To_sulv;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_sulv (ARG : NATURAL; SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (to_unsigned(ARG => ARG,
|
|
SIZE_RES => to_unsigned(SIZE_RES)));
|
|
end function To_sulv;
|
|
|
|
function To_Std_ULogic_Vector (ARG, SIZE : NATURAL) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return To_sulv (to_unsigned(ARG => ARG,
|
|
SIZE => SIZE));
|
|
end function To_Std_ULogic_Vector;
|
|
|
|
-- size_res version, uses size_res to define the size of the output
|
|
function To_Std_ULogic_Vector (ARG : NATURAL; SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return To_sulv (to_unsigned(ARG => ARG,
|
|
SIZE_RES => to_unsigned(SIZE_RES)));
|
|
end function To_Std_ULogic_Vector;
|
|
|
|
--============================================================================
|
|
|
|
-- function TO_01 is used to convert vectors to the
|
|
-- correct form for exported functions,
|
|
-- and to report if there is an element which
|
|
-- is not in (0, 1, H, L).
|
|
|
|
-- Id: T.1
|
|
function TO_01 (S : STD_ULOGIC_VECTOR; XMAP : STD_LOGIC := '0')
|
|
return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (
|
|
to_01 (S => unsigned(S),
|
|
XMAP => XMAP));
|
|
end function TO_01;
|
|
|
|
-- Id: R.2
|
|
function RESIZE (ARG : STD_ULOGIC_VECTOR; NEW_SIZE : NATURAL)
|
|
return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (
|
|
RESIZE (ARG => unsigned(ARG),
|
|
NEW_SIZE => NEW_SIZE));
|
|
end function RESIZE;
|
|
|
|
-- size_res version, uses the size of the "size_res" input
|
|
-- to resize the output
|
|
function RESIZE (ARG, SIZE_RES : STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return to_sulv (
|
|
RESIZE (ARG => unsigned(ARG),
|
|
SIZE_RES => unsigned(SIZE_RES)));
|
|
end function RESIZE;
|
|
--==============================================================================
|
|
--============================= New subprograms ================================
|
|
--==============================================================================
|
|
|
|
-- Id: A.3R
|
|
function "+"(L : STD_ULOGIC_VECTOR; R : STD_ULOGIC) return STD_ULOGIC_VECTOR is
|
|
variable XR : STD_ULOGIC_VECTOR(L'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XR(0) := R;
|
|
return (L + XR);
|
|
end function "+";
|
|
|
|
-- Id: A.3L
|
|
function "+"(L : STD_ULOGIC; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
variable XL : STD_ULOGIC_VECTOR(R'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XL(0) := L;
|
|
return (XL + R);
|
|
end function "+";
|
|
|
|
-- Id: A.9R
|
|
function "-"(L : STD_ULOGIC_VECTOR; R : STD_ULOGIC) return STD_ULOGIC_VECTOR is
|
|
variable XR : STD_ULOGIC_VECTOR(L'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XR(0) := R;
|
|
return (L - XR);
|
|
end function "-";
|
|
|
|
-- Id: A.9L
|
|
function "-"(L : STD_ULOGIC; R : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
variable XL : STD_ULOGIC_VECTOR(R'length-1 downto 0) := (others => '0');
|
|
begin
|
|
XL(0) := L;
|
|
return (XL - R);
|
|
end function "-";
|
|
|
|
-- Result subtype: UNSIGNED(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
|
|
-- Procedure takes a carry in into the adder, and provides a carry out.
|
|
procedure add_carry (
|
|
L, R : in STD_ULOGIC_VECTOR;
|
|
c_in : in STD_ULOGIC;
|
|
result : out STD_ULOGIC_VECTOR;
|
|
c_out : out STD_ULOGIC) is
|
|
variable result_i : UNSIGNED (L'length-1 downto 0);
|
|
begin
|
|
add_carry (L => to_unsigned(L),
|
|
R => to_unsigned(R),
|
|
c_in => c_in,
|
|
result => result_i,
|
|
c_out => c_out);
|
|
result := to_sulv (result_i);
|
|
end procedure add_carry;
|
|
|
|
-- These are here to override the defaults for these functions
|
|
function "sra" (ARG : STD_ULOGIC_VECTOR; COUNT : INTEGER)
|
|
RETURN STD_ULOGIC_VECTOR is
|
|
variable result_i : UNSIGNED (ARG'length-1 downto 0); -- unsigned version of arg
|
|
begin
|
|
result_i := to_unsigned (arg);
|
|
result_i := result_i sra COUNT;
|
|
return to_sulv (result_i);
|
|
end function "sra";
|
|
|
|
function "sla" (ARG : STD_ULOGIC_VECTOR; COUNT : INTEGER)
|
|
RETURN STD_ULOGIC_VECTOR is
|
|
variable result_i : UNSIGNED (ARG'length-1 downto 0); -- unsigned version of arg
|
|
begin
|
|
result_i := to_unsigned (arg);
|
|
result_i := result_i sla COUNT;
|
|
return to_sulv (result_i);
|
|
end function "sla";
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- New/updated functions for VHDL-200X fast track
|
|
-----------------------------------------------------------------------------
|
|
-- These override the implicit functions.
|
|
function maximum (
|
|
L, R : STD_ULOGIC_VECTOR) -- inputs
|
|
return STD_ULOGIC_VECTOR is
|
|
begin -- function maximum
|
|
if L > R then return L;
|
|
else return R;
|
|
end if;
|
|
end function maximum;
|
|
|
|
-- std_ulogic_vector output
|
|
function minimum (
|
|
L, R : STD_ULOGIC_VECTOR) -- inputs
|
|
return STD_ULOGIC_VECTOR is
|
|
begin -- function minimum
|
|
if L > R then return R;
|
|
else return L;
|
|
end if;
|
|
end function minimum;
|
|
|
|
function find_lsb (
|
|
arg : STD_ULOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER is
|
|
begin
|
|
return find_lsb (arg => to_unsigned(arg),
|
|
y => y);
|
|
end function find_lsb;
|
|
|
|
function find_msb (
|
|
arg : STD_ULOGIC_VECTOR; -- vector argument
|
|
y : STD_ULOGIC) -- look for this bit
|
|
return INTEGER is
|
|
begin
|
|
return find_msb (arg => to_unsigned(arg),
|
|
y => y);
|
|
end function find_msb;
|
|
|
|
-- These need to be overloaded because the meaning of the compare operators
|
|
-- has changed.
|
|
-- %%% Replace with the following (new syntax)
|
|
-- %%% function "?=" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC;
|
|
function \?=\ (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?=\ (to_unsigned (L), to_unsigned (R));
|
|
end function \?=\;
|
|
-- %%% end function "?=";
|
|
|
|
-- %%% function "?/=" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?/=\ (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?/=\ (to_unsigned (L), to_unsigned (R));
|
|
end function \?/=\;
|
|
-- %%% end function "?/=";
|
|
|
|
-- %%% function "?>" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?>\ (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?>\ (to_unsigned (L), to_unsigned (R));
|
|
end function \?>\;
|
|
-- %%% end function "?>";
|
|
|
|
-- %%% function "?>=" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?>=\ (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?>=\ (to_unsigned (L), to_unsigned (R));
|
|
end function \?>=\;
|
|
-- %%% end function "?>=";
|
|
|
|
-- %%% function "?<" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?<\ (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?<\ (to_unsigned (L), to_unsigned (R));
|
|
end function \?<\;
|
|
-- %%% end function "?<";
|
|
|
|
-- %%% function "?<=" (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
function \?<=\ (L, R : STD_ULOGIC_VECTOR) return STD_ULOGIC is
|
|
begin
|
|
return \?<=\ (to_unsigned (L), to_unsigned (R));
|
|
end function \?<=\;
|
|
-- %%% end function "?<=";
|
|
end package body NUMERIC_STD_UNSIGNED;
|