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

📄 std_logic_arith_body.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 5 页
字号:
  FUNCTION "sra" (arg1:UNSIGNED ; arg2:NATURAL)  RETURN UNSIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : UNSIGNED(1 to len) := (others => arg1(arg1'left));     VARIABLE ans : UNSIGNED(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (se(1 to arg2) & ans(1 to len-arg2));    END IF;  END ;  FUNCTION "sra" (arg1:SIGNED   ; arg2:NATURAL)  RETURN SIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : SIGNED(1 to len) := (others => arg1(arg1'left));     VARIABLE ans : SIGNED(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (se(1 to arg2) & ans(1 to len-arg2));    END IF;  END ;---- Shift Left (logical) Functions--  FUNCTION "sll" (arg1:STD_ULOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_ULOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : std_ulogic_vector(1 to len) := (others =>'0');     VARIABLE ans : STD_ULOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(arg2+1 to len) & se(1 to arg2));    END IF;  END ;  FUNCTION "sll" (arg1:STD_LOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_LOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : std_logic_vector(1 to len) := (others =>'0');     VARIABLE ans : STD_LOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(arg2+1 to len) & se(1 to arg2));    END IF;  END ;  FUNCTION "sll" (arg1:UNSIGNED ; arg2:NATURAL)  RETURN UNSIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : UNSIGNED(1 to len) := (others =>'0');     VARIABLE ans : UNSIGNED(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(arg2+1 to len) & se(1 to arg2));    END IF;  END ;  FUNCTION "sll" (arg1:SIGNED   ; arg2:NATURAL)  RETURN SIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : SIGNED(1 to len) := (others =>'0');     VARIABLE ans : SIGNED(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(arg2+1 to len) & se(1 to arg2));    END IF;  END ;---- Shift Right (logical) Functions--  FUNCTION "srl" (arg1:STD_ULOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_ULOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : std_ulogic_vector(1 to len) := (others => '0');     VARIABLE ans : STD_ULOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (se(1 to arg2) & ans(1 to len-arg2));    END IF;  END ;  FUNCTION "srl" (arg1:STD_LOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_LOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : std_logic_vector(1 to len) := (others => '0');     VARIABLE ans : STD_LOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (se(1 to arg2) & ans(1 to len-arg2));    END IF;  END ;  FUNCTION "srl" (arg1:UNSIGNED ; arg2:NATURAL)  RETURN UNSIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : UNSIGNED(1 to len) := (others => '0');     VARIABLE ans : UNSIGNED(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (se(1 to arg2) & ans(1 to len-arg2));    END IF;  END ;  FUNCTION "srl" (arg1:SIGNED   ; arg2:NATURAL)  RETURN SIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT se : SIGNED(1 to len) := (others => '0');     VARIABLE ans : SIGNED(1 to len) := arg1;  BEGIN    IF (arg2 >= len) THEN      RETURN (se);    ELSIF (arg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (se(1 to arg2) & ans(1 to len-arg2));    END IF;  END ;---- Rotate Left (Logical) Functions--  FUNCTION "rol" (arg1:STD_ULOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_ULOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : STD_ULOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(marg2+1 to len) & ans(1 to marg2));    END IF;  END ;  FUNCTION "rol" (arg1:STD_LOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_LOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : STD_LOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(marg2+1 to len) & ans(1 to marg2));    END IF;  END ;  FUNCTION "rol" (arg1:UNSIGNED ; arg2:NATURAL)  RETURN UNSIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : UNSIGNED(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(marg2+1 to len) & ans(1 to marg2));    END IF;  END ;  FUNCTION "rol" (arg1:SIGNED   ; arg2:NATURAL)  RETURN SIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : SIGNED(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(marg2+1 to len) & ans(1 to marg2));    END IF;  END ;---- Rotate Right (Logical) Functions--  FUNCTION "ror" (arg1:STD_ULOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_ULOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : STD_ULOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(len-marg2+1 to len) & ans(1 to len-marg2));    END IF;  END ;  FUNCTION "ror" (arg1:STD_LOGIC_VECTOR ; arg2:NATURAL)  RETURN STD_LOGIC_VECTOR IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : STD_LOGIC_VECTOR(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(len-marg2+1 to len) & ans(1 to len-marg2));    END IF;  END ;  FUNCTION "ror" (arg1:UNSIGNED ; arg2:NATURAL)  RETURN UNSIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : UNSIGNED(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(len-marg2+1 to len) & ans(1 to len-marg2));    END IF;  END ;  FUNCTION "ror" (arg1:SIGNED   ; arg2:NATURAL)  RETURN SIGNED IS     CONSTANT len : INTEGER := arg1'length ;     CONSTANT marg2 : integer := arg2 mod len;     VARIABLE ans : SIGNED(1 to len) := arg1;  BEGIN    IF (marg2 = 0) THEN      RETURN (arg1);    ELSE      RETURN (ans(len-marg2+1 to len) & ans(1 to len-marg2));    END IF;  END ;---- Equal functions.--    CONSTANT eq_table : stdlogic_boolean_table := (    --      ----------------------------------------------------------------------------    --      |  U       X      0     1      Z      W      L      H      D         |   |      --      ----------------------------------------------------------------------------    ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | U |    ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | X |    ( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ),  -- | 0 |    ( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ),  -- | 1 |    ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | Z |    ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | W |    ( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ),  -- | L |    ( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ),  -- | H |    ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE )   -- | D |    );    FUNCTION eq  ( l, r : STD_LOGIC ) RETURN BOOLEAN IS    BEGIN        RETURN eq_table( l, r );    END;    FUNCTION eq  ( l,r : STD_ULOGIC_VECTOR ) RETURN BOOLEAN IS        CONSTANT ml  : INTEGER := maximum( l'length, r'length );        VARIABLE lt  : STD_ULOGIC_VECTOR ( 1 TO ml );        VARIABLE rt  : STD_ULOGIC_VECTOR ( 1 TO ml );    BEGIN        lt := zxt( l, ml );        rt := zxt( r, ml );        FOR i IN lt'range LOOP            IF NOT eq( lt(i), rt(i) ) THEN               RETURN FALSE;            END IF;        END LOOP;        RETURN TRUE;    END;    FUNCTION eq  ( l,r : STD_LOGIC_VECTOR ) RETURN BOOLEAN IS        CONSTANT ml  : INTEGER := maximum( l'length, r'length );        VARIABLE lt  : STD_LOGIC_VECTOR ( 1 TO ml );        VARIABLE rt  : STD_LOGIC_VECTOR ( 1 TO ml );    BEGIN        lt := zxt( l, ml );        rt := zxt( r, ml );        FOR i IN lt'range LOOP            IF NOT eq( lt(i), rt(i) ) THEN               RETURN FALSE;            END IF;        END LOOP;        RETURN TRUE;    END;    FUNCTION eq  ( l,r : UNSIGNED ) RETURN BOOLEAN IS        CONSTANT ml  : INTEGER := maximum( l'length, r'length );        VARIABLE lt  : UNSIGNED ( 1 TO ml );        VARIABLE rt  : UNSIGNED ( 1 TO ml );    BEGIN        lt := zxt( l, ml );        rt := zxt( r, ml );        FOR i IN lt'range LOOP            IF NOT eq( lt(i), rt(i) ) THEN               RETURN FALSE;            END IF;        END LOOP;        RETURN TRUE;    END;    FUNCTION eq  ( l,r : SIGNED ) RETURN BOOLEAN IS        CONSTANT len  : INTEGER := maximum( l'length, r'length );        VARIABLE lt, rt  : UNSIGNED ( len-1 downto 0 ) := (OTHERS => '0');    BEGIN         assert l'length > 1 AND r'length > 1           report "SIGNED vector must be atleast 2 bits wide"           severity ERROR;      lt := (OTHERS => l(l'left)) ;      lt(l'length - 1 DOWNTO 0) := UNSIGNED(l);      rt := (OTHERS => r(r'left)) ;      rt(r'length - 1 DOWNTO 0) := UNSIGNED(r);      RETURN (eq( lt, rt ));    END;    FUNCTION "="  ( l,r : UNSIGNED ) RETURN BOOLEAN IS        CONSTANT ml  : INTEGER := maximum( l'length, r'length );        VARIABLE lt  : UNSIGNED ( 1 TO ml );        VARIABLE rt  : UNSIGNED ( 1 TO ml );    BEGIN        lt := zxt( l, ml );        rt := zxt( r, ml );        FOR i IN lt'range LOOP            IF NOT eq( lt(i), rt(i) ) THEN               RETURN FALSE;            END IF;        END LOOP;        RETURN TRUE;    END;    FUNCTION "="  ( l,r : SIGNED ) RETURN BOOLEAN IS        CONSTANT len  : INTEGER := maximum( l'length, r'length );        VARIABLE lt, rt  : UNSIGNED ( len-1 downto 0 ) := (OTHERS => '0');    BEGIN         assert l'length > 1 AND r'length > 1           report "SIGNED vector must be atleast 2 bits wide"           severity ERROR;      lt := (OTHERS => l(l'left)) ;      lt(l'length - 1 DOWNTO 0) := UNSIGNED(l);      rt := (OTHERS => r(r'left)) ;      rt(r'length - 1 DOWNTO 0) := UNSIGNED(r);      RETURN (eq( lt, rt ));    END;---- Not Equal function.--  CONSTANT neq_table : stdlogic_boolean_table := (  --      ----------------------------------------------------------------------------  --      |  U       X      0     1      Z      W      L      H      D         |   |    --      ----------------------------------------------------------------------------  ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | U |  ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | X |  ( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ),  -- | 0 |  ( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ),  -- | 1 |  ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | Z |  ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ),  -- | W |  ( FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE ),  -- | L |  ( FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE ),  -- | H |  ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE )   -- | D |  );    FUNCTION ne  ( l, r : STD_LOGIC ) RETURN BOOLEAN IS    BEGIN        RETURN neq_table( l, r );    END;    FUNCTION ne  ( l,r : STD_ULOGIC_VECTOR ) RETURN BOOLEAN IS        CONSTANT ml  : INTEGER := maximum( l'length, r'length );        VARIABLE lt  : STD_ULOGIC_VECTOR ( 1 TO ml );        VARIABLE rt  : STD_ULOGIC_VECTOR ( 1 TO ml );    BEGIN        lt := zxt( l, ml );        rt

⌨️ 快捷键说明

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