📄 std_logic_arith_body.vhdl
字号:
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 + -