git-svn-id: http://moon:8086/svn/vhdl/trunk@1073 cc03376c-175c-47c8-b038-4cd826a8556b
2089 lines
78 KiB
VHDL
2089 lines
78 KiB
VHDL
-- --------------------------------------------------------------------
|
|
--
|
|
-- Title : STD_LOGIC_ARITH_EX arithmetic support for STD_ULOGIC/
|
|
-- : STD_LOGIC_VECTOR data type
|
|
-- Library : This package shall be compiled into a logical library
|
|
-- : named IEEE.
|
|
-- Purpose : To support unsigned arithmetic operations such as
|
|
-- : addition, subtraction, multiplication etc. for std_ulogic
|
|
-- : and std_logic_vector data types. Besides it supports
|
|
-- : functions and operators for Conditional operations,
|
|
-- : shift operations, relational operation between integer
|
|
-- : and std_logic_vector types, aligning size between operands
|
|
-- : of different sizes, type conversion.
|
|
-- : It also supports a set of arithemtic, conversion, and
|
|
-- : comparison functions for SIGNED, UNSIGNED, SMALL_INT,
|
|
-- : INTEGER, STD_ULOGIC, STD_LOGIC, and STD_LOGIC_VECTOR.
|
|
-- :
|
|
-- Note : No declarations or definitions shall be included in,
|
|
-- : or excluded from this package.
|
|
-- :
|
|
-- : Modification History: TH, 24th Jan., 1994
|
|
-- : Following functions are overloaded for STD_ULOGIC_VECTOR
|
|
-- : type: "+", "-", "*", "cond_op", "<", ">", "<=", ">=", "=",
|
|
-- : "/=", sh_left, sh_right, align_size and "to_integer"
|
|
-- : New functions added are:
|
|
-- : To_StdUlogicVector (oper: INTEGER; length: NATURAL)
|
|
-- : return STD_ULOGIC_VECTOR
|
|
-- : "+"(op1: STD_ULOGIC; op2: STD_ULOGIC) return STD_ULOGIC;
|
|
-- : "-"(op1: STD_ULOGIC; op2: STD_ULOGIC) return STD_ULOGIC;
|
|
--
|
|
-- : Name changes from STD_LOGIC_ARITH to STD_LOGIC_ARITH
|
|
-- : operator "/" added.
|
|
-- : Vinaya: 13/9/94.
|
|
--------------------------------------------------------------------------
|
|
|
|
library IEEE;
|
|
use IEEE.std_logic_1164.all;
|
|
|
|
|
|
package STD_LOGIC_ARITH is
|
|
|
|
-- ADD/SUBTRACT OPERATORS
|
|
|
|
function "+"(op1, op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "+"(op1: STD_LOGIC_VECTOR; op2: STD_ULOGIC) return STD_LOGIC_VECTOR;
|
|
function "+"(op1: STD_ULOGIC; op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "+"(op1: INTEGER; op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "+"(op1: STD_LOGIC_VECTOR; op2: INTEGER) return STD_LOGIC_VECTOR;
|
|
|
|
function "+"(op1, op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "+"(op1: STD_ULOGIC_VECTOR; op2: STD_ULOGIC) return STD_ULOGIC_VECTOR;
|
|
function "+"(op1: STD_ULOGIC; op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "+"(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "+"(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return STD_ULOGIC_VECTOR;
|
|
function "+"(op1, op2 : STD_ULOGIC) return STD_ULOGIC;
|
|
|
|
|
|
function "-"(op1, op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "-"(op1: STD_LOGIC_VECTOR; op2: STD_ULOGIC) return STD_LOGIC_VECTOR;
|
|
function "-"(op1: STD_ULOGIC; op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "-"(op1: INTEGER; op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "-"(op1: STD_LOGIC_VECTOR; op2: INTEGER) return STD_LOGIC_VECTOR;
|
|
|
|
function "-"(op1, op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "-"(op1: STD_ULOGIC_VECTOR; op2: STD_ULOGIC) return STD_ULOGIC_VECTOR;
|
|
function "-"(op1: STD_ULOGIC; op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "-"(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "-"(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return STD_ULOGIC_VECTOR;
|
|
function "-"(op1, op2 : STD_ULOGIC) return STD_ULOGIC;
|
|
|
|
-- UNARY OPERATORS
|
|
|
|
function "+" (op1: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "+" (op1: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
|
|
-- MULTIPLYING OPERATORS
|
|
|
|
function "*" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "*" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "*" (op1: STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR;
|
|
function "*" (op1, op2 : STD_ULOGIC) return STD_ULOGIC;
|
|
|
|
function "*" (op1, op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "*" (op1: STD_ULOGIC; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function "*" (op1: STD_ULOGIC_VECTOR; op2 : STD_ULOGIC) return STD_ULOGIC_VECTOR;
|
|
|
|
-- DIVISION OPERATORS
|
|
-- The division operators are only for internal use
|
|
-- It is not advisible to use them in design.
|
|
|
|
function "/" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
function "/" (op1: STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR;
|
|
function "/" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_ULOGIC;
|
|
function "/" (op1, op2 : STD_ULOGIC) return STD_ULOGIC;
|
|
|
|
|
|
-- CONDITIONAL FUNCTIONS
|
|
|
|
function cond_op (cond : boolean; left_val, right_val: STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR;
|
|
|
|
function cond_op (cond : boolean; left_val, right_val: STD_ULOGIC)
|
|
return STD_ULOGIC;
|
|
|
|
function cond_op (cond : boolean; left_val, right_val: STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR;
|
|
|
|
-- RELATIONAL OPERATORS
|
|
|
|
function "<"(op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN;
|
|
function "<"(op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function "<="(op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN;
|
|
function "<="(op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function ">"(op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN;
|
|
function ">"(op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function ">="(op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN;
|
|
function ">="(op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function "="(op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN;
|
|
function "="(op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function "/="(op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN;
|
|
function "/="(op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
|
|
function "<"(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
function "<"(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function "<="(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
function "<="(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function ">"(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
function ">"(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function ">="(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
function ">="(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function "="(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
function "="(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
function "/="(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN;
|
|
function "/="(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN;
|
|
|
|
-- SHIFT OPERATORS
|
|
|
|
function sh_left(op1: STD_LOGIC_VECTOR; op2: NATURAL) return STD_LOGIC_VECTOR;
|
|
|
|
function sh_right(op1: STD_LOGIC_VECTOR; op2: NATURAL) return STD_LOGIC_VECTOR;
|
|
|
|
function sh_left(op1: STD_ULOGIC_VECTOR; op2: NATURAL) return STD_ULOGIC_VECTOR;
|
|
|
|
function sh_right(op1: STD_ULOGIC_VECTOR; op2: NATURAL) return STD_ULOGIC_VECTOR;
|
|
|
|
|
|
-- FUNCTIONS TO ALLOW ASSIGNMENTS OF STD_LOGIC_VECTOR OF UNEQUAL SIZES
|
|
|
|
|
|
function align_size (oper : STD_LOGIC_VECTOR; size : NATURAL) return STD_LOGIC_VECTOR;
|
|
function align_size (oper : STD_ULOGIC; size : NATURAL) return STD_LOGIC_VECTOR;
|
|
|
|
function align_size (oper : STD_ULOGIC_VECTOR; size : NATURAL) return STD_ULOGIC_VECTOR;
|
|
function align_size (oper : STD_ULOGIC; size : NATURAL) return STD_ULOGIC_VECTOR;
|
|
|
|
-- CONVERSION TO INTEGER FROM STD_LOGIC AND STD_LOGIC_VECTOR
|
|
|
|
function to_integer (oper : STD_LOGIC_VECTOR) return INTEGER;
|
|
function to_integer (oper: STD_ULOGIC) return INTEGER;
|
|
function to_integer (oper : STD_ULOGIC_VECTOR) return INTEGER;
|
|
|
|
|
|
-- CONVERSION TO STD_LOGIC_VECTOR FROM INTEGER
|
|
|
|
function To_StdLogicVector (oper: INTEGER; length: NATURAL) return STD_LOGIC_VECTOR;
|
|
function To_StdUlogicVector (oper: INTEGER; length: NATURAL) return STD_ULOGIC_VECTOR;
|
|
|
|
-- UTILITY FUNCTIONS
|
|
|
|
function drive (V: STD_LOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
function drive (V: STD_ULOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
|
|
function Sense (V: STD_ULOGIC; vZ, vU, vDC: STD_ULOGIC) return STD_ULOGIC;
|
|
function Sense (V: STD_ULOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
|
return STD_ULOGIC_VECTOR;
|
|
function Sense (V: STD_LOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
|
return STD_ULOGIC_VECTOR;
|
|
|
|
-- CONVERSION TABLE FOR TO_INTEGER
|
|
|
|
type tbl_type is array (STD_ULOGIC) of STD_ULOGIC;
|
|
constant tbl_BINARY : tbl_type :=
|
|
('X', 'X', '0', '1', 'X', 'X', '0', '1', 'X');
|
|
|
|
end STD_LOGIC_ARITH;
|
|
|
|
|
|
package body STD_LOGIC_ARITH is
|
|
|
|
---- IMPLEMENTATTION
|
|
|
|
-- Functions for max size
|
|
|
|
function max (op1,op2 : INTEGER) return INTEGER;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- ALIGN_SIZE (oper : STD_ULOGIC; size : NATURAL) return STD_LOGIC_VECTOR
|
|
-- INPUT : a std_logic value to be place in a vector and the designated
|
|
-- size of the result
|
|
-- OUTPUT: a vector of the specified size with the input value
|
|
-- truncated or aligned and padded as needed.
|
|
|
|
function align_size (oper : STD_ULOGIC; size : NATURAL) return STD_LOGIC_VECTOR is
|
|
|
|
variable outv : STD_LOGIC_VECTOR(size-1 downto 0)
|
|
:= (others => '0');
|
|
begin
|
|
outv(outv'RIGHT) := oper;
|
|
return (outv);
|
|
end align_size;
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
--- FUNCTION :
|
|
-- ALIGN_SIZE (oper : STD_LOGIC_VECTOR; size : NATURAL) return STD_LOGIC_VECTOR
|
|
-- INPUT : a vector to be aligned and the designated size of the result
|
|
-- OUTPUT: a vector of the specified size with the input value
|
|
-- truncated or aligned and padded as needed.
|
|
function align_size (oper : STD_LOGIC_VECTOR; size : NATURAL)
|
|
return STD_LOGIC_VECTOR is
|
|
variable out_mvlv : STD_LOGIC_VECTOR(size -1 downto 0);
|
|
variable temp_oper : STD_LOGIC_VECTOR(oper'LENGTH -1 downto 0) := oper;
|
|
|
|
begin
|
|
|
|
-- Truncate left, right justify, pad with zeros
|
|
|
|
if oper'length > size then -- Truncate left
|
|
out_mvlv := temp_oper(size -1 downto 0);
|
|
else
|
|
out_mvlv := (others => '0');
|
|
out_mvlv(oper'LENGTH - 1 downto 0) := oper ;
|
|
end if;
|
|
return (out_mvlv);
|
|
end align_size;
|
|
|
|
-------------------------------------------------------------------------------
|
|
--- FUNCTION :
|
|
-- ALIGN_SIZE (oper : STD_ULOGIC_VECTOR; size : NATURAL) return STD_ULOGIC_VECTOR
|
|
-- INPUT : a vector to be aligned and the designated size of the result
|
|
-- OUTPUT: a vector of the specified size with the input value
|
|
-- truncated or aligned and padded as needed.
|
|
function align_size (oper : STD_ULOGIC_VECTOR; size : NATURAL)
|
|
return STD_ULOGIC_VECTOR is
|
|
variable out_mvlv : STD_ULOGIC_VECTOR(size -1 downto 0);
|
|
variable temp_oper : STD_ULOGIC_VECTOR(oper'LENGTH -1 downto 0) := oper;
|
|
|
|
begin
|
|
|
|
-- Truncate left, right justify, pad with zeros
|
|
|
|
if oper'length > size then -- Truncate left
|
|
out_mvlv := temp_oper(size -1 downto 0);
|
|
else
|
|
out_mvlv := (others => '0');
|
|
out_mvlv(oper'LENGTH - 1 downto 0) := oper ;
|
|
end if;
|
|
return (out_mvlv);
|
|
end align_size;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- ALIGN_SIZE (oper : STD_ULOGIC; size : NATURAL) return STD_ULOGIC_VECTOR
|
|
-- INPUT : a std_logic value to be place in a vector and the designated
|
|
-- size of the result
|
|
-- OUTPUT: a vector of the specified size with the input value
|
|
-- truncated or aligned and padded as needed.
|
|
|
|
function align_size (oper : STD_ULOGIC; size : NATURAL) return STD_ULOGIC_VECTOR is
|
|
|
|
variable outv : STD_ULOGIC_VECTOR(size-1 downto 0)
|
|
:= (others => '0');
|
|
begin
|
|
outv(outv'RIGHT) := oper;
|
|
return (outv);
|
|
end align_size;
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- the input arrays to a given function are of different sizes.
|
|
|
|
function max (op1, op2 : INTEGER) return INTEGER is
|
|
begin
|
|
if op1 > op2 then
|
|
return op1;
|
|
else
|
|
return op2;
|
|
end if;
|
|
end max;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- TO_STDLOGICVECTOR (oper : INTEGER; length : NATURAL) return STD_LOGIC_VECTOR
|
|
-- INPUT : An integer value
|
|
-- OUTPUT: An STD_LOGIC_VECTOR of size LENGTH representing that integer
|
|
-- value. If the length is not large enough, the value will
|
|
-- be truncated.
|
|
--------------------------------------------------------------------------------
|
|
function To_StdLogicVector (oper: INTEGER; length: NATURAL) return STD_LOGIC_VECTOR is
|
|
variable temp : INTEGER := oper;
|
|
variable temp_result : STD_LOGIC_VECTOR (LENGTH -1 downto 0) := (others => '0');
|
|
begin
|
|
|
|
-- TH, 23rd May,94: PCR#521, put max neg integer check within translate on_off
|
|
|
|
-- synergy translate_off
|
|
|
|
if (oper = INTEGER'LEFT) then -- Max negative integer
|
|
temp_result(0) := '1';
|
|
if (length > 31) then
|
|
temp_result(LENGTH -1 downto 31) := (others => '1');
|
|
end if;
|
|
return temp_result;
|
|
end if;
|
|
|
|
-- synergy translate_on
|
|
|
|
for i in 0 to LENGTH - 1 loop
|
|
if (temp mod 2) = 1 then
|
|
temp_result(i) := '1';
|
|
else
|
|
temp_result(i) := '0';
|
|
end if;
|
|
exit when temp = 0;
|
|
if temp < 0 then
|
|
temp := (temp - 1) / 2;
|
|
else
|
|
temp := temp / 2;
|
|
end if;
|
|
end loop;
|
|
return temp_result;
|
|
end To_StdLogicVector;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- TO_STDULOGICVECTOR (oper : INTEGER; length : NATURAL) return STD_ULOGIC_VECTOR
|
|
-- INPUT : An integer value
|
|
-- OUTPUT: An STD_ULOGIC_VECTOR of size LENGTH representing that integer
|
|
-- value. If the length is not large enough, the value will
|
|
-- be truncated.
|
|
--------------------------------------------------------------------------------
|
|
function To_StdULogicVector (oper: INTEGER; length: NATURAL) return STD_ULOGIC_VECTOR is
|
|
variable temp : INTEGER := oper;
|
|
variable temp_result : STD_ULOGIC_VECTOR (LENGTH -1 downto 0) := (others => '0');
|
|
begin
|
|
|
|
-- TH, 23rd May,94: PCR#521, put max neg integer check within translate on_off
|
|
|
|
-- synergy translate_off
|
|
|
|
if (oper = INTEGER'LEFT) then -- Max negative integer
|
|
temp_result(0) := '1';
|
|
if (length > 31) then
|
|
temp_result(LENGTH -1 downto 31) := (others => '1');
|
|
end if;
|
|
return temp_result;
|
|
end if;
|
|
|
|
-- synergy translate_on
|
|
|
|
for i in 0 to LENGTH - 1 loop
|
|
if (temp mod 2) = 1 then
|
|
temp_result(i) := '1';
|
|
else
|
|
temp_result(i) := '0';
|
|
end if;
|
|
exit when temp = 0;
|
|
if temp < 0 then
|
|
temp := (temp - 1) / 2;
|
|
else
|
|
temp := temp / 2;
|
|
end if;
|
|
end loop;
|
|
return temp_result;
|
|
end To_StdULogicVector;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "+" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_LOGIC_VECTOR
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
-- It uses table lookup to get sum and carry.
|
|
-- Note: return size is max of the operands size
|
|
|
|
function "+" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size1: INTEGER := op1'LENGTH;
|
|
constant size2: INTEGER := op2'LENGTH;
|
|
constant size_op: INTEGER := max(size1, size2);
|
|
-- size_op is the width of the larger operand
|
|
variable loop_cnt : INTEGER := size_op - 1;
|
|
variable oper1, oper2 : STD_LOGIC_VECTOR(loop_cnt downto 0);
|
|
variable result : STD_LOGIC_VECTOR (loop_cnt downto 0)
|
|
:= (others => 'X');
|
|
-- size of result is size_op
|
|
variable lt, rt : std_ulogic;
|
|
variable carry : std_ulogic := '0';
|
|
|
|
begin
|
|
if not (Is_X(op1) or Is_X(op2)) then
|
|
if (size1 < size_op) then
|
|
oper1 := align_size(op1, size_op); -- Make both the
|
|
else
|
|
oper1 := op1;
|
|
end if;
|
|
if (size2 < size_op) then
|
|
oper2 := align_size(op2, size_op); -- operands of
|
|
else -- same size
|
|
oper2 := op2;
|
|
end if;
|
|
|
|
for I in 0 to loop_cnt loop
|
|
lt := oper1(I);
|
|
rt := oper2(I);
|
|
result(I) := lt xor rt xor carry; -- sum
|
|
carry := (lt and rt) or (lt and carry) or (rt and carry); -- carry
|
|
end loop;
|
|
end if;
|
|
return (result);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC/STD_LOGIC_VECTOR
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
--
|
|
-- Note: return size is max of the operands size
|
|
|
|
function "+" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op2'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper1 : STD_LOGIC_VECTOR (size_op - 1 downto 0);
|
|
-- alligned operand to be kept in oper1
|
|
|
|
begin
|
|
oper1 := align_size(op1, size_op);
|
|
return (oper1 + op2);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_LOGIC_VECTOR/STD_ULOGIC
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_ULOGIC vector
|
|
--
|
|
-- Note: return size is max of the operands size
|
|
|
|
function "+" (op1: STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op1'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper2 : STD_LOGIC_VECTOR (size_op - 1 downto 0);
|
|
-- alligned operand to be kept in oper1
|
|
|
|
begin
|
|
oper2 := align_size(op2, size_op);
|
|
return (op1 + oper2);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: INTEGER; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type INTEGER/STD_LOGIC_VECTOR
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
--
|
|
-- Note : Return size is SIZE of op2
|
|
|
|
function "+"(op1: INTEGER; op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op2'length;
|
|
variable result : STD_LOGIC_VECTOR(size_op - 1 downto 0);
|
|
-- retuen size is size of op2
|
|
begin
|
|
result := To_StdLogicVector(op1, size_op) + op2;
|
|
return(result);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: STD_LOGIC_VECTOR; op2 : INTEGER) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_LOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
--
|
|
-- Note : Return size is SIZE of op1
|
|
|
|
function "+"(op1: STD_LOGIC_VECTOR; op2: INTEGER) return STD_LOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op1'length;
|
|
variable result: STD_LOGIC_VECTOR(size_op - 1 downto 0);
|
|
|
|
begin
|
|
result := op1 + To_StdLogicVector(op2, size_op);
|
|
return(result);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "+" (op1, op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
-- It uses table lookup to get sum and carry.
|
|
-- Note: return size is max of the operands size
|
|
|
|
function "+" (op1, op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size1: INTEGER := op1'LENGTH;
|
|
constant size2: INTEGER := op2'LENGTH;
|
|
constant size_op: INTEGER := max(size1, size2);
|
|
-- size_op is the width of the larger operand
|
|
variable loop_cnt : INTEGER := size_op - 1;
|
|
variable oper1, oper2 : STD_ULOGIC_VECTOR(loop_cnt downto 0);
|
|
variable result : STD_ULOGIC_VECTOR (loop_cnt downto 0)
|
|
:= (others => 'X');
|
|
-- size of result is size_op
|
|
variable lt, rt : std_ulogic;
|
|
variable carry : std_ulogic := '0';
|
|
|
|
begin
|
|
if not (Is_X(op1) or Is_X(op2)) then
|
|
if (size1 < size_op) then
|
|
oper1 := align_size(op1, size_op); -- Make both the
|
|
else
|
|
oper1 := op1;
|
|
end if;
|
|
if (size2 < size_op) then
|
|
oper2 := align_size(op2, size_op); -- operands of
|
|
else -- same size
|
|
oper2 := op2;
|
|
end if;
|
|
|
|
for I in 0 to loop_cnt loop
|
|
lt := oper1(I);
|
|
rt := oper2(I);
|
|
result(I) := lt xor rt xor carry; -- sum
|
|
carry := (lt and rt) or (lt and carry) or (rt and carry); -- carry
|
|
end loop;
|
|
end if;
|
|
return (result);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: STD_ULOGIC; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
--
|
|
-- Note: return size is max of the operands size
|
|
|
|
function "+" (op1: STD_ULOGIC; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op2'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper1 : STD_ULOGIC_VECTOR (size_op - 1 downto 0);
|
|
-- alligned operand to be kept in oper1
|
|
|
|
begin
|
|
oper1 := align_size(op1, size_op);
|
|
return (oper1 + op2);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: STD_ULOGIC_VECTOR; op2 : STD_ULOGIC) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC_VECTOR/STD_ULOGIC
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_ULOGIC vector
|
|
--
|
|
-- Note: return size is max of the operands size
|
|
|
|
function "+" (op1: STD_ULOGIC_VECTOR; op2 : STD_ULOGIC) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op1'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper2 : STD_ULOGIC_VECTOR (size_op - 1 downto 0);
|
|
-- alligned operand to be kept in oper1
|
|
|
|
begin
|
|
oper2 := align_size(op2, size_op);
|
|
return (op1 + oper2);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: INTEGER; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type INTEGER/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
--
|
|
-- Note : Return size is SIZE of op2
|
|
|
|
function "+"(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op2'length;
|
|
variable result : STD_ULOGIC_VECTOR(size_op - 1 downto 0);
|
|
-- retuen size is size of op2
|
|
begin
|
|
result := To_StdULogicVector(op1, size_op) + op2;
|
|
return(result);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1: STD_ULOGIC_VECTOR; op2 : INTEGER) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_LOGIC vector
|
|
--
|
|
-- Note : Return size is SIZE of op1
|
|
|
|
function "+"(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size_op: INTEGER := op1'length;
|
|
variable result: STD_ULOGIC_VECTOR(size_op - 1 downto 0);
|
|
|
|
begin
|
|
result := op1 + To_StdULogicVector(op2, size_op);
|
|
return(result);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "+" (op1, op2: STD_ULOGIC) return STD_ULOGIC
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC
|
|
-- OUTPUT : The sum of the two parameters.
|
|
--
|
|
-- This function adds the two parameters and returns a STD_ULOGIC
|
|
--
|
|
-- Note : Return size is SIZE of op1
|
|
|
|
function "+"(op1, op2: STD_ULOGIC) return STD_ULOGIC is
|
|
|
|
begin
|
|
return(op1 xor op2);
|
|
end "+";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_LOGIC_VECTOR
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_LOGIC_VECTOR
|
|
-- It uses TWO's COMPLEMENT addition for subtraction and uses table lookup
|
|
-- to get sum and carry.
|
|
|
|
function "-"(op1, op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size1: NATURAL := op1'LENGTH;
|
|
constant size2: NATURAL := op2'LENGTH;
|
|
constant size_op: NATURAL := max(size1, size2);
|
|
-- size_op is the width of the larger operand
|
|
variable loop_cnt : NATURAL := size_op - 1;
|
|
variable oper1, oper2 : STD_LOGIC_VECTOR(loop_cnt downto 0);
|
|
variable result : STD_LOGIC_VECTOR (loop_cnt downto 0)
|
|
:= (others => 'X');
|
|
-- size of result is size_op
|
|
variable lt, rt: STD_ULOGIC;
|
|
variable carry: STD_ULOGIC := '1'; -- initialized to '1'
|
|
-- for 2's complement of op2
|
|
begin
|
|
if not (Is_X(op1) or Is_X(op2)) then -- operands do not have 'X'
|
|
if (size1 < size_op) then
|
|
oper1 := align_size(op1, size_op); -- Make both the same size
|
|
else
|
|
oper1 := op1;
|
|
end if;
|
|
if (size2 < size_op) then
|
|
oper2 := align_size(op2, size_op); -- operands of
|
|
else -- same size
|
|
oper2 := op2;
|
|
end if;
|
|
oper2 := not oper2; -- 1's complement of op2, extra variable
|
|
|
|
for I in 0 to loop_cnt loop
|
|
lt := oper1(I);
|
|
rt := oper2(I);
|
|
result(I) := lt xor rt xor carry;
|
|
carry := (lt and rt) or (lt and carry) or (rt and carry);
|
|
end loop;
|
|
end if;
|
|
return (result);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 of type STD_ULOGIC and op2 of type STD_LOGIC_VECTOR
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_LOGIC_VECTOR
|
|
-- It uses TWO's COMPLEMENT addition for subtraction and uses table lookup
|
|
-- to get sum and carry.
|
|
|
|
function "-"(op1: STD_ULOGIC; op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size_op: NATURAL := op2'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper1: STD_LOGIC_VECTOR(size_op -1 downto 0);
|
|
begin
|
|
oper1 := align_size(op1, size_op);
|
|
return (oper1 - op2);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 of type STD_LOGIC_VECTOR and op2 of type STD_ULOGIC
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_LOGIC_VECTOR
|
|
-- It uses TWO's COMPLEMENT addition for subtraction and uses table lookup
|
|
-- to get sum and carry.
|
|
|
|
function "-"(op1: STD_LOGIC_VECTOR; op2: STD_ULOGIC) return STD_LOGIC_VECTOR
|
|
is
|
|
|
|
constant size_op: NATURAL := op1'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper2: STD_LOGIC_VECTOR(size_op -1 downto 0);
|
|
begin
|
|
oper2 := align_size(op2, size_op);
|
|
return (op1 - oper2);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: INTEGER; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 of type INTEGER and op2 of type STD_LOGIC_VECTOR
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_LOGIC_VECTOR
|
|
--
|
|
-- Note: Return size is SIZE of op2
|
|
|
|
function "-"(op1: INTEGER; op2: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size_op: NATURAL := op2'length;
|
|
variable result: STD_LOGIC_VECTOR(size_op - 1 downto 0);
|
|
begin
|
|
result := To_StdLogicVector(op1, size_op) - op2;
|
|
return (result);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: STD_LOGIC_VECTOR; op2 : INTEGER) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 of type STD_LOGIC_VECTOR and op2 of type INTEGER
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_LOGIC_VECTOR
|
|
--
|
|
-- Note: Return size is SIZE of op1
|
|
|
|
function "-"(op1: STD_LOGIC_VECTOR; op2: INTEGER) return STD_LOGIC_VECTOR is
|
|
|
|
constant size_op: NATURAL := op1'length;
|
|
variable result: STD_LOGIC_VECTOR(size_op - 1 downto 0);
|
|
begin
|
|
result := op1 - To_StdLogicVector(op2, size_op);
|
|
return (result);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1, op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_ULOGIC_VECTOR
|
|
-- It uses TWO's COMPLEMENT addition for subtraction and uses table lookup
|
|
-- to get sum and carry.
|
|
|
|
function "-"(op1, op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size1: NATURAL := op1'LENGTH;
|
|
constant size2: NATURAL := op2'LENGTH;
|
|
constant size_op: NATURAL := max(size1, size2);
|
|
-- size_op is the width of the larger operand
|
|
variable loop_cnt : NATURAL := size_op - 1;
|
|
variable oper1, oper2 : STD_ULOGIC_VECTOR(loop_cnt downto 0);
|
|
variable result : STD_ULOGIC_VECTOR (loop_cnt downto 0)
|
|
:= (others => 'X');
|
|
-- size of result is size_op
|
|
variable lt, rt: STD_ULOGIC;
|
|
variable carry: STD_ULOGIC := '1'; -- initialized to '1'
|
|
-- for 2's complement of op2
|
|
begin
|
|
if not (Is_X(op1) or Is_X(op2)) then -- operands do not have 'X'
|
|
if (size1 < size_op) then
|
|
oper1 := align_size(op1, size_op); -- Make both the same size
|
|
else
|
|
oper1 := op1;
|
|
end if;
|
|
if (size2 < size_op) then
|
|
oper2 := align_size(op2, size_op); -- operands of
|
|
else -- same size
|
|
oper2 := op2;
|
|
end if;
|
|
oper2 := not oper2; -- 1's complement of op2, extra variable
|
|
|
|
for I in 0 to loop_cnt loop
|
|
lt := oper1(I);
|
|
rt := oper2(I);
|
|
result(I) := lt xor rt xor carry;
|
|
carry := (lt and rt) or (lt and carry) or (rt and carry);
|
|
end loop;
|
|
end if;
|
|
return (result);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: STD_ULOGIC; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 of type STD_ULOGIC and op2 of type STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_ULOGIC_VECTOR
|
|
-- It uses TWO's COMPLEMENT addition for subtraction and uses table lookup
|
|
-- to get sum and carry.
|
|
|
|
function "-"(op1: STD_ULOGIC; op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size_op: NATURAL := op2'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper1: STD_ULOGIC_VECTOR(size_op -1 downto 0);
|
|
begin
|
|
oper1 := align_size(op1, size_op);
|
|
return (oper1 - op2);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: STD_ULOGIC_VECTOR; op2 : STD_ULOGIC) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 of type STD_ULOGIC_VECTOR and op2 of type STD_ULOGIC
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_ULOGIC_VECTOR
|
|
-- It uses TWO's COMPLEMENT addition for subtraction and uses table lookup
|
|
-- to get sum and carry.
|
|
|
|
function "-"(op1: STD_ULOGIC_VECTOR; op2: STD_ULOGIC) return STD_ULOGIC_VECTOR
|
|
is
|
|
|
|
constant size_op: NATURAL := op1'length;
|
|
-- size_op is the width of the larger operand
|
|
variable oper2: STD_ULOGIC_VECTOR(size_op -1 downto 0);
|
|
begin
|
|
oper2 := align_size(op2, size_op);
|
|
return (op1 - oper2);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: INTEGER; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 of type INTEGER and op2 of type STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_ULOGIC_VECTOR
|
|
--
|
|
-- Note: Return size is SIZE of op2
|
|
|
|
function "-"(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size_op: NATURAL := op2'length;
|
|
variable result: STD_ULOGIC_VECTOR(size_op - 1 downto 0);
|
|
begin
|
|
result := To_StdULogicVector(op1, size_op) - op2;
|
|
return (result);
|
|
end "-";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "-" (op1: STD_ULOGIC_VECTOR; op2 : INTEGER) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 of type STD_ULOGIC_VECTOR and op2 of type INTEGER
|
|
-- OUTPUT : The difference of the two operands.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_ULOGIC_VECTOR
|
|
--
|
|
-- Note: Return size is SIZE of op1
|
|
|
|
function "-"(op1: STD_ULOGIC_VECTOR; op2: INTEGER) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size_op: NATURAL := op1'length;
|
|
variable result: STD_ULOGIC_VECTOR(size_op - 1 downto 0);
|
|
begin
|
|
result := op1 - To_StdULogicVector(op2, size_op);
|
|
return (result);
|
|
end "-";
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "-" (op1, op2: STD_ULOGIC) return STD_ULOGIC
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC
|
|
-- OUTPUT : The difference of the two parameters.
|
|
--
|
|
-- This function subtracts op2 from op1 and returns a STD_ULOGIC
|
|
--
|
|
-- Note : Return size is 1
|
|
|
|
function "-"(op1, op2: STD_ULOGIC) return STD_ULOGIC is
|
|
|
|
begin
|
|
return(op1 xor op2);
|
|
end "-";
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "+"(op1: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
|
-- INPUT : a std_logc vector
|
|
-- OUTPUT: a std_logc vector
|
|
-- The function added to support unary "+"
|
|
function "+" (op1: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
begin
|
|
return op1;
|
|
end "+";
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "+"(op1: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
|
-- INPUT : a std_logc vector
|
|
-- OUTPUT: a std_logc vector
|
|
-- The function added to support unary "+"
|
|
function "+" (op1: STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
begin
|
|
return op1;
|
|
end "+";
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- TO_INTEGER (oper: STD_LOGIC_VECTOR)
|
|
-- INPUT : a std_logc vector
|
|
-- OUTPUT: an INTEGER value of the oper.
|
|
--
|
|
-- This function returns the integer value of the oper.
|
|
-- If size > 31 take only lower 31 bits
|
|
-- If in oper, there is any element of value 'X' or 'Z', then
|
|
-- value integer'LEFT will be returned.
|
|
|
|
|
|
function to_integer (oper : STD_LOGIC_VECTOR) return INTEGER is
|
|
variable value : INTEGER := 0;
|
|
variable temp_no : INTEGER := 1;
|
|
variable temp_oper : STD_LOGIC_VECTOR(oper'range) := oper;
|
|
variable INDEX : INTEGER := 1;
|
|
begin
|
|
assert oper'length <= 31
|
|
report "argument is too large in TO_INTEGER, only lower 31 bits will be taken"
|
|
severity WARNING;
|
|
|
|
if (not (Is_X(oper))) then
|
|
for I in temp_oper'reverse_range loop
|
|
case (tbl_BINARY(temp_oper(I))) is
|
|
when '1' =>
|
|
value := value + temp_no;
|
|
when others =>
|
|
null;
|
|
end case;
|
|
INDEX := INDEX + 1;
|
|
exit when INDEX > 31;
|
|
temp_no := temp_no + temp_no;
|
|
end loop;
|
|
else
|
|
assert FALSE report
|
|
"WARNING: Illegal value detected in the conversion of TO_INTEGER"
|
|
severity WARNING;
|
|
--value := integer'LEFT;
|
|
value := 0;
|
|
end if;
|
|
return (value);
|
|
end to_integer;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- TO_INTEGER (oper: STD_ULOGIC) return INTEGER;
|
|
-- INPUT : a std_ulogic
|
|
-- OUTPUT: an INTEGER value of the oper.
|
|
--
|
|
-- This function returns the integer value of the oper. It is overloaded
|
|
-- in this way to make translation easier.
|
|
|
|
function to_integer (oper : STD_ULOGIC) return INTEGER is
|
|
|
|
begin
|
|
case (tbl_BINARY(oper)) is
|
|
when '1' =>
|
|
return(1);
|
|
when '0' =>
|
|
return (0);
|
|
when others =>
|
|
assert FALSE report
|
|
"WARNING: Illegal value detected in the conversion of TO_INTEGER"
|
|
severity WARNING;
|
|
-- return (integer'LEFT);
|
|
return (0);
|
|
end case;
|
|
end to_integer;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- TO_INTEGER (oper: STD_ULOGIC_VECTOR)
|
|
-- INPUT : a std_ulogic_vector
|
|
-- OUTPUT: an INTEGER value of the oper.
|
|
--
|
|
-- This function returns the integer value of the oper.
|
|
-- If size > 31 take only lower 31 bits
|
|
-- If in oper, there is any element of value 'X' or 'Z', then
|
|
-- value integer'LEFT will be returned.
|
|
|
|
|
|
function to_integer (oper : STD_ULOGIC_VECTOR) return INTEGER is
|
|
begin
|
|
return (to_integer(To_StdLogicVector(oper)));
|
|
end to_integer;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- Multiplication Operator --
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "*" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_LOGIC_VECTOR
|
|
-- OUTPUT : The product of the two parameters.
|
|
--
|
|
-- This function multiplies the two parameters and returns a STD_LOGIC vector
|
|
-- It converts the parameters to integers and then multiplies.
|
|
|
|
function "*" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size1: INTEGER := op1'LENGTH;
|
|
constant size2: INTEGER := op2'LENGTH;
|
|
variable multiplicand, multiplier : INTEGER;
|
|
constant size_res: INTEGER := size1 + size2;
|
|
-- size_res is the width of size1+ size2
|
|
variable result : STD_LOGIC_VECTOR (size_res -1 downto 0):=
|
|
(others => 'X');
|
|
-- size of result is size1 + size2
|
|
begin
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
multiplicand := to_integer(op1);
|
|
multiplier := to_integer(op2);
|
|
result := (others => '0');
|
|
if ((multiplier /= 0) and (multiplicand /= 0)) then
|
|
result := To_StdLogicVector((multiplicand * multiplier), size_res);
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "*";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "*" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC/STD_LOGIC_VECTOR
|
|
-- OUTPUT : The product of the two parameters.
|
|
--
|
|
-- This function multiplies the two parameters and returns a STD_LOGIC vector
|
|
-- It converts the parameters to integers and then multiplies.
|
|
|
|
function "*" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size2: INTEGER := op2'LENGTH;
|
|
variable multiplicand, multiplier : INTEGER;
|
|
|
|
variable result : STD_LOGIC_VECTOR (size2 -1 downto 0):=
|
|
(others => 'X');
|
|
begin
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
multiplicand := to_integer(op1);
|
|
if(multiplicand /= 1) then
|
|
result := (others => '0');
|
|
else
|
|
result := op2;
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "*";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "*" (op1 : STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_LOGIC_VECTOR/STD_ULOGIC
|
|
-- OUTPUT : The product of the two parameters.
|
|
--
|
|
-- This function multiplies the two parameters and returns a STD_LOGIC vector
|
|
-- It converts the parameters to integers and then multiplies.
|
|
|
|
function "*" (op1 : STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR is
|
|
|
|
begin
|
|
return (op2 * op1);
|
|
end "*";
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "*" (op1, op2 : STD_ULOGIC) return STD_ULOGIC
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC
|
|
-- OUTPUT : The product of the two parameters.
|
|
--
|
|
-- This function multiplies op2 by op1 and returns a STD_ULOGIC value.
|
|
|
|
function "*" (op1, op2 : STD_ULOGIC) return STD_ULOGIC is
|
|
|
|
begin
|
|
return (op1 and op2);
|
|
end "*";
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "*" (op1, op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The product of the two parameters.
|
|
--
|
|
-- This function multiplies the two parameters and returns a STD_LOGIC vector
|
|
-- It converts the parameters to integers and then multiplies.
|
|
|
|
function "*" (op1, op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size1: INTEGER := op1'LENGTH;
|
|
constant size2: INTEGER := op2'LENGTH;
|
|
variable multiplicand, multiplier : INTEGER;
|
|
constant size_res: INTEGER := size1 + size2;
|
|
-- size_res is the width of size1+ size2
|
|
variable result : STD_ULOGIC_VECTOR (size_res -1 downto 0):=
|
|
(others => 'X');
|
|
-- size of result is size1 + size2
|
|
begin
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
multiplicand := to_integer(op1);
|
|
multiplier := to_integer(op2);
|
|
result := (others => '0');
|
|
if ((multiplier /= 0) and (multiplicand /= 0)) then
|
|
result := To_StdULogicVector((multiplicand * multiplier), size_res);
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "*";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "*" (op1: STD_ULOGIC; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : The product of the two parameters.
|
|
--
|
|
-- This function multiplies the two parameters and returns a STD_LOGIC vector
|
|
-- It converts the parameters to integers and then multiplies.
|
|
|
|
function "*" (op1: STD_ULOGIC; op2 : STD_ULOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
|
|
constant size2: INTEGER := op2'LENGTH;
|
|
variable multiplicand, multiplier : INTEGER;
|
|
|
|
variable result : STD_ULOGIC_VECTOR (size2 -1 downto 0):=
|
|
(others => 'X');
|
|
begin
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
multiplicand := to_integer(op1);
|
|
if(multiplicand /= 1) then
|
|
result := (others => '0');
|
|
else
|
|
result := op2;
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "*";
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "*" (op1 : STD_ULOGIC_VECTOR; op2 : STD_ULOGIC) return STD_ULOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC_VECTOR/STD_ULOGIC
|
|
-- OUTPUT : The product of the two parameters.
|
|
--
|
|
-- This function multiplies the two parameters and returns a STD_LOGIC vector
|
|
-- It converts the parameters to integers and then multiplies.
|
|
|
|
function "*" (op1 : STD_ULOGIC_VECTOR; op2 : STD_ULOGIC) return STD_ULOGIC_VECTOR is
|
|
|
|
begin
|
|
return (op2 * op1);
|
|
end "*";
|
|
|
|
|
|
------------------------------------------------------------------------------
|
|
-- DIVISION OPERATORS
|
|
-- The division operators are only for internal use
|
|
-- It is not advisible to use them in design.
|
|
-----------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- "/" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_LOGIC_VECTOR
|
|
-- OUTPUT : The division of the two parameters.
|
|
-- This function coverts parameters to integer then
|
|
-- does the division. For internal use only.
|
|
|
|
|
|
function "/" (op1, op2 : STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
|
|
constant size1: INTEGER := op1'LENGTH;
|
|
constant size2: INTEGER := op2'LENGTH;
|
|
variable operand1, operand2 : INTEGER;
|
|
constant size_res: INTEGER := size1;
|
|
|
|
variable result : STD_LOGIC_VECTOR (size_res -1 downto 0) := (others => 'X');
|
|
-- size of result is size1
|
|
begin
|
|
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
|
|
operand1 := to_integer(op1);
|
|
operand2 := to_integer(op2);
|
|
|
|
if ( operand2 /= 0 ) then
|
|
result := To_StdLogicVector( (operand1/operand2), size_res);
|
|
else
|
|
assert FALSE report
|
|
"ERROR: Division by zero detected."
|
|
severity ERROR;
|
|
return (result);
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "/";
|
|
|
|
-----------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "/" (op1: STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC/STD_LOGIC_VECTOR
|
|
-- OUTPUT : The division of the two parameters.
|
|
--
|
|
-- This function divides the two parameters and returns
|
|
-- STD_LOGIC_VECTOR.
|
|
-- It converts the parameters to integers and then does
|
|
-- the division.
|
|
|
|
function "/" (op1: STD_LOGIC_VECTOR; op2 : STD_ULOGIC) return STD_LOGIC_VECTOR is
|
|
|
|
constant size1: INTEGER := op1'LENGTH;
|
|
variable operand2 : INTEGER;
|
|
|
|
variable result : STD_LOGIC_VECTOR (size1 -1 downto 0):= (others => 'X');
|
|
begin
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
operand2 := to_integer(op2);
|
|
if(operand2 = 1) then
|
|
result := op1;
|
|
else
|
|
assert FALSE report
|
|
"ERROR: Division by zero detected."
|
|
severity ERROR;
|
|
return (result);
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "/";
|
|
|
|
----------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "/" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_ULOGIC
|
|
-- for internal use only
|
|
|
|
function "/" (op1: STD_ULOGIC; op2 : STD_LOGIC_VECTOR) return STD_ULOGIC is
|
|
variable operand2 : INTEGER;
|
|
variable result : STD_ULOGIC := 'X';
|
|
begin
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
operand2 := to_integer( op2 );
|
|
if( operand2 = 1 ) then
|
|
return ( op1 );
|
|
else
|
|
assert FALSE report
|
|
"ERROR: Division by zero detected."
|
|
severity ERROR;
|
|
return (result);
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "/" ;
|
|
|
|
-------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- "/" (op1, op2 : STD_ULOGIC) return STD_ULOGIC
|
|
-- INPUT : op1 and op2 of type STD_ULOGIC
|
|
-- OUTPUT : The division of the two parameters.
|
|
--
|
|
-- This function divides op1 by op2 and returns a STD_ULOGIC value.
|
|
|
|
function "/" (op1, op2 : STD_ULOGIC) return STD_ULOGIC is
|
|
variable result : STD_ULOGIC := 'X';
|
|
begin
|
|
if (not (Is_X(op1) or Is_X(op2))) then
|
|
if( op2 = '1' ) then
|
|
return (op1);
|
|
else
|
|
assert FALSE report
|
|
"ERROR: Division by zero detected."
|
|
severity ERROR;
|
|
return ('X');
|
|
end if;
|
|
end if;
|
|
return (result);
|
|
end "/";
|
|
|
|
-------------------------------------------------------------------------
|
|
|
|
-- FUNCTION :
|
|
-- COND_OP (cond:BOOLEAN; left_val,right_val: STD_LOGIC_VECTOR)
|
|
-- return STD_LOGIC_VECTOR
|
|
--
|
|
-- This function behaves like the conditional operator.
|
|
-- If 'cond' has a boolean value of
|
|
-- 'TRUE' then left_val is returned, else
|
|
-- 'FALSE' then right_val is returned
|
|
|
|
function cond_op(cond: BOOLEAN; left_val,right_val:STD_LOGIC_VECTOR)
|
|
return STD_LOGIC_VECTOR is
|
|
constant size1: INTEGER := left_val'LENGTH;
|
|
constant size2: INTEGER := right_val'LENGTH;
|
|
constant size_op: INTEGER := max(size1, size2);
|
|
variable result : STD_LOGIC_VECTOR (size_op -1 downto 0);
|
|
|
|
begin
|
|
if (cond) then
|
|
if (size1 < size_op) then
|
|
result := align_size(left_val, size_op);
|
|
else
|
|
result := left_val;
|
|
end if;
|
|
else
|
|
if (size2 < size_op) then
|
|
result := align_size(right_val, size_op);
|
|
else
|
|
result := right_val;
|
|
end if;
|
|
end if;
|
|
|
|
return (result);
|
|
end cond_op;
|
|
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION
|
|
-- COND_OP (cond:BOOLEAN; left_val,right_val: STD_ULOGIC) return STD_ULOGIC
|
|
--
|
|
-- This function behaves like the conditional operator.
|
|
-- If 'cond' has a boolean value of
|
|
-- 'TRUE' then left_val is returned, else
|
|
-- 'FALSE' then right_val is returned
|
|
|
|
function cond_op(cond: BOOLEAN; left_val,right_val:STD_ULOGIC)
|
|
return STD_ULOGIC is
|
|
|
|
begin
|
|
if (cond) then
|
|
return(left_val);
|
|
else
|
|
return(right_val);
|
|
end if;
|
|
|
|
end cond_op;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION
|
|
-- COND_OP (cond:BOOLEAN; left_val,right_val: STD_ULOGIC_VECTOR)
|
|
-- return STD_ULOGIC_VECTOR
|
|
--
|
|
-- This function behaves like the conditional operator.
|
|
-- If 'cond' has a boolean value of
|
|
-- 'TRUE' then left_val is returned, else
|
|
-- 'FALSE' then right_val is returned
|
|
|
|
function cond_op(cond: BOOLEAN; left_val,right_val:STD_ULOGIC_VECTOR)
|
|
return STD_ULOGIC_VECTOR is
|
|
constant size1: INTEGER := left_val'LENGTH;
|
|
constant size2: INTEGER := right_val'LENGTH;
|
|
constant size_op: INTEGER := max(size1, size2);
|
|
variable result : STD_ULOGIC_VECTOR (size_op -1 downto 0);
|
|
|
|
begin
|
|
if (cond) then
|
|
if (size1 < size_op) then
|
|
result := align_size(left_val, size_op);
|
|
else
|
|
result := left_val;
|
|
end if;
|
|
else
|
|
if (size2 < size_op) then
|
|
result := align_size(right_val, size_op);
|
|
else
|
|
result := right_val;
|
|
end if;
|
|
end if;
|
|
|
|
return (result);
|
|
end cond_op;
|
|
|
|
|
|
|
|
--############################################################################--
|
|
-- --
|
|
-- SHIFT OPERATORS
|
|
-- --
|
|
--############################################################################--
|
|
|
|
--------------------------
|
|
-- Shift Left Operators --
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- SH_LEFT (op1 : STD_LOGIC_VECTOR; op2 : NATURAL) return STD_LOGIC_VECTOR
|
|
--
|
|
-- This function left-shifts the op1, by the number of bits specified by op2
|
|
-- and returns the shifted result (of the same size as op1).
|
|
|
|
function sh_left (op1 : STD_LOGIC_VECTOR; op2 : NATURAL) return STD_LOGIC_VECTOR is
|
|
constant size_op: INTEGER := op1'LENGTH;
|
|
constant left : INTEGER := op1'LEFT;
|
|
constant right : INTEGER := op1'RIGHT;
|
|
variable result: STD_LOGIC_VECTOR (size_op-1 downto 0) := (others => '0');
|
|
begin
|
|
if (op2 = 0) then
|
|
return (op1);
|
|
end if;
|
|
|
|
if (op2 >= size_op) then -- if more than size_op bits are
|
|
return (result); -- to be shifted, the
|
|
end if; -- result is all 0's
|
|
|
|
if (left >= right) then -- op1 is of descending range
|
|
result(size_op-1 downto op2) := op1((left - op2) downto right);
|
|
else -- op1 is of ascending range
|
|
result(size_op-1 downto op2) := op1((left + op2) to right);
|
|
end if;
|
|
|
|
return result;
|
|
end sh_left;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- SH_LEFT (op1 : STD_ULOGIC_VECTOR; op2 : NATURAL) return STD_ULOGIC_VECTOR
|
|
--
|
|
-- This function left-shifts the op1, by the number of bits specified by op2
|
|
-- and returns the shifted result (of the same size as op1).
|
|
|
|
function sh_left (op1 : STD_ULOGIC_VECTOR; op2 : NATURAL) return STD_ULOGIC_VECTOR is
|
|
constant size_op: INTEGER := op1'LENGTH;
|
|
constant left : INTEGER := op1'LEFT;
|
|
constant right : INTEGER := op1'RIGHT;
|
|
variable result: STD_ULOGIC_VECTOR (size_op-1 downto 0) := (others => '0');
|
|
begin
|
|
if (op2 = 0) then
|
|
return (op1);
|
|
end if;
|
|
|
|
if (op2 >= size_op) then -- if more than size_op bits are
|
|
return (result); -- to be shifted, the
|
|
end if; -- result is all 0's
|
|
|
|
if (left >= right) then -- op1 is of descending range
|
|
result(size_op-1 downto op2) := op1((left - op2) downto right);
|
|
else -- op1 is of ascending range
|
|
result(size_op-1 downto op2) := op1((left + op2) to right);
|
|
end if;
|
|
|
|
return result;
|
|
end sh_left;
|
|
|
|
--------------------------------------------------------------------------------
|
|
---------------------------
|
|
-- Shift Right Operators --
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- SH_RIGHT (op1 : STD_LOGIC_VECTOR; op2 : NATURAL) return STD_LOGIC_VECTOR
|
|
--
|
|
-- This function right-shifts op1, by the number of bits specified by op2
|
|
-- and returns the shifted result (of the same size as op1).
|
|
|
|
function sh_right (op1 : STD_LOGIC_VECTOR; op2 : NATURAL)
|
|
return STD_LOGIC_VECTOR is
|
|
constant size_op: INTEGER := op1'LENGTH;
|
|
constant left : INTEGER := op1'LEFT;
|
|
constant right : INTEGER := op1'RIGHT;
|
|
variable result: STD_LOGIC_VECTOR (size_op-1 downto 0) := (others => '0');
|
|
begin
|
|
if (op2 = 0) then
|
|
return (op1);
|
|
end if;
|
|
|
|
if (op2 >= size_op) then -- if more than size_op bits are
|
|
return (result); -- to be shifted, the
|
|
end if; -- result is all 0's
|
|
|
|
if (left >= right) then -- op1 is of descending range
|
|
result((size_op-1 - op2) downto 0)
|
|
:= op1(left downto (right + op2));
|
|
else -- op1 is of ascending range
|
|
result((size_op - 1 - op2) downto 0)
|
|
:= op1(left to (right - op2));
|
|
end if;
|
|
return result;
|
|
end sh_right;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FUNCTION :
|
|
-- SH_RIGHT (op1 : STD_ULOGIC_VECTOR; op2 : NATURAL) return STD_ULOGIC_VECTOR
|
|
--
|
|
-- This function right-shifts op1, by the number of bits specified by op2
|
|
-- and returns the shifted result (of the same size as op1).
|
|
|
|
function sh_right (op1 : STD_ULOGIC_VECTOR; op2 : NATURAL)
|
|
return STD_ULOGIC_VECTOR is
|
|
constant size_op: INTEGER := op1'LENGTH;
|
|
constant left : INTEGER := op1'LEFT;
|
|
constant right : INTEGER := op1'RIGHT;
|
|
variable result: STD_ULOGIC_VECTOR (size_op-1 downto 0) := (others => '0');
|
|
begin
|
|
if (op2 = 0) then
|
|
return (op1);
|
|
end if;
|
|
|
|
if (op2 >= size_op) then -- if more than size_op bits are
|
|
return (result); -- to be shifted, the
|
|
end if; -- result is all 0's
|
|
|
|
if (left >= right) then -- op1 is of descending range
|
|
result((size_op-1 - op2) downto 0)
|
|
:= op1(left downto (right + op2));
|
|
else -- op1 is of ascending range
|
|
result((size_op - 1 - op2) downto 0)
|
|
:= op1(left to (right - op2));
|
|
end if;
|
|
return result;
|
|
end sh_right;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_LOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 < op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "<"(op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 < oper2;
|
|
end if;
|
|
return(retval);
|
|
end "<";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_LOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 < op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "<" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 < op2;
|
|
end if;
|
|
return(retval);
|
|
end "<";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 < op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "<"(op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 < oper2;
|
|
end if;
|
|
return(retval);
|
|
end "<";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_ULOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 < op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "<" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 < op2;
|
|
end if;
|
|
return(retval);
|
|
end "<";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_LOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 <= op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "<=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 <= oper2;
|
|
end if;
|
|
return(retval);
|
|
end "<=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_LOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 <= op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "<=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 <= op2;
|
|
end if;
|
|
return(retval);
|
|
end "<=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 <= op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "<=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 <= oper2;
|
|
end if;
|
|
return(retval);
|
|
end "<=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "<=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_ULOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 <= op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "<=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 <= op2;
|
|
end if;
|
|
return(retval);
|
|
end "<=";
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION:
|
|
-- ">" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_LOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 > op2 else FALSE, FALSE if logic type has X
|
|
|
|
function ">" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 > oper2;
|
|
end if;
|
|
return(retval);
|
|
end ">";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- ">" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_LOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 > op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function ">" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 > op2;
|
|
end if;
|
|
return(retval);
|
|
end ">";
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
-- FUNCTION:
|
|
-- ">" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 > op2 else FALSE, FALSE if logic type has X
|
|
|
|
function ">" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 > oper2;
|
|
end if;
|
|
return(retval);
|
|
end ">";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- ">" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_ULOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 > op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function ">" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 > op2;
|
|
end if;
|
|
return(retval);
|
|
end ">";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- ">=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_LOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 >= op2 else FALSE, FALSE if logic type has X
|
|
|
|
function ">=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 >= oper2;
|
|
end if;
|
|
return(retval);
|
|
end ">=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- ">=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_LOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 >= op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function ">=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 >= op2;
|
|
end if;
|
|
return(retval);
|
|
end ">=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- ">=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 >= op2 else FALSE, FALSE if logic type has X
|
|
|
|
function ">=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 >= oper2;
|
|
end if;
|
|
return(retval);
|
|
end ">=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- ">=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_ULOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 >= op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function ">=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 >= op2;
|
|
end if;
|
|
return(retval);
|
|
end ">=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_LOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 = op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 = oper2;
|
|
end if;
|
|
return(retval);
|
|
end "=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_LOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 = op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 = op2;
|
|
end if;
|
|
return(retval);
|
|
end "=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 = op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 = oper2;
|
|
end if;
|
|
return(retval);
|
|
end "=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_ULOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 = op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 = op2;
|
|
end if;
|
|
return(retval);
|
|
end "=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "/=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_LOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 /= op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "/=" (op1: INTEGER; op2: STD_LOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 /= oper2;
|
|
end if;
|
|
return(retval);
|
|
end "/=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "/=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_LOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 /= op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "/=" (op1: STD_LOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 /= op2;
|
|
end if;
|
|
return(retval);
|
|
end "/=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "/=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN
|
|
-- INPUT : op1, op2 of type INTEGER/STD_ULOGIC_VECTOR
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 /= op2 else FALSE, FALSE if logic type has X
|
|
|
|
function "/=" (op1: INTEGER; op2: STD_ULOGIC_VECTOR) return BOOLEAN is
|
|
variable oper2 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op2))) then
|
|
oper2 := to_integer(op2);
|
|
retval := op1 /= oper2;
|
|
end if;
|
|
return(retval);
|
|
end "/=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION:
|
|
-- "/=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN
|
|
-- INPUT : op1, op2 of type STD_ULOGIC_VECTOR/INTEGER
|
|
-- OUTPUT : BOOLEAN, TRUE if op1 /= op2 else FALSE, FALSE if logic type has X
|
|
|
|
|
|
function "/=" (op1: STD_ULOGIC_VECTOR; op2: INTEGER) return BOOLEAN is
|
|
variable oper1 : INTEGER;
|
|
variable retval : BOOLEAN := FALSE;
|
|
begin
|
|
if (not (Is_X(op1))) then
|
|
oper1 := to_integer(op1);
|
|
retval := oper1 /= op2;
|
|
end if;
|
|
return(retval);
|
|
end "/=";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- FUNCTION
|
|
-- DRIVE (V: STD_LOGIC_VECTOR) return STD_ULOGIC_VECTOR
|
|
-- INPUT : V of type STD_LOGIC_VECTOR
|
|
-- OUTPUT : Same as input with type STD_ULOGIC_VECTOR
|
|
|
|
function drive (V: STD_LOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
|
variable result : std_ulogic_vector ( V'range );
|
|
begin
|
|
for i IN V'RANGE LOOP
|
|
result(i) := V(i);
|
|
end loop;
|
|
return result;
|
|
end drive;
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- FUNCTION
|
|
-- DRIVE (V: STD_ULOGIC_VECTOR) return STD_LOGIC_VECTOR
|
|
-- INPUT : V of type STD_ULOGIC_VECTOR
|
|
-- OUTPUT : Same as input with type STD_LOGIC_VECTOR
|
|
|
|
function drive (V: STD_ULOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
|
variable result : std_logic_vector ( V'range );
|
|
begin
|
|
for i IN V'RANGE LOOP
|
|
result(i) := V(i);
|
|
end loop;
|
|
return result;
|
|
end drive;
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- FUNCTION
|
|
-- SENSE (V: STD_ULOGIC; vZ, vU, vDC: STD_ULOGIC) return STD_ULOGIC
|
|
-- INPUT : V of type STD_ULOGIC, vZ, vU, vDC of type STD_ULOGIC
|
|
-- OUTPUT : STD_ULOGIC with same value as V but its 'Z' mapped to VZ,
|
|
-- 'U' mapped to vU and '-' mapped to vDC.
|
|
|
|
function sense (V: STD_ULOGIC; vZ, vU, vDC: STD_ULOGIC) return STD_ULOGIC is
|
|
begin
|
|
case V is
|
|
when 'Z' => return (vZ);
|
|
when 'U' => return (vU);
|
|
when '-' => return (vDC);
|
|
when others => return (V);
|
|
end case;
|
|
end sense;
|
|
-----------------------------------------------------------------------------
|
|
-- FUNCTION
|
|
-- SENSE (V: STD_ULOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
|
-- return STD_ULOGIC_VECTOR
|
|
-- INPUT : V of type STD_ULOGIC_VECTOR, vZ, vU, vDC of type STD_ULOGIC
|
|
-- OUTPUT : STD_ULOGIC_VECTOR with same value as V but its 'Z' mapped to VZ,
|
|
-- 'U' mapped to vU and '-' mapped to vDC.
|
|
|
|
function sense (V: STD_ULOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
|
return STD_ULOGIC_VECTOR is
|
|
variable result : STD_ULOGIC_VECTOR(V'range);
|
|
begin
|
|
for I in V'RANGE loop
|
|
case V(I) is
|
|
when 'Z' => result(I) := vZ;
|
|
when 'U' => result(I) := vU;
|
|
when '-' => result(I) := vDC;
|
|
when others => result(I) := V(I);
|
|
end case;
|
|
end loop;
|
|
return (result);
|
|
end sense;
|
|
-----------------------------------------------------------------------------
|
|
-- FUNCTION
|
|
-- SENSE (V: STD_LOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
|
-- return STD_ULOGIC_VECTOR
|
|
-- INPUT : V of type STD_ULOGIC_VECTOR, vZ, vU, vDC of type STD_ULOGIC
|
|
-- OUTPUT : STD_ULOGIC_VECTOR with same value as V but its 'Z' mapped to VZ,
|
|
-- 'U' mapped to vU and '-' mapped to vDC.
|
|
|
|
function sense (V: STD_LOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
|
return STD_ULOGIC_VECTOR is
|
|
variable result : STD_ULOGIC_VECTOR(V'range);
|
|
begin
|
|
for I in V'RANGE loop
|
|
case V(I) is
|
|
when 'Z' => result(I) := vZ;
|
|
when 'U' => result(I) := vU;
|
|
when '-' => result(I) := vDC;
|
|
when others => result(I) := V(I);
|
|
end case;
|
|
end loop;
|
|
return (result);
|
|
end sense;
|
|
-----------------------------------------------------------------------------
|
|
|
|
end STD_LOGIC_ARITH;
|