functions.vhd
3201 lines
| 95.5 KiB
| text/x-vhdl
|
VhdlLexer
martin
|
r100 | ----------------------------------------------------------- | ||
-- 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; | ||||