⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 std_logic_arith_body.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 5 页
字号:
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 + -