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

📄 std_logic_1164_body.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 3 页
字号:
-- ------------------------------------------------------------------------   Title     :  std_logic_1164 multi-value logic system--   Library   :  This package shall be compiled into a library--             :  symbolically named IEEE.--             :--   Developers:  IEEE model standards group (par 1164)--   Purpose   :  This packages defines a standard for designers--             :  to use in describing the interconnection data types--             :  used in vhdl modeling.--             :--   Limitation:  The logic system defined in this package may--             :  be insufficient for modeling switched transistors,--             :  since such a requirement is out of the scope of this--             :  effort. Furthermore, mathematics, primitives,--             :  timing standards, etc. are considered orthogonal--             :  issues as it relates to this package and are therefore--             :  beyond the scope of this effort.--             :--   Note      :  No declarations or definitions shall be included in,--             :  or excluded from this package. The "package declaration"--             :  defines the types, subtypes and declarations of--             :  std_logic_1164. The std_logic_1164 package body shall be--             :  considered the formal definition of the semantics of--             :  this package. Tool developers may choose to implement--             :  the package body in the most efficient manner available--             :  to them.--             :-- ----------------------------------------------------------------------   modification history :-- ----------------------------------------------------------------------  version | mod. date:|--   v4.200 | 01/02/91  |-- --------------------------------------------------------------------PACKAGE BODY std_logic_1164 IS    -------------------------------------------------------------------    -- local types    -------------------------------------------------------------------    TYPE stdlogic_1d IS ARRAY (std_ulogic) OF std_ulogic;    TYPE stdlogic_table IS ARRAY(std_ulogic, std_ulogic) OF std_ulogic;    -------------------------------------------------------------------    -- resolution function    -------------------------------------------------------------------    CONSTANT resolution_table : stdlogic_table := (    --      ---------------------------------------------------------    --      |  U    X    0    1    Z    W    L    H    -        |   |    --      ---------------------------------------------------------            ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |            ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |            ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |            ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |            ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |            ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |            ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' )  -- | - |        );    FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic IS        VARIABLE result : std_ulogic := 'Z';  -- weakest state default    BEGIN        -- the test for a single driver is essential otherwise the        -- loop would return 'X' for a single driver of '-' and that        -- would conflict with the value of a single driver unresolved        -- signal.        IF    (s'LENGTH = 1) THEN    RETURN s(s'LOW);        ELSE            FOR i IN s'RANGE LOOP                result := resolution_table(result, s(i));            END LOOP;        END IF;        RETURN result;    END resolved;    -------------------------------------------------------------------    -- tables for logical operations    -------------------------------------------------------------------    -- truth table for "and" function    CONSTANT and_table : stdlogic_table := (    --      ----------------------------------------------------    --      |  U    X    0    1    Z    W    L    H    -         |   |    --      ----------------------------------------------------            ( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ),  -- | U |            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | X |            ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | 0 |            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | 1 |            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | Z |            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | W |            ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | L |            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | H |            ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' )   -- | - |    );    -- truth table for "or" function    CONSTANT or_table : stdlogic_table := (    --      ----------------------------------------------------    --      |  U    X    0    1    Z    W    L    H    -         |   |    --      ----------------------------------------------------            ( 'U', 'U', 'U', '1', 'U', 'U', 'U', '1', 'U' ),  -- | U |            ( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ),  -- | X |            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | 0 |            ( '1', '1', '1', '1', '1', '1', '1', '1', '1' ),  -- | 1 |            ( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ),  -- | Z |            ( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' ),  -- | W |            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | L |            ( '1', '1', '1', '1', '1', '1', '1', '1', '1' ),  -- | H |            ( 'U', 'X', 'X', '1', 'X', 'X', 'X', '1', 'X' )   -- | - |    );    -- truth table for "xor" function    CONSTANT xor_table : stdlogic_table := (    --      ----------------------------------------------------    --      |  U    X    0    1    Z    W    L    H    -         |   |    --      ----------------------------------------------------            ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ),  -- | U |            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ),  -- | X |            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | 0 |            ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' ),  -- | 1 |            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ),  -- | Z |            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ),  -- | W |            ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | L |            ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' ),  -- | H |            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' )   -- | - |    );    -- truth table for "not" function    CONSTANT not_table: stdlogic_1d :=    --  -------------------------------------------------    --  |   U    X    0    1    Z    W    L    H    -   |    --  -------------------------------------------------         ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );    -------------------------------------------------------------------    -- overloaded logical operators ( with optimizing hints )    -------------------------------------------------------------------    FUNCTION "and"  ( l : std_ulogic; r : std_ulogic ) RETURN UX01 IS    BEGIN        RETURN (and_table(l, r));    END "and";    FUNCTION "nand" ( l : std_ulogic; r : std_ulogic ) RETURN UX01 IS    BEGIN        RETURN  (not_table ( and_table(l, r)));    END "nand";    FUNCTION "or"   ( l : std_ulogic; r : std_ulogic ) RETURN UX01 IS    BEGIN        RETURN (or_table(l, r));    END "or";    FUNCTION "nor"  ( l : std_ulogic; r : std_ulogic ) RETURN UX01 IS    BEGIN        RETURN  (not_table ( or_table( l, r )));    END "nor";    FUNCTION "xor"  ( l : std_ulogic; r : std_ulogic ) RETURN UX01 IS    BEGIN        RETURN (xor_table(l, r));    END "xor";--START-V93    FUNCTION "xnor"  ( l : std_ulogic; r : std_ulogic ) RETURN UX01 IS    BEGIN        RETURN not_table(xor_table(l, r));    END "xnor";--END-V93    FUNCTION "not"  ( l : std_ulogic ) RETURN UX01 IS    BEGIN        RETURN (not_table(l));    END "not";    -------------------------------------------------------------------    -- and    -------------------------------------------------------------------    FUNCTION "and"  ( l,r : std_logic_vector ) RETURN std_logic_vector IS        ALIAS lv : std_logic_vector ( 1 TO l'LENGTH ) IS l;        ALIAS rv : std_logic_vector ( 1 TO r'LENGTH ) IS r;        VARIABLE result : std_logic_vector ( 1 TO l'LENGTH );    BEGIN        IF ( l'LENGTH /= r'LENGTH ) THEN            ASSERT FALSE            REPORT "arguments of overloaded 'and' operator are not of the same length"            SEVERITY FAILURE;        ELSE            FOR i IN result'RANGE LOOP                result(i) := and_table (lv(i), rv(i));            END LOOP;        END IF;        RETURN result;    END "and";    ---------------------------------------------------------------------    FUNCTION "and"  ( l,r : std_ulogic_vector ) RETURN std_ulogic_vector IS        ALIAS lv : std_ulogic_vector ( 1 TO l'LENGTH ) IS l;        ALIAS rv : std_ulogic_vector ( 1 TO r'LENGTH ) IS r;        VARIABLE result : std_ulogic_vector ( 1 TO l'LENGTH );    BEGIN        IF ( l'LENGTH /= r'LENGTH ) THEN            ASSERT FALSE            REPORT "arguments of overloaded 'and' operator are not of the same length"            SEVERITY FAILURE;        ELSE            FOR i IN result'RANGE LOOP                result(i) := and_table (lv(i), rv(i));            END LOOP;        END IF;        RETURN result;    END "and";    -------------------------------------------------------------------    -- nand    -------------------------------------------------------------------    FUNCTION "nand"  ( l,r : std_logic_vector ) RETURN std_logic_vector IS        ALIAS lv : std_logic_vector ( 1 TO l'LENGTH ) IS l;        ALIAS rv : std_logic_vector ( 1 TO r'LENGTH ) IS r;        VARIABLE result : std_logic_vector ( 1 TO l'LENGTH );    BEGIN        IF ( l'LENGTH /= r'LENGTH ) THEN            ASSERT FALSE            REPORT "arguments of overloaded 'nand' operator are not of the same length"            SEVERITY FAILURE;        ELSE            FOR i IN result'RANGE LOOP                result(i) := not_table(and_table (lv(i), rv(i)));            END LOOP;        END IF;        RETURN result;    END "nand";    ---------------------------------------------------------------------    FUNCTION "nand"  ( l,r : std_ulogic_vector ) RETURN std_ulogic_vector IS        ALIAS lv : std_ulogic_vector ( 1 TO l'LENGTH ) IS l;        ALIAS rv : std_ulogic_vector ( 1 TO r'LENGTH ) IS r;        VARIABLE result : std_ulogic_vector ( 1 TO l'LENGTH );    BEGIN        IF ( l'LENGTH /= r'LENGTH ) THEN            ASSERT FALSE            REPORT "arguments of overloaded 'nand' operator are not of the same length"            SEVERITY FAILURE;        ELSE            FOR i IN result'RANGE LOOP                result(i) := not_table(and_table (lv(i), rv(i)));            END LOOP;        END IF;        RETURN result;    END "nand";    -------------------------------------------------------------------    -- or    -------------------------------------------------------------------    FUNCTION "or"  ( l,r : std_logic_vector ) RETURN std_logic_vector IS        ALIAS lv : std_logic_vector ( 1 TO l'LENGTH ) IS l;        ALIAS rv : std_logic_vector ( 1 TO r'LENGTH ) IS r;        VARIABLE result : std_logic_vector ( 1 TO l'LENGTH );    BEGIN        IF ( l'LENGTH /= r'LENGTH ) THEN            ASSERT FALSE            REPORT "arguments of overloaded 'or' operator are not of the same length"            SEVERITY FAILURE;        ELSE            FOR i IN result'RANGE LOOP                result(i) := or_table (lv(i), rv(i));            END LOOP;        END IF;        RETURN result;    END "or";    ---------------------------------------------------------------------    FUNCTION "or"  ( l,r : std_ulogic_vector ) RETURN std_ulogic_vector IS        ALIAS lv : std_ulogic_vector ( 1 TO l'LENGTH ) IS l;        ALIAS rv : std_ulogic_vector ( 1 TO r'LENGTH ) IS r;        VARIABLE result : std_ulogic_vector ( 1 TO l'LENGTH );    BEGIN        IF ( l'LENGTH /= r'LENGTH ) THEN            ASSERT FALSE            REPORT "arguments of overloaded 'or' operator are not of the same length"            SEVERITY FAILURE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -