|
|
-----------------------------------------------------------
|
|
|
-- VHDL file for FUNCTIONs used in verilog2vhdl files
|
|
|
-- DO NOT MODIFY THIS FILE
|
|
|
-- Author : S.O
|
|
|
-- Date : March 14, 1995
|
|
|
-- Modification History --
|
|
|
-- 3/31/95 Added shift operations (S.O)
|
|
|
-- 4/6/95 Added arithmetic operations for std_logic_vectors (S.O)
|
|
|
-- 4/11/95 Added conversion functions
|
|
|
-- 10/5/95 added to_boolean conversions
|
|
|
-- 1/31/96 added funcs. for std_logic and std_logic
|
|
|
-- 2/28/96 added funcs. for TERNARY combinations
|
|
|
-- 4/18/96 added logical operations bet. std_logic_vector and integer/boolean
|
|
|
-- 7/9/96 modified all TERNARY functions with *ulogic* conditional
|
|
|
-----------------------------------------------------------
|
|
|
|
|
|
library ieee;
|
|
|
library GSI;
|
|
|
use ieee.std_logic_1164.all;
|
|
|
--use ieee.numeric_std.all;
|
|
|
library grlib;
|
|
|
use grlib.stdlib.all;
|
|
|
|
|
|
package FUNCTIONS is
|
|
|
|
|
|
-- TYPE used in conversion function
|
|
|
TYPE direction is (LITTLE_ENDIAN, BIG_ENDIAN);
|
|
|
|
|
|
TYPE hex_digit IS ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
|
|
|
'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f');
|
|
|
TYPE hex_number IS array (POSITIVE range <>) OF hex_digit;
|
|
|
|
|
|
TYPE hexstdlogic IS ARRAY (hex_digit'LOW TO hex_digit'HIGH) of std_logic_vector(3 DOWNTO 0);
|
|
|
|
|
|
-- This conversion table would not accept X or Z.
|
|
|
-- To convert a hex number with X or Z use to_stdlogicvector(hex : STRING).
|
|
|
--CONSTANT hex_to_stdlogic : hexstdlogic := (x"0", x"1", x"2", x"3", x"4", x"5",
|
|
|
-- x"6", x"7", x"8", x"9", x"A", x"B", x"C", x"D", x"E", x"F", x"A", x"B",
|
|
|
-- x"C", x"D", x"E", x"F");
|
|
|
|
|
|
-- Signals used for v2v
|
|
|
|
|
|
--SIGNAL v2v_std_logic : std_logic;
|
|
|
--SIGNAL v2v_sig_integer : integer;
|
|
|
--SIGNAL v2v_boolean : boolean;
|
|
|
--SIGNAL v2v_real : real;
|
|
|
|
|
|
-- FUNCTIONs for unary operations
|
|
|
|
|
|
FUNCTION U_AND(a : std_ulogic_vector) return std_ulogic;
|
|
|
FUNCTION U_AND(a : std_logic_vector) return std_logic;
|
|
|
|
|
|
FUNCTION U_NAND(a : std_ulogic_vector) return std_ulogic;
|
|
|
FUNCTION U_NAND(a : std_logic_vector) return std_logic;
|
|
|
|
|
|
FUNCTION U_OR(a : std_ulogic_vector) return std_ulogic;
|
|
|
FUNCTION U_OR(a : std_logic_vector) return std_logic;
|
|
|
|
|
|
FUNCTION U_NOR(a : std_ulogic_vector) return std_ulogic;
|
|
|
FUNCTION U_NOR(a : std_logic_vector) return std_logic;
|
|
|
|
|
|
FUNCTION U_XOR(a : std_ulogic_vector) return std_ulogic;
|
|
|
FUNCTION U_XOR(a : std_logic_vector) return std_logic;
|
|
|
|
|
|
FUNCTION U_XNOR(a : std_ulogic_vector) return std_ulogic;
|
|
|
FUNCTION U_XNOR(a : std_logic_vector) return std_logic;
|
|
|
|
|
|
-- FUNCTIONs for ternary operations
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : boolean) return boolean;
|
|
|
FUNCTION TERNARY(a : boolean; b,c : std_ulogic) return std_ulogic;
|
|
|
FUNCTION TERNARY(a : boolean; b,c : std_ulogic_vector) return std_ulogic_vector;
|
|
|
FUNCTION TERNARY(a : boolean; b,c : std_logic_vector) return std_logic_vector;
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : boolean; b,c : real) return real;
|
|
|
FUNCTION TERNARY(a : boolean; b,c : time) return time;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : integer) return integer;
|
|
|
FUNCTION TERNARY(a : integer; b,c : std_ulogic) return std_ulogic;
|
|
|
FUNCTION TERNARY(a : integer; b,c : std_ulogic_vector) return std_ulogic_vector;
|
|
|
FUNCTION TERNARY(a : integer; b,c : std_logic_vector) return std_logic_vector;
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : integer; b,c : real) return real;
|
|
|
FUNCTION TERNARY(a : integer; b,c : time) return time;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : std_ulogic) return std_ulogic;
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : integer) return integer;
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : std_ulogic_vector) return std_ulogic_vector;
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : std_logic_vector) return std_logic_vector;
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : real) return real;
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : time) return time;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : std_ulogic_vector) return std_ulogic_vector;
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : integer) return integer;
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : std_ulogic) return std_ulogic;
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : std_logic_vector) return std_logic_vector;
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : real) return real;
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : time) return time;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : std_logic_vector) return std_logic_vector;
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : integer) return integer;
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : std_ulogic) return std_ulogic;
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : std_ulogic_vector) return std_ulogic_vector;
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : real) return real;
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : time) return time;
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : real) return real;
|
|
|
FUNCTION TERNARY(a : real; b,c : std_ulogic) return std_ulogic;
|
|
|
FUNCTION TERNARY(a : real; b,c : std_ulogic_vector) return std_ulogic_vector;
|
|
|
FUNCTION TERNARY(a : real; b,c : std_logic_vector) return std_logic_vector;
|
|
|
FUNCTION TERNARY(a : real; b,c : integer) return integer;
|
|
|
FUNCTION TERNARY(a : real; b,c : time) return time;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
-- functions for TERNARY combination
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : std_logic_vector; c: std_ulogic) return
|
|
|
std_logic_vector;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : std_ulogic; c: std_logic_vector) return
|
|
|
std_logic_vector;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : integer; c: std_ulogic) return
|
|
|
integer;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : std_ulogic; c: integer) return
|
|
|
integer;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : integer; c: std_ulogic) return
|
|
|
integer;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : std_ulogic; c: integer) return
|
|
|
integer;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : std_logic_vector; c: std_ulogic) return
|
|
|
std_logic_vector;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : std_ulogic; c: std_logic_vector) return
|
|
|
std_logic_vector;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--end functions for TERNARY combination
|
|
|
|
|
|
-- FUNCTIONS for shift operations
|
|
|
|
|
|
FUNCTION "sll" ( l : std_logic_vector; r : integer) RETURN std_logic_vector;
|
|
|
FUNCTION "sll" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector;
|
|
|
|
|
|
FUNCTION "srl" ( l : std_logic_vector; r : integer) RETURN std_logic_vector;
|
|
|
FUNCTION "srl" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector;
|
|
|
|
|
|
FUNCTION "sla" ( l : std_logic_vector; r : integer) RETURN std_logic_vector;
|
|
|
FUNCTION "sla" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector;
|
|
|
|
|
|
FUNCTION "sra" ( l : std_logic_vector; r : integer) RETURN std_logic_vector;
|
|
|
FUNCTION "sra" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector;
|
|
|
|
|
|
FUNCTION "rol" ( l : std_logic_vector; r : integer) RETURN std_logic_vector;
|
|
|
FUNCTION "rol" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector;
|
|
|
|
|
|
FUNCTION "ror" ( l : std_logic_vector; r : integer) RETURN std_logic_vector;
|
|
|
FUNCTION "ror" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector;
|
|
|
|
|
|
|
|
|
-- FUNCTIONs for integer operations
|
|
|
|
|
|
FUNCTION "not" (l: integer) return integer;
|
|
|
FUNCTION "and" (l,r: integer) return integer;
|
|
|
FUNCTION "nand" (l,r: integer) return integer;
|
|
|
FUNCTION "or" (l,r: integer) return integer;
|
|
|
FUNCTION "nor" (l,r: integer) return integer;
|
|
|
FUNCTION "xor" (l,r: integer) return integer;
|
|
|
FUNCTION "xnor" (l,r: integer) return integer;
|
|
|
FUNCTION "sll" (l,r: integer) return integer;
|
|
|
FUNCTION "srl" (l,r: integer) return integer;
|
|
|
|
|
|
|
|
|
-- FUNCTIONs for std_logic/std_ulogic_vector/std_logic_vector operations
|
|
|
|
|
|
-- FUNCTIONs for combination of Boolean and ints
|
|
|
|
|
|
FUNCTION "=" ( l : Boolean; r : natural ) RETURN boolean;
|
|
|
FUNCTION "/=" ( l : Boolean; r : natural ) RETURN boolean;
|
|
|
|
|
|
|
|
|
FUNCTION "=" ( l : integer; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION "/=" ( l : integer; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION "<" ( l : integer; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION ">" ( l : integer; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION "<=" ( l : integer; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION ">=" ( l : integer; r : std_logic_vector ) RETURN boolean;
|
|
|
|
|
|
|
|
|
FUNCTION "=" ( l : std_logic_vector; r : integer ) RETURN boolean;
|
|
|
FUNCTION "/=" ( l : std_logic_vector; r : integer ) RETURN boolean;
|
|
|
FUNCTION "<" ( l : std_logic_vector; r : integer ) RETURN boolean;
|
|
|
FUNCTION ">" ( l : std_logic_vector; r : integer ) RETURN boolean;
|
|
|
FUNCTION "<=" ( l : std_logic_vector; r : integer ) RETURN boolean;
|
|
|
FUNCTION ">=" ( l : std_logic_vector; r : integer ) RETURN boolean;
|
|
|
|
|
|
--logical functions between std_logic_vector and integer, std_logic_vector and boolean
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "nand" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "or" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "nor" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "xor" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
|
|
|
FUNCTION "and" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "nand" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "or" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "nor" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "xor" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector;
|
|
|
FUNCTION "nand" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector;
|
|
|
FUNCTION "or" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector;
|
|
|
FUNCTION "nor" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector;
|
|
|
FUNCTION "xor" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector;
|
|
|
|
|
|
FUNCTION "and" ( l : boolean; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION "nand" ( l : boolean; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION "or" ( l : boolean; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION "nor" ( l : boolean; r : std_logic_vector ) RETURN boolean;
|
|
|
FUNCTION "xor" ( l : boolean; r : std_logic_vector ) RETURN boolean;
|
|
|
|
|
|
--logical functions between std_logic_vector and integer, std_logic_vector and boolean
|
|
|
|
|
|
-- Added functions for std_logic, integer
|
|
|
FUNCTION "=" ( l : std_logic; r : integer ) RETURN boolean;
|
|
|
FUNCTION "/=" ( l : std_logic; r : integer ) RETURN boolean;
|
|
|
FUNCTION "<" ( l : std_logic; r : integer ) RETURN boolean;
|
|
|
FUNCTION ">" ( l : std_logic; r : integer ) RETURN boolean;
|
|
|
FUNCTION "<=" ( l : std_logic; r : integer ) RETURN boolean;
|
|
|
FUNCTION ">=" ( l : std_logic; r : integer ) RETURN boolean;
|
|
|
-- Functions for std_logic, integer
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
|
|
|
-- arithmetic operations for real and int and int and real
|
|
|
FUNCTION "+" ( l : real; r : integer ) RETURN real;
|
|
|
FUNCTION "-" ( l : real; r : integer ) RETURN real;
|
|
|
FUNCTION "/" ( l : real; r : integer ) RETURN real;
|
|
|
FUNCTION "*" ( l : real; r : integer ) RETURN real;
|
|
|
|
|
|
|
|
|
FUNCTION "+" ( l : integer; r : real ) RETURN real;
|
|
|
FUNCTION "-" ( l : integer; r : real ) RETURN real;
|
|
|
FUNCTION "/" ( l : integer; r : real ) RETURN real;
|
|
|
FUNCTION "*" ( l : integer; r : real ) RETURN real;
|
|
|
|
|
|
-- end arithmetic operations for real and int and int and real
|
|
|
|
|
|
FUNCTION "=" ( l : real; r : integer ) RETURN boolean;
|
|
|
FUNCTION "/=" ( l : real; r : integer ) RETURN boolean;
|
|
|
FUNCTION "<" ( l : real; r : integer ) RETURN boolean;
|
|
|
FUNCTION ">" ( l : real; r : integer ) RETURN boolean;
|
|
|
FUNCTION "<=" ( l : real; r : integer ) RETURN boolean;
|
|
|
FUNCTION ">=" ( l : real; r : integer ) RETURN boolean;
|
|
|
|
|
|
FUNCTION "=" ( l : integer; r : real ) RETURN boolean;
|
|
|
FUNCTION "/=" ( l : integer; r : real ) RETURN boolean;
|
|
|
FUNCTION "<" ( l : integer; r : real ) RETURN boolean;
|
|
|
FUNCTION ">" ( l : integer; r : real ) RETURN boolean;
|
|
|
FUNCTION "<=" ( l : integer; r : real ) RETURN boolean;
|
|
|
FUNCTION ">=" ( l : integer; r : real ) RETURN boolean;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION "+" ( l, r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "-" ( l, r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "*" ( l, r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "/" ( l, r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "REM" ( l, r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
|
|
|
|
|
|
FUNCTION "+" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "-" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "*" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "/" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "REM" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "&" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "&" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector;
|
|
|
|
|
|
-- need logical functions bet. std_logic_vector and std_logic
|
|
|
FUNCTION "and" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "nand" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "or" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "nor" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "xor" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
--FUNCTION "xnor" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "nand" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "or" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "nor" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "xor" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
--FUNCTION "xnor" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
|
|
|
-- end logical functions for std_logic_vector and std_logic
|
|
|
|
|
|
-- need arith functions bet std_logic and std_logic
|
|
|
-- used only when the int can be 0 or 1
|
|
|
-- need arithmetic functions bet. std_logic_vector and std_logic
|
|
|
FUNCTION "+" ( l : std_logic; r : std_logic ) RETURN std_logic;
|
|
|
FUNCTION "-" ( l : std_logic; r : std_logic ) RETURN std_logic;
|
|
|
FUNCTION "*" ( l : std_logic; r : std_logic ) RETURN std_logic;
|
|
|
FUNCTION "/" ( l : std_logic; r : std_logic ) RETURN std_logic;
|
|
|
FUNCTION "REM" ( l : std_logic; r : std_logic ) RETURN std_logic;
|
|
|
|
|
|
-- need arithmetic functions bet. std_logic_vector and std_logic
|
|
|
FUNCTION "+" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "-" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "*" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "/" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "REM" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector;
|
|
|
|
|
|
-- need arithmetic func. between std_logic and std_logic_vector, caveat, returns type of 'r'
|
|
|
FUNCTION "+" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "-" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "*" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "/" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
FUNCTION "REM" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector;
|
|
|
|
|
|
|
|
|
FUNCTION "+" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "-" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "*" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "/" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
FUNCTION "REM" ( l : integer; r : std_logic_vector ) RETURN integer;
|
|
|
|
|
|
-- need arith. functions bet std_logic and integer
|
|
|
FUNCTION "+" ( l : std_logic; r : integer ) RETURN integer;
|
|
|
FUNCTION "-" ( l : std_logic; r : integer ) RETURN integer;
|
|
|
FUNCTION "*" ( l : std_logic; r : integer ) RETURN integer;
|
|
|
FUNCTION "/" ( l : std_logic; r : integer ) RETURN integer;
|
|
|
FUNCTION "REM" ( l : std_logic; r : integer ) RETURN integer;
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic; r : integer ) RETURN std_logic;
|
|
|
FUNCTION "nand" ( l : std_logic; r : integer ) RETURN std_logic;
|
|
|
FUNCTION "or" ( l : std_logic; r : integer ) RETURN std_logic;
|
|
|
FUNCTION "nor" ( l : std_logic; r : integer ) RETURN std_logic;
|
|
|
FUNCTION "xor" ( l : std_logic; r : integer ) RETURN std_logic;
|
|
|
FUNCTION "&" ( l : std_logic; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "xnor" ( l : std_logic; r : integer ) RETURN std_logic;
|
|
|
|
|
|
FUNCTION "and" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "nand" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "or" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "nor" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "xor" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "&" ( l : integer; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "xnor" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
|
|
|
-- need functions for operations between std_logic and integer
|
|
|
FUNCTION "+" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "-" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "*" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "/" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
FUNCTION "REM" ( l : integer; r : std_logic ) RETURN integer;
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic; r : boolean ) RETURN std_logic;
|
|
|
FUNCTION "nand" ( l : std_logic; r : boolean ) RETURN std_logic;
|
|
|
FUNCTION "or" ( l : std_logic; r : boolean ) RETURN std_logic;
|
|
|
FUNCTION "nor" ( l : std_logic; r : boolean ) RETURN std_logic;
|
|
|
FUNCTION "xor" ( l : std_logic; r : boolean ) RETURN std_logic;
|
|
|
FUNCTION "&" ( l : std_logic; r : boolean ) RETURN std_logic_vector;
|
|
|
FUNCTION "xnor" ( l : std_logic; r : boolean ) RETURN std_logic;
|
|
|
|
|
|
FUNCTION "and" ( l : boolean; r : std_logic ) RETURN boolean;
|
|
|
FUNCTION "nand" ( l : boolean; r : std_logic ) RETURN boolean;
|
|
|
FUNCTION "or" ( l : boolean; r : std_logic ) RETURN boolean;
|
|
|
FUNCTION "nor" ( l : boolean; r : std_logic ) RETURN boolean;
|
|
|
FUNCTION "xor" ( l : boolean; r : std_logic ) RETURN boolean;
|
|
|
FUNCTION "&" ( l : boolean; r : std_logic ) RETURN std_logic_vector;
|
|
|
FUNCTION "xnor" ( l : boolean; r : std_logic ) RETURN boolean;
|
|
|
|
|
|
|
|
|
FUNCTION "and" ( l : integer; r : boolean ) RETURN integer;
|
|
|
FUNCTION "nand" ( l : integer; r : boolean ) RETURN integer;
|
|
|
FUNCTION "or" ( l : integer; r : boolean ) RETURN integer;
|
|
|
FUNCTION "nor" ( l : integer; r : boolean ) RETURN integer;
|
|
|
FUNCTION "xor" ( l : integer; r : boolean ) RETURN integer;
|
|
|
FUNCTION "&" ( l : integer; r : boolean ) RETURN std_logic_vector;
|
|
|
FUNCTION "xnor" ( l : integer; r : boolean ) RETURN integer;
|
|
|
|
|
|
FUNCTION "and" ( l : boolean; r : integer ) RETURN boolean;
|
|
|
FUNCTION "nand" ( l : boolean; r : integer ) RETURN boolean;
|
|
|
FUNCTION "or" ( l : boolean; r : integer ) RETURN boolean;
|
|
|
FUNCTION "nor" ( l : boolean; r : integer ) RETURN boolean;
|
|
|
FUNCTION "xor" ( l : boolean; r : integer ) RETURN boolean;
|
|
|
FUNCTION "&" ( l : boolean; r : integer ) RETURN std_logic_vector;
|
|
|
FUNCTION "xnor" ( l : boolean; r : integer ) RETURN boolean;
|
|
|
|
|
|
-- Overloaded function for text output
|
|
|
FUNCTION to_bitvector ( a : bit ) RETURN bit_vector;
|
|
|
FUNCTION to_bitvector ( a : std_ulogic ) RETURN bit_vector;
|
|
|
FUNCTION to_bitvector ( a : integer ) RETURN bit_vector;
|
|
|
|
|
|
--Conversion functions
|
|
|
FUNCTION to_stdlogicvector(l : integer; size : natural; dir : direction := LITTLE_ENDIAN) RETURN std_logic_vector;
|
|
|
FUNCTION to_stdlogicvector(l : std_logic_vector) RETURN std_logic_vector;
|
|
|
FUNCTION to_stdlogicvector(l : std_logic_vector; size : natural;dir : direction := little_endian ) RETURN std_logic_vector;
|
|
|
FUNCTION to_stdlogicvector ( hex : STRING ) RETURN std_logic_vector;
|
|
|
FUNCTION to_stdlogicvector(l : std_logic; size : natural) RETURN std_logic_vector;
|
|
|
FUNCTION to_stdlogicvector(l : boolean; size : natural) RETURN std_logic_vector;
|
|
|
|
|
|
FUNCTION to_integer(l : std_logic_vector; dir : direction := little_endian) RETURN integer;
|
|
|
FUNCTION to_integer(l : integer) RETURN integer;
|
|
|
FUNCTION to_integer(l : std_logic) RETURN integer;
|
|
|
FUNCTION to_integer(l : boolean) RETURN integer;
|
|
|
|
|
|
-- functions for resolving ambiguity
|
|
|
FUNCTION v2v_to_integer(l : std_logic_vector; dir : direction := little_endian) RETURN integer;
|
|
|
FUNCTION v2v_to_integer(l : integer) RETURN integer;
|
|
|
FUNCTION v2v_to_integer(l : std_logic) RETURN integer;
|
|
|
FUNCTION v2v_to_integer(l : boolean) RETURN integer;
|
|
|
|
|
|
FUNCTION to_stdlogic(l : integer) RETURN std_logic;
|
|
|
FUNCTION to_stdlogic(l : Boolean) RETURN std_logic;
|
|
|
FUNCTION to_stdlogic(l : std_logic) RETURN std_logic;
|
|
|
FUNCTION to_stdlogic(l : std_logic_vector) RETURN std_logic;
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION to_real(l : integer) RETURN real;
|
|
|
FUNCTION to_real (l : real) RETURN real;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION to_boolean(l : std_logic) RETURN boolean;
|
|
|
FUNCTION to_boolean(l : integer) RETURN boolean;
|
|
|
FUNCTION to_boolean(l : std_logic_vector) RETURN boolean;
|
|
|
FUNCTION to_boolean(l : boolean) RETURN boolean;
|
|
|
|
|
|
end FUNCTIONS;
|
|
|
|
|
|
library ieee;
|
|
|
library GSI;
|
|
|
use ieee.std_logic_1164.all;
|
|
|
use ieee.numeric_std.all;
|
|
|
--library grlib;
|
|
|
--use grlib.stdlib.all;
|
|
|
|
|
|
Package body FUNCTIONS is
|
|
|
|
|
|
--============= Local Subprograms (from numeric_std.vhd)=====================
|
|
|
|
|
|
function MAX (LEFT, RIGHT: INTEGER) return INTEGER is
|
|
|
begin
|
|
|
if LEFT > RIGHT then return LEFT;
|
|
|
else return RIGHT;
|
|
|
end if;
|
|
|
end MAX;
|
|
|
|
|
|
function MIN (LEFT, RIGHT: INTEGER) return INTEGER is
|
|
|
begin
|
|
|
if LEFT < RIGHT then return LEFT;
|
|
|
else return RIGHT;
|
|
|
end if;
|
|
|
end MIN;
|
|
|
|
|
|
|
|
|
-- unary operations
|
|
|
TYPE stdlogic_boolean_table is array(std_ulogic, std_ulogic) of boolean;
|
|
|
TYPE stdlogic_1d IS ARRAY (std_ulogic) OF std_ulogic;
|
|
|
TYPE stdlogic_table IS ARRAY(std_ulogic, std_ulogic) OF std_ulogic;
|
|
|
|
|
|
|
|
|
FUNCTION U_AND(a : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
|
VARIABLE result : std_ulogic := '1';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result and a(i);
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
end U_AND;
|
|
|
|
|
|
FUNCTION U_AND(a : std_logic_vector) return std_logic is
|
|
|
|
|
|
VARIABLE result : std_logic := '1';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result and a(i);
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
end U_AND;
|
|
|
|
|
|
FUNCTION U_NAND(a : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
|
VARIABLE result : std_ulogic := '1';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result and a(i);
|
|
|
END LOOP;
|
|
|
return not(result);
|
|
|
end U_NAND;
|
|
|
|
|
|
FUNCTION U_NAND(a : std_logic_vector) return std_logic is
|
|
|
|
|
|
VARIABLE result : std_logic := '1';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result and a(i);
|
|
|
END LOOP;
|
|
|
return not(result);
|
|
|
end U_NAND;
|
|
|
|
|
|
FUNCTION U_OR(a : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
|
VARIABLE result : std_ulogic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result or a(i);
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
end U_OR;
|
|
|
|
|
|
FUNCTION U_OR(a : std_logic_vector) return std_logic is
|
|
|
|
|
|
VARIABLE result : std_logic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result or a(i);
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
end U_OR;
|
|
|
|
|
|
FUNCTION U_NOR(a : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
|
VARIABLE result : std_ulogic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result or a(i);
|
|
|
END LOOP;
|
|
|
return not(result);
|
|
|
end U_NOR;
|
|
|
|
|
|
FUNCTION U_NOR(a : std_logic_vector) return std_logic is
|
|
|
|
|
|
VARIABLE result : std_logic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result or a(i);
|
|
|
END LOOP;
|
|
|
return not(result);
|
|
|
end U_NOR;
|
|
|
|
|
|
FUNCTION U_XOR(a : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
|
VARIABLE result : std_ulogic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result xor a(i);
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
end U_XOR;
|
|
|
|
|
|
FUNCTION U_XOR(a : std_logic_vector) return std_logic is
|
|
|
|
|
|
VARIABLE result : std_logic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result xor a(i);
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
end U_XOR;
|
|
|
|
|
|
FUNCTION U_XNOR(a : std_ulogic_vector) return std_ulogic is
|
|
|
|
|
|
VARIABLE result : std_ulogic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result xor a(i);
|
|
|
END LOOP;
|
|
|
return not(result);
|
|
|
end U_XNOR;
|
|
|
|
|
|
FUNCTION U_XNOR(a : std_logic_vector) return std_logic is
|
|
|
|
|
|
VARIABLE result : std_logic := '0';
|
|
|
begin
|
|
|
FOR i in a'RANGE LOOP
|
|
|
result := result xor a(i);
|
|
|
END LOOP;
|
|
|
return not(result);
|
|
|
end U_XNOR;
|
|
|
|
|
|
-- ternary operations
|
|
|
FUNCTION TERNARY(a,b,c : boolean) return boolean IS
|
|
|
|
|
|
begin
|
|
|
IF a = TRUE THEN
|
|
|
RETURN b;
|
|
|
ELSE
|
|
|
RETURN c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
---------------------------------------------------
|
|
|
FUNCTION TERNARY(a : boolean; b,c : std_ulogic) return std_ulogic IS
|
|
|
|
|
|
begin
|
|
|
IF a = TRUE THEN
|
|
|
RETURN b;
|
|
|
ELSE
|
|
|
RETURN c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
---------------------------------------------------
|
|
|
FUNCTION TERNARY(a : boolean; b,c : std_ulogic_vector) return std_ulogic_vector IS
|
|
|
|
|
|
begin
|
|
|
IF a = TRUE THEN
|
|
|
RETURN b;
|
|
|
ELSE
|
|
|
RETURN c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
---------------------------------------------------
|
|
|
FUNCTION TERNARY(a : boolean; b,c : std_logic_vector) return std_logic_vector IS
|
|
|
|
|
|
begin
|
|
|
IF a = TRUE THEN
|
|
|
RETURN b;
|
|
|
ELSE
|
|
|
RETURN c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
---------------------------------------------------
|
|
|
FUNCTION TERNARY(a : boolean; b,c : real) return real IS
|
|
|
|
|
|
begin
|
|
|
IF a = TRUE THEN
|
|
|
RETURN b;
|
|
|
ELSE
|
|
|
RETURN c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
---------------------------------------------------
|
|
|
FUNCTION TERNARY(a : boolean; b,c : time) return time IS
|
|
|
|
|
|
begin
|
|
|
IF a = TRUE THEN
|
|
|
RETURN b;
|
|
|
ELSE
|
|
|
RETURN c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
--pragma synthesis_on
|
|
|
---------------------------------------------------
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : integer) return integer is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b,c : std_ulogic) return std_ulogic is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b,c : std_ulogic_vector) return std_ulogic_vector is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b,c : std_logic_vector) return std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : integer; b,c : real) return real is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b,c : time) return time is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : std_ulogic) return std_ulogic is
|
|
|
|
|
|
begin
|
|
|
IF (a = '1') THEN
|
|
|
return b;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (b = c AND NOT Is_X(b)) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return 'X';
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : integer) return integer is
|
|
|
|
|
|
begin
|
|
|
IF (a = '1') THEN
|
|
|
return b;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (b = c) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return 0;
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : std_ulogic_vector) return std_ulogic_vector is
|
|
|
--pragma synthesis_off
|
|
|
constant SIZE: NATURAL := MAX(b'LENGTH, c'LENGTH);
|
|
|
variable b01 : std_ulogic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable c01 : std_ulogic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable result : std_ulogic_vector(SIZE-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
begin
|
|
|
IF (a = '1') THEN
|
|
|
return b;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (b = c AND NOT Is_X(b)) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
b01(b'LENGTH-1 downto 0) := b;
|
|
|
c01(c'LENGTH-1 downto 0) := c;
|
|
|
FOR I IN SIZE-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : std_logic_vector) return std_logic_vector is
|
|
|
--pragma synthesis_off
|
|
|
constant SIZE: NATURAL := MAX(b'LENGTH, c'LENGTH);
|
|
|
variable b01 : std_logic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable c01 : std_logic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable result : std_logic_vector(SIZE-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
begin
|
|
|
IF (a = '1') THEN
|
|
|
return b;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (b = c AND NOT Is_X(b)) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
b01(b'LENGTH-1 downto 0) := b;
|
|
|
c01(c'LENGTH-1 downto 0) := c;
|
|
|
FOR I IN SIZE-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : real) return real is
|
|
|
|
|
|
begin
|
|
|
IF (a = '1') THEN
|
|
|
return b;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c;
|
|
|
ELSIF (b = c) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return 0.0;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b,c : time) return time is
|
|
|
|
|
|
begin
|
|
|
IF (a = '1') THEN
|
|
|
return b;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c;
|
|
|
ELSIF (b = c) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return 0 ns;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : std_ulogic_vector) return std_ulogic_vector is
|
|
|
--pragma synthesis_off
|
|
|
constant SIZE: NATURAL := MAX(b'LENGTH, c'LENGTH);
|
|
|
variable b01 : std_ulogic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable c01 : std_ulogic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable result : std_ulogic_vector(SIZE-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE
|
|
|
b01(b'LENGTH-1 downto 0) := b;
|
|
|
c01(c'LENGTH-1 downto 0) := c;
|
|
|
FOR I IN SIZE-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : integer) return integer is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 0;
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : std_ulogic) return std_ulogic is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 'X';
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : std_logic_vector) return std_logic_vector is
|
|
|
--pragma synthesis_off
|
|
|
constant SIZE: NATURAL := MAX(b'LENGTH, c'LENGTH);
|
|
|
variable b01 : std_logic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable c01 : std_logic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable result : std_logic_vector(SIZE-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE
|
|
|
b01(b'LENGTH-1 downto 0) := b;
|
|
|
c01(c'LENGTH-1 downto 0) := c;
|
|
|
FOR I IN SIZE-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : real) return real is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 0.0;
|
|
|
END IF;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic_vector; b,c : time) return time is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 0 ns;
|
|
|
END IF;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : std_logic_vector) return std_logic_vector is
|
|
|
--pragma synthesis_off
|
|
|
constant SIZE: NATURAL := MAX(b'LENGTH, c'LENGTH);
|
|
|
variable b01 : std_logic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable c01 : std_logic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable result : std_logic_vector(SIZE-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE
|
|
|
b01(b'LENGTH-1 downto 0) := b;
|
|
|
c01(c'LENGTH-1 downto 0) := c;
|
|
|
FOR I IN SIZE-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : integer) return integer is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 0;
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : std_ulogic) return std_ulogic is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 'X';
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : std_ulogic_vector) return std_ulogic_vector is
|
|
|
--pragma synthesis_off
|
|
|
constant SIZE: NATURAL := MAX(b'LENGTH, c'LENGTH);
|
|
|
variable b01 : std_ulogic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable c01 : std_ulogic_vector(SIZE-1 downto 0) := (OTHERS => '0');
|
|
|
variable result : std_ulogic_vector(SIZE-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE
|
|
|
b01(b'LENGTH-1 downto 0) := b;
|
|
|
c01(c'LENGTH-1 downto 0) := c;
|
|
|
FOR I IN SIZE-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
END IF;
|
|
|
--pragma synthesis_on
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : real) return real is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 0.0;
|
|
|
END IF;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_logic_vector; b,c : time) return time is
|
|
|
|
|
|
begin
|
|
|
IF to_boolean(to_stdlogicvector(to_bitvector(a))) THEN
|
|
|
return b;
|
|
|
ELSIF (Is_X(a)) THEN
|
|
|
IF (b = c) THEN return b;
|
|
|
ELSE return 0 ns;
|
|
|
END IF;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a,b,c : real) return real is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : real; b,c : std_ulogic) return std_ulogic is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : real; b,c : std_ulogic_vector) return std_ulogic_vector is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : real; b,c : std_logic_vector) return std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : real; b,c : integer) return integer is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : real; b,c : time) return time is
|
|
|
|
|
|
begin
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
end TERNARY;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
-- functions for TERNARY combination
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : std_logic_vector; c: std_ulogic) return
|
|
|
std_logic_vector IS
|
|
|
variable c01 : std_logic_vector(b'LENGTH-1 downto 0) := (OTHERS => '0');
|
|
|
--pragma synthesis_off
|
|
|
variable b01 : std_logic_vector(b'LENGTH-1 downto 0) := b;
|
|
|
variable result : std_logic_vector(b'LENGTH-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
BEGIN
|
|
|
c01(0) := c;
|
|
|
IF (a = '1') THEN
|
|
|
return b;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c01;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (b01 = c01 AND NOT Is_X(b)) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
FOR I IN b'LENGTH-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
END TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : std_ulogic; c: std_logic_vector) return
|
|
|
std_logic_vector IS
|
|
|
variable b01 : std_logic_vector(c'LENGTH-1 downto 0) := (OTHERS => '0');
|
|
|
--pragma synthesis_off
|
|
|
variable c01 : std_logic_vector(c'LENGTH-1 downto 0) := c;
|
|
|
variable result : std_logic_vector(c'LENGTH-1 downto 0);
|
|
|
--pragma synthesis_on
|
|
|
BEGIN
|
|
|
b01(0) := b;
|
|
|
IF (a = '1') THEN
|
|
|
return b01;
|
|
|
ELSIF (a = '0') THEN
|
|
|
return c;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (b01 = c01 AND NOT Is_X(b01)) THEN
|
|
|
return b01;
|
|
|
ELSE
|
|
|
FOR I IN c'LENGTH-1 DOWNTO 0 LOOP
|
|
|
IF (b01(I) = c01(I) AND NOT Is_X(b01(I))) THEN
|
|
|
result(I) := b01(I);
|
|
|
ELSE
|
|
|
result(I) := 'X';
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
return result;
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
END TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : integer; c: std_ulogic) return
|
|
|
integer IS
|
|
|
BEGIN
|
|
|
IF (a = '0') THEN
|
|
|
return to_integer(c);
|
|
|
ELSIF (a = '1') THEN
|
|
|
return b;
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (b = to_integer(c) AND NOT Is_X(c)) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return 0;
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
END TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : std_ulogic; b : std_ulogic; c: integer) return
|
|
|
integer IS
|
|
|
BEGIN
|
|
|
IF (a = '0') THEN
|
|
|
return c;
|
|
|
ELSIF (a = '1') THEN
|
|
|
return to_integer(b);
|
|
|
--pragma synthesis_off
|
|
|
ELSIF (to_integer(b) = c AND NOT Is_X(b)) THEN
|
|
|
return c;
|
|
|
ELSE
|
|
|
return 0;
|
|
|
--pragma synthesis_on
|
|
|
END IF;
|
|
|
END TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : integer; c: std_ulogic) return
|
|
|
integer IS
|
|
|
BEGIN
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
return to_integer(c);
|
|
|
END IF;
|
|
|
|
|
|
END TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : std_ulogic; c: integer) return
|
|
|
integer IS
|
|
|
BEGIN
|
|
|
IF (a /= 0) THEN
|
|
|
return to_integer(b);
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
|
|
|
END TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : std_logic_vector; c: std_ulogic) return
|
|
|
std_logic_vector IS
|
|
|
VARIABLE temp : std_logic_vector(0 downto 0);
|
|
|
BEGIN
|
|
|
IF (a /= 0) THEN
|
|
|
return b;
|
|
|
ELSE
|
|
|
temp(0) := c;
|
|
|
return temp;
|
|
|
END IF;
|
|
|
END TERNARY;
|
|
|
|
|
|
FUNCTION TERNARY(a : integer; b : std_ulogic; c: std_logic_vector) return
|
|
|
std_logic_vector IS
|
|
|
VARIABLE temp : std_logic_vector(0 downto 0);
|
|
|
BEGIN
|
|
|
IF (a /= 0) THEN
|
|
|
temp(0) := b;
|
|
|
return temp;
|
|
|
ELSE
|
|
|
return c;
|
|
|
END IF;
|
|
|
|
|
|
END TERNARY;
|
|
|
|
|
|
--end functions for TERNARY combination
|
|
|
|
|
|
-- FUNCTIONS for integer operations
|
|
|
|
|
|
FUNCTION "not" (l: integer) return integer is
|
|
|
|
|
|
VARIABLE temp : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
begin
|
|
|
return TO_INTEGER(NOT(temp));
|
|
|
end "not";
|
|
|
|
|
|
FUNCTION "and" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
VARIABLE temp2 : SIGNED(31 downto 0) := TO_SIGNED(r,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 AND temp2);
|
|
|
end "and";
|
|
|
|
|
|
FUNCTION "nand" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
VARIABLE temp2 : SIGNED(31 downto 0) := TO_SIGNED(r,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 NAND temp2);
|
|
|
end "nand";
|
|
|
|
|
|
FUNCTION "or" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
VARIABLE temp2 : SIGNED(31 downto 0) := TO_SIGNED(r,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 OR temp2);
|
|
|
end "or";
|
|
|
|
|
|
FUNCTION "nor" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
VARIABLE temp2 : SIGNED(31 downto 0) := TO_SIGNED(r,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 NOR temp2);
|
|
|
end "nor";
|
|
|
|
|
|
FUNCTION "xor" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
VARIABLE temp2 : SIGNED(31 downto 0) := TO_SIGNED(r,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 XOR temp2);
|
|
|
end "xor";
|
|
|
|
|
|
FUNCTION "xnor" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
VARIABLE temp2 : SIGNED(31 downto 0) := TO_SIGNED(r,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 XNOR temp2);
|
|
|
end "xnor";
|
|
|
|
|
|
FUNCTION "sll" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 SLL r);
|
|
|
end "sll";
|
|
|
|
|
|
FUNCTION "srl" (l,r: integer) return integer is
|
|
|
|
|
|
VARIABLE temp1 : SIGNED(31 downto 0) := TO_SIGNED(l,32);
|
|
|
|
|
|
begin
|
|
|
return TO_INTEGER(temp1 SRL r);
|
|
|
end "srl";
|
|
|
|
|
|
|
|
|
-- functions for std_ulogic operations
|
|
|
-- first add all the tables needed
|
|
|
|
|
|
-- truth table for "=" function
|
|
|
CONSTANT eq_table : stdlogic_boolean_table := (
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | U |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | X |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | 0 |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | 1 |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | Z |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | W |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | L |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | H |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for "/=" function
|
|
|
CONSTANT neq_table : stdlogic_boolean_table := (
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | U |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | X |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | 0 |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | 1 |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | Z |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | W |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | L |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | H |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for "<" function
|
|
|
CONSTANT ltb_table : stdlogic_boolean_table := (
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | U |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | X |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | 0 |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | 1 |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | Z |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | W |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | L |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | H |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for ">" function
|
|
|
CONSTANT gtb_table : stdlogic_boolean_table := (
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | U |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | X |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | 0 |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | 1 |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | Z |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | W |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- | L |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | H |
|
|
|
( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for "<=" function
|
|
|
CONSTANT leb_table : stdlogic_boolean_table := (
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | U |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | X |
|
|
|
( TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE ), -- | 0 |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | 1 |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | Z |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | W |
|
|
|
( TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE ), -- | L |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ), -- | H |
|
|
|
( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for ">=" function
|
|
|
CONSTANT geb_table : stdlogic_boolean_table := (
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------------------------------
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | U |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | X |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | 0 |
|
|
|
( TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE ), -- | 1 |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | Z |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | W |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ), -- | L |
|
|
|
( TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE ), -- | H |
|
|
|
( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ) -- | D |
|
|
|
);
|
|
|
|
|
|
CONSTANT lt_table : stdlogic_table := (
|
|
|
-- ----------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------
|
|
|
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
|
|
|
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | 0 |
|
|
|
( 'U', 'X', '0', '0', 'X', 'X', '0', '0', 'X' ), -- | 1 |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | Z |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | W |
|
|
|
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | L |
|
|
|
( 'U', 'X', '0', '0', 'X', 'X', '0', '0', 'X' ), -- | H |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for ">" function
|
|
|
CONSTANT gt_table : stdlogic_table := (
|
|
|
-- ----------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------
|
|
|
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
|
|
|
( 'U', 'X', '0', '0', 'X', 'X', '0', '0', 'X' ), -- | 0 |
|
|
|
( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' ), -- | 1 |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | Z |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | W |
|
|
|
( 'U', 'X', '0', '0', 'X', 'X', '0', '0', 'X' ), -- | L |
|
|
|
( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' ), -- | H |
|
|
|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for "<=" function
|
|
|
CONSTANT le_table : stdlogic_table := (
|
|
|
-- ----------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------
|
|
|
( 'U', 'U', 'U', '1', 'U', 'U', 'U', '1', 'U' ), -- | U |
|
|
|
( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ), -- | X |
|
|
|
( '1', '1', '1', '1', '1', '1', '1', '1', '1' ), -- | 0 |
|
|
|
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | 1 |
|
|
|
( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ), -- | Z |
|
|
|
( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ), -- | W |
|
|
|
( '1', '1', '1', '1', '1', '1', '1', '1', '1' ), -- | L |
|
|
|
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | H |
|
|
|
( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ) -- | D |
|
|
|
);
|
|
|
|
|
|
-- truth table for ">=" function
|
|
|
CONSTANT ge_table : stdlogic_table := (
|
|
|
-- ----------------------------------------------------
|
|
|
-- | U X 0 1 Z W L H D | |
|
|
|
-- ----------------------------------------------------
|
|
|
( 'U', 'U', '1', 'U', 'U', 'U', '1', 'U', 'U' ), -- | U |
|
|
|
( 'U', 'X', '1', 'X', 'X', 'X', '1', 'X', 'X' ), -- | X |
|
|
|
( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' ), -- | 0 |
|
|
|
( '1', '1', '1', '1', '1', '1', '1', '1', '1' ), -- | 1 |
|
|
|
( 'U', 'X', '1', 'X', 'X', 'X', '1', 'X', 'X' ), -- | Z |
|
|
|
( 'U', 'X', '1', 'X', 'X', 'X', '1', 'X', 'X' ), -- | W |
|
|
|
( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' ), -- | L |
|
|
|
( '1', '1', '1', '1', '1', '1', '1', '1', '1' ), -- | H |
|
|
|
( 'U', 'X', '1', 'X', 'X', 'X', '1', 'X', 'X' ) -- | D |
|
|
|
);
|
|
|
|
|
|
|
|
|
FUNCTION "=" ( l : Boolean; r : natural ) RETURN Boolean is
|
|
|
|
|
|
begin
|
|
|
IF l = TRUE AND r = 1 THEN
|
|
|
return TRUE;
|
|
|
ELSIF l = FALSE AND r = 0 THEN
|
|
|
return TRUE;
|
|
|
ELSE
|
|
|
return FALSE;
|
|
|
END IF;
|
|
|
end "=";
|
|
|
|
|
|
FUNCTION "/=" ( l : Boolean; r : natural ) RETURN Boolean is
|
|
|
|
|
|
begin
|
|
|
return NOT (l = r);
|
|
|
end "/=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "=" ( l : integer; r : std_logic_vector ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l = SIGNED(r);
|
|
|
END "=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "/=" ( l : integer; r : std_logic_vector ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l /= SIGNED(r);
|
|
|
END "/=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<" ( l : integer; r : std_logic_vector ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l < SIGNED(r);
|
|
|
END "<";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">" ( l : integer; r : std_logic_vector ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l > SIGNED(r);
|
|
|
END ">";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<=" ( l : integer; r : std_logic_vector ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l <= SIGNED(r);
|
|
|
END "<=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">=" ( l : integer; r : std_logic_vector ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l >= SIGNED(r);
|
|
|
END ">=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "=" ( l : std_logic_vector; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN SIGNED(l) = r;
|
|
|
END "=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "/=" ( l : std_logic_vector; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN SIGNED(l) /= r;
|
|
|
END "/=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<" ( l : std_logic_vector; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN SIGNED(l) < r;
|
|
|
END "<";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">" ( l : std_logic_vector; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN SIGNED(l) > r;
|
|
|
END ">";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<=" ( l : std_logic_vector; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN SIGNED(l) <= r;
|
|
|
END "<=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">=" ( l : std_logic_vector; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN SIGNED(l) >= r;
|
|
|
END ">=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
--logical functions between std_logic_vector and integer, std_logic_vector and boolean
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector is
|
|
|
BEGIN
|
|
|
RETURN l and to_stdlogicvector(l, 32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l nand to_stdlogicvector(l, 32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "or" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l or to_stdlogicvector(l, 32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l nor to_stdlogicvector(l, 32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l xor to_stdlogicvector(l, 32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l and v2v_to_integer(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l nand v2v_to_integer(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "or" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l or v2v_to_integer(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l nor v2v_to_integer(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l xor v2v_to_integer(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l and to_stdlogicvector(r,32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l nand to_stdlogicvector(r,32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "or" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l or to_stdlogicvector(r,32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l nor to_stdlogicvector(r,32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l xor to_stdlogicvector(r,32);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : boolean; r : std_logic_vector ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l and to_boolean(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : boolean; r : std_logic_vector ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l nand to_boolean(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "or" ( l : boolean; r : std_logic_vector ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l or to_boolean(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : boolean; r : std_logic_vector ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l nor to_boolean(r);
|
|
|
END;
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : boolean; r : std_logic_vector ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l xor to_boolean(r);
|
|
|
END;
|
|
|
|
|
|
--logical functions between std_logic_vector and integer, std_logic_vector and boolean
|
|
|
-----------------------------------------------------------------
|
|
|
-- Added functions for std_logic, integer
|
|
|
FUNCTION "=" ( l : std_logic; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN to_integer(l) = r;
|
|
|
END "=";
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "/=" ( l : std_logic; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN to_integer(l) /= r;
|
|
|
END "/=";
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "<" ( l : std_logic; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN to_integer(l) < r;
|
|
|
END "<";
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION ">" ( l : std_logic; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN to_integer(l) > r;
|
|
|
END ">";
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "<=" ( l : std_logic; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN to_integer(l) <= r;
|
|
|
END "<=";
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION ">=" ( l : std_logic; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN to_integer(l) >= r;
|
|
|
END ">=";
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
-- Functions for std_logic, integer
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
--pragma synthesis_off
|
|
|
-- arithmetic operations for real and int and int and real
|
|
|
FUNCTION "+" ( l : real; r : integer ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN l + to_real(r);
|
|
|
END;
|
|
|
|
|
|
FUNCTION "-" ( l : real; r : integer ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN l - to_real(r);
|
|
|
END;
|
|
|
|
|
|
FUNCTION "/" ( l : real; r : integer ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN l / to_real(r);
|
|
|
END;
|
|
|
|
|
|
FUNCTION "*" ( l : real; r : integer ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN l * to_real(r);
|
|
|
END ;
|
|
|
|
|
|
|
|
|
FUNCTION "+" ( l : integer; r : real ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN to_real(l) + r;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "-" ( l : integer; r : real ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN to_real(l) - r;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "/" ( l : integer; r : real ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN to_real(l) / l;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "*" ( l : integer; r : real ) RETURN real IS
|
|
|
BEGIN
|
|
|
RETURN to_real(l) * r;
|
|
|
END;
|
|
|
|
|
|
|
|
|
-- end arithmetic operations for real and int and int and real
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "=" ( l : real; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN INTEGER(l) = r;
|
|
|
|
|
|
END "=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "/=" ( l : real; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN INTEGER(l) /= r;
|
|
|
|
|
|
END "/=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<" ( l : real; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN INTEGER(l) < r;
|
|
|
|
|
|
END "<";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">" ( l : real; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN INTEGER(l) > r;
|
|
|
|
|
|
END ">";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<=" ( l : real; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN INTEGER(l) <= r;
|
|
|
|
|
|
END "<=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">=" ( l : real; r : integer ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN INTEGER(l) >= r;
|
|
|
|
|
|
END ">=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "=" ( l : integer; r : real ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l = INTEGER(r);
|
|
|
|
|
|
END "=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "/=" ( l : integer; r : real ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l /= INTEGER(r);
|
|
|
|
|
|
END "/=";
|
|
|
|
|
|
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<" ( l : integer; r : real ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l < INTEGER(r);
|
|
|
|
|
|
END "<";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">" ( l : integer; r : real ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l > INTEGER(r);
|
|
|
|
|
|
END ">";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION "<=" ( l : integer; r : real ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l <= INTEGER(r);
|
|
|
|
|
|
END "<=";
|
|
|
|
|
|
-----------------------------------------------------------------
|
|
|
FUNCTION ">=" ( l : integer; r : real ) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l >= INTEGER(r);
|
|
|
|
|
|
END ">=";
|
|
|
|
|
|
--pragma synthesis_on
|
|
|
-----------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "+" ( l, r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(UNSIGNED(l) + UNSIGNED(r));
|
|
|
|
|
|
end "+";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "-" ( l, r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(UNSIGNED(l) - UNSIGNED(r));
|
|
|
|
|
|
end "-";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "*" ( l, r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(UNSIGNED(l) * UNSIGNED(r));
|
|
|
|
|
|
end "*";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "/" ( l, r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(UNSIGNED(l) / UNSIGNED(r));
|
|
|
|
|
|
end "/";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "REM" ( l, r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(UNSIGNED(l) rem UNSIGNED(r));
|
|
|
|
|
|
end "REM";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "+" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) + r);
|
|
|
|
|
|
end "+";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "-" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) - r);
|
|
|
|
|
|
end "-";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "*" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) * r);
|
|
|
|
|
|
end "*";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "/" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) / r);
|
|
|
|
|
|
end "/";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "REM" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) rem r);
|
|
|
|
|
|
end "REM";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : std_logic_vector; r : integer ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return l & to_stdlogic(r);
|
|
|
|
|
|
end "&";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : std_logic_vector; r : boolean ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return l & to_stdlogic(r);
|
|
|
|
|
|
end "&";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "+" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) + to_integer(r));
|
|
|
|
|
|
end "+";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "-" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) - to_integer(r));
|
|
|
|
|
|
end "-";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "*" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) * to_integer(r));
|
|
|
|
|
|
end "*";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "/" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) / to_integer(r));
|
|
|
|
|
|
end "/";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "REM" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector is
|
|
|
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(SIGNED(l) rem to_integer(r));
|
|
|
|
|
|
end "REM";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "+" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(to_integer(l) + SIGNED(r));
|
|
|
END "+";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "-" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(to_integer(l) - SIGNED(r));
|
|
|
END "-";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "*" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(to_integer(l) * SIGNED(r));
|
|
|
END "*";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "/" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(to_integer(l) / SIGNED(r));
|
|
|
END "/";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "REM" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector is
|
|
|
begin
|
|
|
return STD_LOGIC_VECTOR(to_integer(l) REM SIGNED(r));
|
|
|
END "REM";
|
|
|
-------------------------------------------------------------
|
|
|
-- need logical functions bet. std_logic_vector and std_logic
|
|
|
FUNCTION "and" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l and to_stdlogicvector(r, l'length);
|
|
|
END "and";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l nand to_stdlogicvector(r, l'length);
|
|
|
END "nand";
|
|
|
--------------------------------------------------------------
|
|
|
FUNCTION "or" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l or to_stdlogicvector(r, l'length);
|
|
|
END "or";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l nor to_stdlogicvector(r, l'length);
|
|
|
END "nor";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l xor to_stdlogicvector(r, l'length);
|
|
|
END "xor";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xnor" ( l : std_logic_vector; r : std_logic ) RETURN std_logic_vector IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN NOT(l xor to_stdlogicvector(r, l'length));
|
|
|
END "xnor";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogicvector(l, r'length) and r;
|
|
|
END "and";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogicvector(l, r'length) nand r;
|
|
|
END "nand";
|
|
|
--------------------------------------------------------------
|
|
|
FUNCTION "or" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogicvector(l, r'length) or r;
|
|
|
END "or";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogicvector(l, r'length) nor r;
|
|
|
END "nor";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogicvector(l, r'length) xor r;
|
|
|
END "xor";
|
|
|
--------------------------------------------------------------
|
|
|
FUNCTION "xnor" ( l : std_logic; r : std_logic_vector ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN NOT(to_stdlogicvector(l, r'length) xor r);
|
|
|
END "xnor";
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
-- end logical functions for std_logic_vector and std_logic
|
|
|
------------------------------------------------------------------
|
|
|
-- need arith functions bet std_logic and std_logic
|
|
|
-- used only when the int can be 0 or 1
|
|
|
-- need arithmetic functions bet. std_logic_vector and std_logic
|
|
|
|
|
|
FUNCTION "+" ( l : std_logic; r : std_logic ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
return to_stdlogic(to_integer(l) + to_integer(r));
|
|
|
END "+";
|
|
|
|
|
|
FUNCTION "-" ( l : std_logic; r : std_logic ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
return to_stdlogic(to_integer(l) - to_integer(r));
|
|
|
END "-";
|
|
|
|
|
|
FUNCTION "*" ( l : std_logic; r : std_logic ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
return to_stdlogic(to_integer(l) * to_integer(r));
|
|
|
END "*";
|
|
|
|
|
|
FUNCTION "/" ( l : std_logic; r : std_logic ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
return to_stdlogic(to_integer(l) / to_integer(r));
|
|
|
END "/";
|
|
|
|
|
|
FUNCTION "REM" ( l : std_logic; r : std_logic ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
return to_stdlogic(to_integer(l) REM to_integer(r));
|
|
|
END "REM";
|
|
|
|
|
|
|
|
|
------- Arithmatic operations between std_logic and integer
|
|
|
-- caveat, functions below return integer
|
|
|
|
|
|
FUNCTION "+" ( l : std_logic; r : integer ) RETURN integer IS
|
|
|
BEGIN
|
|
|
return to_integer(l) + r;
|
|
|
END "+";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
|
|
|
FUNCTION "-" ( l : std_logic; r : integer ) RETURN integer IS
|
|
|
BEGIN
|
|
|
return to_integer(l) - r;
|
|
|
END "-";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "*" ( l : std_logic; r : integer ) RETURN integer IS
|
|
|
BEGIN
|
|
|
return to_integer(l) * r;
|
|
|
END "*";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "/" ( l : std_logic; r : integer ) RETURN integer IS
|
|
|
BEGIN
|
|
|
return to_integer(l) / r;
|
|
|
END "/";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "REM" ( l : std_logic; r : integer ) RETURN integer IS
|
|
|
BEGIN
|
|
|
return to_integer(l) REM r;
|
|
|
END "REM";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "+" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
begin
|
|
|
return l + to_integer(r);
|
|
|
END "+";
|
|
|
-------------------------------------------------------
|
|
|
|
|
|
FUNCTION "-" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
begin
|
|
|
return l - to_integer(r);
|
|
|
END "-";
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "*" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
begin
|
|
|
return l * to_integer(r);
|
|
|
END "*";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "/" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
begin
|
|
|
return l / to_integer(r);
|
|
|
END "/";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "REM" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
begin
|
|
|
return l REM to_integer(r);
|
|
|
END "REM";
|
|
|
|
|
|
-------------------------------------------------------
|
|
|
FUNCTION "+" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN to_integer(l + SIGNED(r));
|
|
|
END "+";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "-" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN to_integer(l - SIGNED(r));
|
|
|
END "-";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "*" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN to_integer(l * SIGNED(r));
|
|
|
END "*";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "/" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN to_integer(l / SIGNED(r));
|
|
|
END "/";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "REM" ( l : integer; r : std_logic_vector ) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN to_integer(l REM SIGNED(r));
|
|
|
END "REM";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic; r : integer ) RETURN std_logic IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l and to_stdlogic(r);
|
|
|
END "and";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nand" ( l : std_logic; r : integer ) RETURN std_logic IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l nand to_stdlogic(r);
|
|
|
END "nand";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "or" ( l : std_logic; r : integer ) RETURN std_logic IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l or to_stdlogic(r);
|
|
|
END "or";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nor" ( l : std_logic; r : integer ) RETURN std_logic IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l nor to_stdlogic(r);
|
|
|
END "nor";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "xor" ( l : std_logic; r : integer ) RETURN std_logic IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l xor to_stdlogic(r);
|
|
|
END "xor";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : std_logic; r : integer ) RETURN std_logic_vector IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l & to_stdlogic(r);
|
|
|
END "&";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xnor" ( l : std_logic; r : integer ) RETURN std_logic IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN not(l xor to_stdlogic(r));
|
|
|
END "xnor";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
|
|
|
VARIABLE tmp : integer := 0;
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l and to_integer(r);
|
|
|
|
|
|
END "and";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nand" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
|
|
|
VARIABLE tmp : integer := 0;
|
|
|
BEGIN
|
|
|
RETURN l nand to_integer(r);
|
|
|
|
|
|
END "nand";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "or" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
|
|
|
VARIABLE tmp : integer := 0;
|
|
|
BEGIN
|
|
|
RETURN l or to_integer(r);
|
|
|
|
|
|
END "or";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nor" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
|
|
|
VARIABLE tmp : integer := 0;
|
|
|
BEGIN
|
|
|
RETURN l nor to_integer(r);
|
|
|
|
|
|
END "nor";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "xor" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
|
|
|
VARIABLE tmp : integer := 0;
|
|
|
BEGIN
|
|
|
RETURN l xor to_integer(r);
|
|
|
|
|
|
END "xor";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : integer; r : std_logic ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogic(l) & r;
|
|
|
|
|
|
END "&";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xnor" ( l : integer; r : std_logic ) RETURN integer IS
|
|
|
|
|
|
VARIABLE tmp : integer := 0;
|
|
|
BEGIN
|
|
|
RETURN l xnor to_integer(r);
|
|
|
|
|
|
END "xnor";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : std_logic ; r : boolean ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
RETURN l AND to_stdlogic(r);
|
|
|
END "and";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : std_logic ; r : boolean ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
RETURN l NAND to_stdlogic(r);
|
|
|
END "nand";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "or" ( l : std_logic ; r : boolean ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
RETURN l OR to_stdlogic(r);
|
|
|
END "or";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : std_logic ; r : boolean ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
RETURN l NOR to_stdlogic(r);
|
|
|
END "nor";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : std_logic ; r : boolean ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
RETURN l XOR to_stdlogic(r);
|
|
|
END "xor";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : std_logic; r : boolean ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN l & to_stdlogic(r);
|
|
|
END "&";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xnor" ( l : std_logic ; r : boolean ) RETURN std_logic IS
|
|
|
BEGIN
|
|
|
RETURN NOT(l XOR to_stdlogic(r));
|
|
|
END "xnor";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
FUNCTION "and" ( l : boolean ; r : std_logic ) RETURN boolean IS
|
|
|
|
|
|
VARIABLE tmp : std_logic := 'U';
|
|
|
BEGIN
|
|
|
tmp := to_stdlogic(l) AND r;
|
|
|
RETURN to_boolean(tmp);
|
|
|
END "and";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nand" ( l : boolean ; r : std_logic ) RETURN boolean IS
|
|
|
VARIABLE tmp : std_logic := 'U';
|
|
|
BEGIN
|
|
|
tmp := to_stdlogic(l) NAND r;
|
|
|
RETURN to_boolean(tmp);
|
|
|
END "nand";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "or" ( l : boolean ; r : std_logic ) RETURN boolean IS
|
|
|
VARIABLE tmp : std_logic := 'U';
|
|
|
BEGIN
|
|
|
tmp := to_stdlogic(l) OR r;
|
|
|
RETURN to_boolean(tmp);
|
|
|
END "or";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "nor" ( l : boolean ; r : std_logic ) RETURN boolean IS
|
|
|
VARIABLE tmp : std_logic := 'U';
|
|
|
BEGIN
|
|
|
tmp := to_stdlogic(l) NOR r;
|
|
|
RETURN to_boolean(tmp);
|
|
|
END "nor";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xor" ( l : boolean ; r : std_logic ) RETURN boolean IS
|
|
|
VARIABLE tmp : std_logic := 'U';
|
|
|
BEGIN
|
|
|
tmp := to_stdlogic(l) XOR r;
|
|
|
RETURN to_boolean(tmp);
|
|
|
END "xor";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : boolean ; r : std_logic ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogic(l) & r;
|
|
|
END "&";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "xnor" ( l : boolean ; r : std_logic ) RETURN boolean IS
|
|
|
VARIABLE tmp : std_logic := 'U';
|
|
|
BEGIN
|
|
|
tmp := NOT(to_stdlogic(l) XOR r);
|
|
|
RETURN to_boolean(tmp);
|
|
|
END "xnor";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : integer; r : boolean ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l and to_integer(r);
|
|
|
END "and";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nand" ( l : integer; r : boolean ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l nand to_integer(r);
|
|
|
END "nand";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "or" ( l : integer; r : boolean ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l or to_integer(r);
|
|
|
END "or";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nor" ( l : integer; r : boolean ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l nor to_integer(r);
|
|
|
END "nor";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "xor" ( l : integer; r : boolean ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l xor to_integer(r);
|
|
|
END "xor";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : integer; r : boolean ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogic(l) & to_stdlogic(r);
|
|
|
END "&";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "xnor" ( l : integer; r : boolean ) RETURN integer IS
|
|
|
BEGIN
|
|
|
RETURN l xnor to_integer(r);
|
|
|
END "xnor";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "and" ( l : boolean; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l AND to_boolean(r);
|
|
|
END "and";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nand" ( l : boolean; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l NAND to_boolean(r);
|
|
|
END "nand";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "or" ( l : boolean; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l or to_boolean(r);
|
|
|
END "or";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "nor" ( l : boolean; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l nor to_boolean(r);
|
|
|
END "nor";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "xor" ( l : boolean; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l xor to_boolean(r);
|
|
|
END "xor";
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "&" ( l : boolean; r : integer ) RETURN std_logic_vector IS
|
|
|
BEGIN
|
|
|
RETURN to_stdlogic(l) & to_stdlogic(r);
|
|
|
END "&";
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION "xnor" ( l : boolean; r : integer ) RETURN boolean IS
|
|
|
BEGIN
|
|
|
RETURN l xnor to_boolean(r);
|
|
|
END "xnor";
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
-- Overloaded function for text output
|
|
|
|
|
|
FUNCTION to_bitvector ( a : bit ) RETURN bit_vector IS
|
|
|
VARIABLE s : bit_vector ( 1 TO 1 );
|
|
|
BEGIN
|
|
|
s(1) := a;
|
|
|
RETURN s;
|
|
|
END to_bitvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION to_bitvector ( a : std_ulogic ) RETURN bit_vector IS
|
|
|
VARIABLE s : bit_vector ( 1 TO 1 );
|
|
|
BEGIN
|
|
|
s(1) := to_bit(a);
|
|
|
RETURN s;
|
|
|
END to_bitvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION to_bitvector ( a : integer ) RETURN bit_vector IS
|
|
|
VARIABLE s : bit_vector ( 31 DOWNTO 0 );
|
|
|
BEGIN
|
|
|
s := to_bitvector(STD_LOGIC_VECTOR(to_signed(a, 32)));
|
|
|
RETURN s;
|
|
|
END to_bitvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION to_stdlogicvector(l : integer; size : natural; dir : direction := little_endian) RETURN std_logic_vector IS
|
|
|
|
|
|
BEGIN
|
|
|
IF dir = little_endian THEN
|
|
|
RETURN STD_LOGIC_VECTOR(to_signed(l,size));
|
|
|
ELSE
|
|
|
RETURN STD_LOGIC_VECTOR(to_signed(l,size) ROL size); -- rotate left by size times
|
|
|
END IF;
|
|
|
|
|
|
END to_stdlogicvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogicvector(l : std_logic_vector ) RETURN std_logic_vector IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l;
|
|
|
|
|
|
END to_stdlogicvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogicvector(l : std_logic_vector; size : natural; dir : direction := little_endian )
|
|
|
RETURN std_logic_vector IS
|
|
|
VARIABLE tmp1 : UNSIGNED(l'length-1 downto 0);
|
|
|
VARIABLE tmp2 : UNSIGNED(size-1 downto 0);
|
|
|
BEGIN
|
|
|
IF dir = little_endian THEN
|
|
|
RETURN STD_LOGIC_VECTOR(resize(UNSIGNED(l),size));
|
|
|
ELSE
|
|
|
-- using function ROTATE_LEFT to make it both 87 and 93 compliant
|
|
|
-- first get eqiv. in descending range
|
|
|
-- second resize
|
|
|
-- finally, rotate and return
|
|
|
|
|
|
tmp1 := ROTATE_LEFT(UNSIGNED(l),l'length);
|
|
|
tmp2 := resize(UNSIGNED(tmp1),size);
|
|
|
RETURN STD_LOGIC_VECTOR(ROTATE_LEFT(UNSIGNED(tmp2),size));
|
|
|
END IF;
|
|
|
|
|
|
END to_stdlogicvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogicvector(l : std_logic; size : natural) RETURN std_logic_vector IS
|
|
|
|
|
|
VARIABLE tmp : std_logic_vector(size-1 DOWNTO 0) := (OTHERS => '0');
|
|
|
BEGIN
|
|
|
tmp(0) := l;
|
|
|
RETURN tmp;
|
|
|
END to_stdlogicvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogicvector(l : boolean; size : natural) RETURN std_logic_vector IS
|
|
|
|
|
|
VARIABLE tmp : std_logic_vector(size-1 DOWNTO 0) := (OTHERS => '0');
|
|
|
BEGIN
|
|
|
tmp(0) := to_stdlogic(l);
|
|
|
RETURN tmp;
|
|
|
END to_stdlogicvector;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_integer(l : integer) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l;
|
|
|
END to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_integer(l : std_logic) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
IF ( l = '0') THEN
|
|
|
RETURN 0;
|
|
|
ELSIF (l = '1') THEN
|
|
|
RETURN 1;
|
|
|
ELSE
|
|
|
ASSERT FALSE REPORT("Std_logic values other than '0' and '1' cannot be converted to integer type")
|
|
|
SEVERITY WARNING;
|
|
|
RETURN 0;
|
|
|
END IF;
|
|
|
END to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_integer(l : boolean) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
IF ( l = TRUE) THEN
|
|
|
RETURN 0;
|
|
|
ELSE
|
|
|
RETURN 1;
|
|
|
END IF;
|
|
|
END to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogic(l : integer) RETURN std_logic IS
|
|
|
|
|
|
VARIABLE ret_val : std_logic := '0';
|
|
|
BEGIN
|
|
|
IF l = 0 THEN
|
|
|
ret_val := '0';
|
|
|
ELSIF l = 1 THEN
|
|
|
ret_val := '1';
|
|
|
ELSE
|
|
|
ASSERT FALSE REPORT("Integers other than 0 and 1 cannot be converted to std_logic type")
|
|
|
SEVERITY WARNING;
|
|
|
END IF;
|
|
|
RETURN ret_val;
|
|
|
END to_stdlogic;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogic(l : Boolean) RETURN std_logic IS
|
|
|
|
|
|
VARIABLE ret_val : std_logic := '0';
|
|
|
BEGIN
|
|
|
IF l = FALSE THEN
|
|
|
ret_val := '0';
|
|
|
ELSE
|
|
|
ret_val := '1';
|
|
|
END IF;
|
|
|
|
|
|
RETURN ret_val;
|
|
|
END to_stdlogic;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogic(l : std_logic) RETURN std_logic IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l;
|
|
|
END to_stdlogic;
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_stdlogic(l : std_logic_vector) RETURN std_logic IS
|
|
|
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l(l'LOW);
|
|
|
END to_stdlogic;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION to_integer(l : std_logic_vector; dir : direction := little_endian) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
IF dir = little_endian THEN
|
|
|
-- RETURN to_integer(SIGNED(l));
|
|
|
RETURN to_integer(UNSIGNED(l));
|
|
|
ELSE
|
|
|
-- RETURN to_integer(SIGNED(l) ROR l'LENGTH);
|
|
|
RETURN to_integer(UNSIGNED(l) ROR l'LENGTH);
|
|
|
END IF;
|
|
|
|
|
|
END to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION v2v_to_integer(l : std_logic_vector; dir : direction := little_endian) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
IF dir = little_endian THEN
|
|
|
-- RETURN to_integer(SIGNED(l));
|
|
|
RETURN to_integer(UNSIGNED(l));
|
|
|
ELSE
|
|
|
--NOTE, since ROR is not available in 87, we will use ROTATE_RIGHT
|
|
|
RETURN to_integer(ROTATE_RIGHT(UNSIGNED(l) , l'LENGTH));
|
|
|
-- RETURN to_integer(UNSIGNED(l) ROR l'LENGTH);
|
|
|
END IF;
|
|
|
|
|
|
END v2v_to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION v2v_to_integer(l : integer) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l;
|
|
|
END v2v_to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION v2v_to_integer(l : std_logic) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
IF ( l = '0') THEN
|
|
|
RETURN 0;
|
|
|
ELSIF (l = '1') THEN
|
|
|
RETURN 1;
|
|
|
ELSE
|
|
|
ASSERT FALSE REPORT("Std_logic values other than '0' and '1' cannot be converted to integer type")
|
|
|
SEVERITY WARNING;
|
|
|
RETURN 0;
|
|
|
END IF;
|
|
|
END v2v_to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION v2v_to_integer(l : boolean) RETURN integer IS
|
|
|
|
|
|
BEGIN
|
|
|
IF ( l = TRUE) THEN
|
|
|
RETURN 0;
|
|
|
ELSE
|
|
|
RETURN 1;
|
|
|
END IF;
|
|
|
END v2v_to_integer;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
--pragma synthesis_off
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_real(l : integer) RETURN real IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN REAL(l);
|
|
|
END to_real;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_real(l : real) RETURN real IS
|
|
|
|
|
|
BEGIN
|
|
|
RETURN l;
|
|
|
END to_real;
|
|
|
--pragma synthesis_on
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_boolean(l : std_logic) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
IF ( l = '0' ) THEN
|
|
|
RETURN FALSE;
|
|
|
ELSIF (l = '1') THEN
|
|
|
RETURN TRUE;
|
|
|
ELSE
|
|
|
ASSERT FALSE REPORT("Std_logic values other than '0' and '1' cannot be converted to boolean type")
|
|
|
SEVERITY WARNING;
|
|
|
RETURN FALSE;
|
|
|
END IF;
|
|
|
|
|
|
END to_boolean;
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_boolean(l : std_logic_vector) RETURN boolean IS
|
|
|
|
|
|
VARIABLE tmp : std_logic_vector(l'RANGE);
|
|
|
BEGIN
|
|
|
tmp := (OTHERS=>'1');
|
|
|
if to_integer(l AND tmp) /= 0 THEN
|
|
|
RETURN TRUE;
|
|
|
END IF;
|
|
|
RETURN FALSE;
|
|
|
|
|
|
END to_boolean;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_boolean(l : boolean) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
IF ( l) THEN
|
|
|
RETURN TRUE;
|
|
|
END IF;
|
|
|
RETURN FALSE;
|
|
|
|
|
|
END to_boolean;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
FUNCTION to_boolean(l : integer) RETURN boolean IS
|
|
|
|
|
|
BEGIN
|
|
|
IF ( l = 0 ) THEN
|
|
|
RETURN FALSE;
|
|
|
ELSE
|
|
|
RETURN TRUE;
|
|
|
END IF;
|
|
|
|
|
|
END to_boolean;
|
|
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
FUNCTION "sll" ( l : std_logic_vector; r : integer) RETURN std_logic_vector IS
|
|
|
VARIABLE v : std_logic_vector(l'RANGE) := (others=>'0');
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "srl"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i) := l(i+r);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i) := l(i-r);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "sll" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector IS
|
|
|
VARIABLE v : std_ulogic_vector(l'RANGE) := (others=>'0');
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "srl"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i) := l(i+r);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i) := l(i-r);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "srl" ( l : std_logic_vector; r : integer) RETURN std_logic_vector IS
|
|
|
VARIABLE v : std_logic_vector(l'RANGE) := (others=>'0');
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "sll"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i+r) := l(i);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i-r) := l(i);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "srl" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector IS
|
|
|
VARIABLE v : std_ulogic_vector(l'RANGE) := (others=>'0');
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "sll"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i+r) := l(i);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i-r) := l(i);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "sla" ( l : std_logic_vector; r : integer) RETURN std_logic_vector IS
|
|
|
VARIABLE v : std_logic_vector(l'RANGE) := (others=>l(l'RIGHT));
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "sra"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i) := l(i+r);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i) := l(i-r);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "sla" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector IS
|
|
|
VARIABLE v : std_ulogic_vector(l'RANGE) := (others=>l(l'RIGHT));
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "sra"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i) := l(i+r);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i) := l(i-r);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "sra" ( l : std_logic_vector; r : integer) RETURN std_logic_vector IS
|
|
|
VARIABLE v : std_logic_vector(l'RANGE) := (others=>l(l'RIGHT));
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "sla"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i+r) := l(i);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i-r) := l(i);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "sra" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector IS
|
|
|
VARIABLE v : std_ulogic_vector(l'RANGE) := (others=>l(l'RIGHT));
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "sla"(l,-r);
|
|
|
ELSIF r<l'LENGTH THEN
|
|
|
IF l'LEFT<l'RIGHT THEN
|
|
|
FOR i IN l'LEFT TO (l'RIGHT-r) LOOP
|
|
|
v(i+r) := l(i);
|
|
|
END LOOP;
|
|
|
ELSE
|
|
|
FOR i IN l'LEFT DOWNTO (l'RIGHT+r) LOOP
|
|
|
v(i-r) := l(i);
|
|
|
END LOOP;
|
|
|
END IF;
|
|
|
END IF;
|
|
|
RETURN v;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "rol" ( l : std_logic_vector; r : integer) RETURN std_logic_vector IS
|
|
|
VARIABLE v : std_logic_vector(0 TO l'LENGTH*2-1);
|
|
|
VARIABLE v1 : std_logic_vector(l'RANGE);
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "ror"(l,-r);
|
|
|
ELSE
|
|
|
v(0 TO l'LENGTH-1) := l;
|
|
|
v(l'LENGTH TO v'LENGTH-1) := l;
|
|
|
v1 := v(r TO r+l'LENGTH-1);
|
|
|
RETURN v1;
|
|
|
END IF;
|
|
|
END;
|
|
|
FUNCTION "rol" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector IS
|
|
|
VARIABLE v : std_ulogic_vector(0 TO l'LENGTH*2-1);
|
|
|
VARIABLE v1 : std_ulogic_vector(l'RANGE);
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "ror"(l,-r);
|
|
|
ELSE
|
|
|
v(0 TO l'LENGTH-1) := l;
|
|
|
v(l'LENGTH TO v'LENGTH-1) := l;
|
|
|
v1 := v(r TO r+l'LENGTH-1);
|
|
|
RETURN v1;
|
|
|
END IF;
|
|
|
END;
|
|
|
|
|
|
FUNCTION "ror" ( l : std_logic_vector; r : integer) RETURN std_logic_vector IS
|
|
|
VARIABLE v : std_logic_vector(0 TO l'LENGTH*2-1);
|
|
|
VARIABLE v1 : std_logic_vector(l'RANGE);
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "rol"(l,-r);
|
|
|
ELSE
|
|
|
v(0 TO l'LENGTH-1) := l;
|
|
|
v(l'LENGTH TO v'LENGTH-1) := l;
|
|
|
v1 := v(l'LENGTH-r TO v'LENGTH-r-1);
|
|
|
RETURN v1;
|
|
|
END IF;
|
|
|
END;
|
|
|
FUNCTION "ror" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector IS
|
|
|
VARIABLE v : std_ulogic_vector(0 TO l'LENGTH*2-1);
|
|
|
VARIABLE v1 : std_ulogic_vector(l'RANGE);
|
|
|
BEGIN
|
|
|
IF r=0 THEN
|
|
|
RETURN l;
|
|
|
ELSIF r<0 THEN
|
|
|
RETURN "rol"(l,-r);
|
|
|
ELSE
|
|
|
v(0 TO l'LENGTH-1) := l;
|
|
|
v(l'LENGTH TO v'LENGTH-1) := l;
|
|
|
v1 := v(l'LENGTH-r TO v'LENGTH-r-1);
|
|
|
RETURN v1;
|
|
|
END IF;
|
|
|
END;
|
|
|
|
|
|
FUNCTION to_stdlogicvector(hex : STRING) RETURN std_logic_vector IS
|
|
|
VARIABLE result : std_logic_vector(4 * hex'LENGTH DOWNTO 1);
|
|
|
BEGIN
|
|
|
-- Note: The hex parameter can have a range with hex'LOW > 1.
|
|
|
-- For these cases, variable index i in assignments in the FOR loop is normalized
|
|
|
-- to 1 by subtracting hex'LOW ** sas 2/13/96 **
|
|
|
FOR i in hex'RANGE LOOP
|
|
|
CASE hex(i) IS
|
|
|
WHEN '0' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"0";
|
|
|
WHEN '1' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"1";
|
|
|
WHEN '2' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"2";
|
|
|
WHEN '3' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"3";
|
|
|
WHEN '4' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"4";
|
|
|
WHEN '5' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"5";
|
|
|
WHEN '6' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"6";
|
|
|
WHEN '7' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"7";
|
|
|
WHEN '8' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"8";
|
|
|
WHEN '9' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"9";
|
|
|
WHEN 'A' | 'a' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"A";
|
|
|
WHEN 'B' | 'b' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"B";
|
|
|
WHEN 'C' | 'c' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"C";
|
|
|
WHEN 'D' | 'd' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"D";
|
|
|
WHEN 'E' | 'e' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"E";
|
|
|
WHEN 'F' | 'f' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := x"F";
|
|
|
WHEN 'X' | 'x' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := "XXXX";
|
|
|
WHEN 'Z' | 'z' =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := "ZZZZ";
|
|
|
WHEN OTHERS =>
|
|
|
result(4*(hex'LENGTH - (i-hex'LOW)) DOWNTO 4*(hex'LENGTH - (i-hex'LOW)) -3) := "XXXX";
|
|
|
END CASE;
|
|
|
END LOOP;
|
|
|
RETURN result;
|
|
|
END to_stdlogicvector;
|
|
|
|
|
|
end FUNCTIONS;
|
|
|
|
|
|
|
|
|
|