📄 std_logic_arith_body.vhdl
字号:
LIBRARY ieee;-- LIBRARY arithmetic;PACKAGE BODY std_logic_arith IS USE ieee.std_logic_1164.ALL; -- USE arithmetic.utils.all; ------------------------------------------------------------------- -- Local Types ------------------------------------------------------------------- TYPE stdlogic_1d IS ARRAY (std_ulogic) OF std_ulogic; TYPE stdlogic_table IS ARRAY(std_ulogic, std_ulogic) OF std_ulogic; TYPE stdlogic_boolean_table IS ARRAY(std_ulogic, std_ulogic) OF BOOLEAN; -------------------------------------------------------------------- -------------------------------------------------------------------- -- FUNCTIONS DEFINED FOR SYNTHESIS -------------------------------------------------------------------- -------------------------------------------------------------------- FUNCTION std_ulogic_wired_or ( input : std_ulogic_vector ) RETURN std_ulogic IS VARIABLE result : std_ulogic := '-'; -- weakest state default CONSTANT resolution_table : stdlogic_table := ( -- --------------------------------------------------------- -- | U X 0 1 Z W L H D | | -- --------------------------------------------------------- ( 'X', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ), -- | U | ( 'X', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ), -- | X | ( 'X', 'X', '0', '1', '0', 'X', '0', '1', '0' ), -- | 0 | ( '1', '1', '1', '1', '1', '1', '1', '1', '1' ), -- | 1 | ( 'X', 'X', '0', '1', 'Z', 'X', '0', '1', 'Z' ), -- | Z | ( 'X', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ), -- | W | ( 'X', 'X', '0', '1', '0', 'X', '0', '1', '0' ), -- | L | ( '1', '1', '1', '1', '1', '1', '1', '1', '1' ), -- | H | ( 'X', 'X', '0', '1', 'Z', 'X', '0', '1', 'Z' ) -- | D | ); BEGIN -- Iterate through all inputs FOR i IN input'range LOOP result := resolution_table(result, input(i)); END LOOP; -- Return the resultant value RETURN result; END std_ulogic_wired_or; FUNCTION std_ulogic_wired_and ( input : std_ulogic_vector ) RETURN std_ulogic IS VARIABLE result : std_ulogic := '-'; -- weakest state default CONSTANT resolution_table : stdlogic_table := ( -- --------------------------------------------------------- -- | U X 0 1 Z W L H D | | -- --------------------------------------------------------- ( 'X', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | U | ( 'X', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | X | ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), -- | 0 | ( 'X', 'X', '0', '1', '1', 'X', '0', '1', '1' ), -- | 1 | ( 'X', 'X', '0', '1', 'Z', 'X', '0', '1', 'Z' ), -- | Z | ( 'X', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | W | ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), -- | L | ( 'X', 'X', '0', '1', '1', 'X', '0', '1', '1' ), -- | H | ( 'X', 'X', '0', '1', 'Z', 'X', '0', '1', 'Z' ) -- | D | ); BEGIN -- Iterate through all inputs FOR i IN input'range LOOP result := resolution_table(result, input(i)); END LOOP; -- Return the resultant value RETURN result; END std_ulogic_wired_and;---- MGC base level functions------ Convert Base Type to Integer-- FUNCTION to_integer (arg1 : STD_ULOGIC_VECTOR; x : INTEGER := 0 ) RETURN INTEGER IS VARIABLE tmp : SIGNED( arg1'length - 1 DOWNTO 0 ) := (OTHERS => '0'); VARIABLE result : INTEGER; BEGIN tmp := SIGNED(arg1); result := TO_INTEGER( tmp, x ); RETURN (result); END to_integer; FUNCTION to_integer (arg1 : STD_LOGIC_VECTOR; x : INTEGER := 0 ) RETURN INTEGER IS VARIABLE tmp : SIGNED( arg1'length - 1 DOWNTO 0 ) := (OTHERS => '0'); VARIABLE result : INTEGER; BEGIN tmp := SIGNED(arg1); result := TO_INTEGER( tmp, x ); RETURN (result); END to_integer; FUNCTION to_integer (arg1 : UNSIGNED; x : INTEGER := 0 ) RETURN NATURAL IS VARIABLE tmp : SIGNED( arg1'length DOWNTO 0 ) := (OTHERS => '0'); VARIABLE result : NATURAL; BEGIN tmp := '0' & SIGNED(arg1); result := TO_INTEGER( tmp, x ); RETURN (result); END to_integer; FUNCTION TO_INTEGER (arg1 : SIGNED; x : INTEGER := 0 ) RETURN INTEGER IS VARIABLE return_int,x_tmp : INTEGER := 0; BEGIN ASSERT arg1'length > 0 REPORT "NULL vector, returning 0" SEVERITY NOTE; assert arg1'length > 1 report "SIGNED vector must be atleast 2 bits wide" severity ERROR; ASSERT arg1'length <= 32 -- implementation dependent limit REPORT "vector too large, conversion may cause overflow" SEVERITY WARNING; IF x /= 0 THEN x_tmp := 1; END IF; IF arg1(arg1'left) = '0' OR arg1(arg1'left) = 'L' OR -- positive value ( x_tmp = 0 AND arg1(arg1'left) /= '1' AND arg1(arg1'left) /= 'H') THEN FOR i IN arg1'range LOOP return_int := return_int * 2; CASE arg1(i) IS WHEN '0'|'L' => NULL; WHEN '1'|'H' => return_int := return_int + 1; WHEN OTHERS => return_int := return_int + x_tmp; END CASE; END LOOP; ELSE -- negative value IF (x_tmp = 0) THEN x_tmp := 1; ELSE x_tmp := 0; END IF; FOR i IN arg1'range LOOP return_int := return_int * 2; CASE arg1(i) IS WHEN '0'|'L' => return_int := return_int + 1; WHEN '1'|'H' => NULL; WHEN OTHERS => return_int := return_int + x_tmp; END CASE; END LOOP; return_int := (-return_int) - 1; END IF; RETURN return_int; END TO_INTEGER; FUNCTION to_integer (arg1:STD_LOGIC; x : INTEGER := 0 ) RETURN NATURAL IS BEGIN IF(arg1 = '0' OR arg1 = 'L' OR (x = 0 AND arg1 /= '1' AND arg1 /= 'H')) THEN RETURN(0); ELSE RETURN(1) ; END IF ; END ; FUNCTION conv_integer (arg1 : STD_ULOGIC_VECTOR; x : INTEGER := 0 ) RETURN INTEGER IS VARIABLE tmp : SIGNED( arg1'length - 1 DOWNTO 0 ) := (OTHERS => '0'); VARIABLE result : INTEGER; BEGIN tmp := SIGNED(arg1); result := TO_INTEGER( tmp, x ); RETURN (result); END ; FUNCTION conv_integer (arg1 : STD_LOGIC_VECTOR; x : INTEGER := 0 ) RETURN INTEGER IS VARIABLE tmp : SIGNED( arg1'length -1 DOWNTO 0 ) := (OTHERS => '0'); VARIABLE result : INTEGER; BEGIN tmp := SIGNED(arg1); result := TO_INTEGER( tmp, x ); RETURN (result); END ; FUNCTION conv_integer (arg1 : UNSIGNED; x : INTEGER := 0 ) RETURN NATURAL IS VARIABLE tmp : SIGNED( arg1'length DOWNTO 0 ) := (OTHERS => '0'); VARIABLE result : NATURAL; BEGIN tmp := '0' & SIGNED(arg1); result := TO_INTEGER( tmp, x ); RETURN (result); END ; FUNCTION conv_INTEGER (arg1 : SIGNED; x : INTEGER := 0 ) RETURN INTEGER IS VARIABLE return_int,x_tmp : INTEGER := 0; BEGIN ASSERT arg1'length > 0 REPORT "NULL vector, returning 0" SEVERITY NOTE; assert arg1'length > 1 report "SIGNED vector must be atleast 2 bits wide" severity ERROR; ASSERT arg1'length <= 32 -- implementation dependent limit REPORT "vector too large, conversion may cause overflow" SEVERITY WARNING; IF x /= 0 THEN x_tmp := 1; END IF; IF arg1(arg1'left) = '0' OR arg1(arg1'left) = 'L' OR -- positive value ( x_tmp = 0 AND arg1(arg1'left) /= '1' AND arg1(arg1'left) /= 'H') THEN FOR i IN arg1'range LOOP return_int := return_int * 2; CASE arg1(i) IS WHEN '0'|'L' => NULL; WHEN '1'|'H' => return_int := return_int + 1; WHEN OTHERS => return_int := return_int + x_tmp; END CASE; END LOOP; ELSE -- negative value IF (x_tmp = 0) THEN x_tmp := 1; ELSE x_tmp := 0; END IF; FOR i IN arg1'range LOOP return_int := return_int * 2; CASE arg1(i) IS WHEN '0'|'L' => return_int := return_int + 1; WHEN '1'|'H' => NULL; WHEN OTHERS => return_int := return_int + x_tmp; END CASE; END LOOP; return_int := (-return_int) - 1; END IF; RETURN return_int; END ; FUNCTION conv_integer (arg1:STD_LOGIC; x : INTEGER := 0 ) RETURN NATURAL IS BEGIN IF(arg1 = '0' OR arg1 = 'L' OR (x = 0 AND arg1 /= '1' AND arg1 /= 'H')) THEN RETURN(0); ELSE RETURN(1) ; END IF ; END ;---- Convert Base Type to STD_LOGIC-- FUNCTION to_stdlogic (arg1:BOOLEAN) RETURN STD_LOGIC IS BEGIN IF(arg1) THEN RETURN('1') ; ELSE RETURN('0') ; END IF ; END ;---- Convert Base Type to STD_LOGIC_VECTOR-- FUNCTION To_StdlogicVector (arg1 : integer; size : NATURAL) RETURN std_logic_vector IS VARIABLE vector : std_logic_vector(0 TO size-1); VARIABLE tmp_int : integer := arg1; VARIABLE carry : std_logic := '1'; -- setup to add 1 if needed VARIABLE carry2 : std_logic; BEGIN FOR i IN size-1 DOWNTO 0 LOOP IF tmp_int MOD 2 = 1 THEN vector(i) := '1'; ELSE vector(i) := '0'; END IF; tmp_int := tmp_int / 2; END LOOP; IF arg1 < 0 THEN FOR i IN size-1 DOWNTO 0 LOOP carry2 := (NOT vector(i)) AND carry; vector(i) := (NOT vector(i)) XOR carry; carry := carry2; END LOOP; END IF; RETURN vector; END To_StdlogicVector; FUNCTION To_StdUlogicVector (arg1 : integer; size : NATURAL) RETURN std_ulogic_vector IS VARIABLE vector : std_ulogic_vector(0 TO size-1); VARIABLE tmp_int : integer := arg1; VARIABLE carry : std_ulogic := '1'; -- setup to add 1 if needed VARIABLE carry2 : std_ulogic; BEGIN FOR i IN size-1 DOWNTO 0 LOOP IF tmp_int MOD 2 = 1 THEN vector(i) := '1'; ELSE vector(i) := '0'; END IF; tmp_int := tmp_int / 2; END LOOP; IF arg1 < 0 THEN FOR i IN size-1 DOWNTO 0 LOOP carry2 := (NOT vector(i)) AND carry; vector(i) := (NOT vector(i)) XOR carry; carry := carry2; END LOOP; END IF; RETURN vector; END To_StdUlogicVector; ---- Convert Base Type to UNSIGNED-- FUNCTION to_unsigned (arg1:NATURAL ; size:NATURAL) RETURN UNSIGNED IS VARIABLE vector : UNSIGNED(0 TO size-1) := (OTHERS => '0'); VARIABLE tmp_int : INTEGER := arg1; BEGIN FOR i IN size-1 DOWNTO 0 LOOP IF tmp_int MOD 2 = 1 THEN vector(i) := '1'; ELSE vector(i) := '0'; END IF; tmp_int := tmp_int / 2; END LOOP; RETURN vector; END ; FUNCTION conv_unsigned (arg1:NATURAL ; size:NATURAL) RETURN UNSIGNED IS VARIABLE vector : UNSIGNED(0 TO size-1) := (OTHERS => '0'); VARIABLE tmp_int : INTEGER := arg1; BEGIN FOR i IN size-1 DOWNTO 0 LOOP IF tmp_int MOD 2 = 1 THEN vector(i) := '1'; ELSE vector(i) := '0'; END IF; tmp_int := tmp_int / 2; END LOOP; RETURN vector; END ;---- Convert Base Type to SIGNED-- FUNCTION to_signed (arg1:INTEGER ; size : NATURAL) RETURN SIGNED IS VARIABLE vector : SIGNED(0 TO size-1) := (OTHERS => '0'); VARIABLE tmp_int : INTEGER := arg1; VARIABLE carry : STD_LOGIC := '1'; -- setup to add 1 if needed VARIABLE carry2 : STD_LOGIC := '0'; BEGIN FOR i IN size-1 DOWNTO 0 LOOP IF tmp_int MOD 2 = 1 THEN vector(i) := '1'; ELSE vector(i) := '0'; END IF; tmp_int := tmp_int / 2; END LOOP; IF arg1 < 0 THEN FOR i IN size-1 DOWNTO 0 LOOP carry2 := (NOT vector(i)) AND carry; vector(i) := (NOT vector(i)) XOR carry; carry := carry2; END LOOP; END IF; RETURN vector; END ; FUNCTION conv_signed (arg1:INTEGER ; size : NATURAL) RETURN SIGNED IS VARIABLE vector : SIGNED(0 TO size-1) := (OTHERS => '0'); VARIABLE tmp_int : INTEGER := arg1; VARIABLE carry : STD_LOGIC := '1'; -- setup to add 1 if needed VARIABLE carry2 : STD_LOGIC := '0'; BEGIN FOR i IN size-1 DOWNTO 0 LOOP IF tmp_int MOD 2 = 1 THEN vector(i) := '1'; ELSE vector(i) := '0'; END IF; tmp_int := tmp_int / 2; END LOOP; IF arg1 < 0 THEN FOR i IN size-1 DOWNTO 0 LOOP carry2 := (NOT vector(i)) AND carry; vector(i) := (NOT vector(i)) XOR carry; carry := carry2; END LOOP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -