std_logic_arith_body.vhdl
来自「vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.」· VHDL 代码 · 共 1,959 行 · 第 1/5 页
VHDL
1,959 行
WHILE rt <= lt LOOP rt := shift(rt); n := shift(n); END LOOP; rt := rshift(rt); lt := lt - rt; n := rshift(n); tmp := tmp + n; END LOOP; END IF; quote := tmp(2 TO ml+1); RETURN quote; END "/"; FUNCTION "MOD" (l, r :STD_ULOGIC_VECTOR) RETURN STD_ULOGIC_VECTOR IS CONSTANT ml : INTEGER := maximum(l'length,r'length); VARIABLE lt : STD_ULOGIC_VECTOR(0 TO ml+1); VARIABLE rt : STD_ULOGIC_VECTOR(0 TO ml+1); VARIABLE quote : STD_ULOGIC_VECTOR(1 TO ml); VARIABLE tmp : STD_ULOGIC_VECTOR(0 TO ml+1) := (OTHERS=>'0'); VARIABLE n : STD_ULOGIC_VECTOR(0 TO ml) := (OTHERS=>'0'); BEGIN ASSERT NOT (r = "0") REPORT "Attempted divide by ZERO" SEVERITY ERROR; IF hasx(l) OR hasx(r) THEN FOR i IN lt'range LOOP lt(i) := 'X'; END LOOP; ELSE lt := zxt( l, ml+2 ); WHILE lt >= r LOOP rt := zxt( r, ml+2 ); WHILE rt <= lt LOOP rt := shift(rt); END LOOP; rt := rshift(rt); lt := lt - rt; END LOOP; END IF; RETURN lt(2 TO ml+1); END "MOD"; FUNCTION "MOD" (l, r :STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS CONSTANT ml : INTEGER := maximum(l'length,r'length); VARIABLE lt : STD_LOGIC_VECTOR(0 TO ml+1); VARIABLE rt : STD_LOGIC_VECTOR(0 TO ml+1); VARIABLE quote : STD_LOGIC_VECTOR(1 TO ml); VARIABLE tmp : STD_LOGIC_VECTOR(0 TO ml+1) := (OTHERS=>'0'); VARIABLE n : STD_LOGIC_VECTOR(0 TO ml) := (OTHERS=>'0'); BEGIN ASSERT NOT (r = "0") REPORT "Attempted divide by ZERO" SEVERITY ERROR; IF hasx(l) OR hasx(r) THEN FOR i IN lt'range LOOP lt(i) := 'X'; END LOOP; ELSE lt := zxt( l, ml+2 ); WHILE lt >= r LOOP rt := zxt( r, ml+2 ); WHILE rt <= lt LOOP rt := shift(rt); END LOOP; rt := rshift(rt); lt := lt - rt; END LOOP; END IF; RETURN lt(2 TO ml+1); END "MOD"; FUNCTION "MOD" (l, r :UNSIGNED) RETURN UNSIGNED IS CONSTANT ml : INTEGER := maximum(l'length,r'length); VARIABLE lt : UNSIGNED(0 TO ml+1); VARIABLE rt : UNSIGNED(0 TO ml+1); VARIABLE quote : UNSIGNED(1 TO ml); VARIABLE tmp : UNSIGNED(0 TO ml+1) := (OTHERS=>'0'); VARIABLE n : UNSIGNED(0 TO ml) := (OTHERS=>'0'); BEGIN ASSERT NOT (r = "0") REPORT "Attempted divide by ZERO" SEVERITY ERROR; IF hasx(l) OR hasx(r) THEN FOR i IN lt'range LOOP lt(i) := 'X'; END LOOP; ELSE lt := zxt( l, ml+2 ); WHILE lt >= r LOOP rt := zxt( r, ml+2 ); WHILE rt <= lt LOOP rt := shift(rt); END LOOP; rt := rshift(rt); lt := lt - rt; END LOOP; END IF; RETURN lt(2 TO ml+1); END "MOD"; FUNCTION "REM" (l, r :STD_ULOGIC_VECTOR) RETURN STD_ULOGIC_VECTOR IS CONSTANT ml : INTEGER := maximum(l'length,r'length); VARIABLE lt : STD_ULOGIC_VECTOR(0 TO ml+1); VARIABLE rt : STD_ULOGIC_VECTOR(0 TO ml+1); VARIABLE quote : STD_ULOGIC_VECTOR(1 TO ml); VARIABLE tmp : STD_ULOGIC_VECTOR(0 TO ml+1) := (OTHERS=>'0'); VARIABLE n : STD_ULOGIC_VECTOR(0 TO ml) := (OTHERS=>'0'); BEGIN ASSERT NOT (r = "0") REPORT "Attempted divide by ZERO" SEVERITY ERROR; IF hasx(l) OR hasx(r) THEN FOR i IN lt'range LOOP lt(i) := 'X'; END LOOP; ELSE lt := zxt( l, ml+2 ); WHILE lt >= r LOOP rt := zxt( r, ml+2 ); WHILE rt <= lt LOOP rt := shift(rt); END LOOP; rt := rshift(rt); lt := lt - rt; END LOOP; END IF; RETURN lt(2 TO ml+1); END "REM"; FUNCTION "REM" (l, r :STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS CONSTANT ml : INTEGER := maximum(l'length,r'length); VARIABLE lt : STD_LOGIC_VECTOR(0 TO ml+1); VARIABLE rt : STD_LOGIC_VECTOR(0 TO ml+1); VARIABLE quote : STD_LOGIC_VECTOR(1 TO ml); VARIABLE tmp : STD_LOGIC_VECTOR(0 TO ml+1) := (OTHERS=>'0'); VARIABLE n : STD_LOGIC_VECTOR(0 TO ml) := (OTHERS=>'0'); BEGIN ASSERT NOT (r = "0") REPORT "Attempted divide by ZERO" SEVERITY ERROR; IF hasx(l) OR hasx(r) THEN FOR i IN lt'range LOOP lt(i) := 'X'; END LOOP; ELSE lt := zxt( l, ml+2 ); WHILE lt >= r LOOP rt := zxt( r, ml+2 ); WHILE rt <= lt LOOP rt := shift(rt); END LOOP; rt := rshift(rt); lt := lt - rt; END LOOP; END IF; RETURN lt(2 TO ml+1); END "REM"; FUNCTION "REM" (l, r :UNSIGNED) RETURN UNSIGNED IS CONSTANT ml : INTEGER := maximum(l'length,r'length); VARIABLE lt : UNSIGNED(0 TO ml+1); VARIABLE rt : UNSIGNED(0 TO ml+1); VARIABLE quote : UNSIGNED(1 TO ml); VARIABLE tmp : UNSIGNED(0 TO ml+1) := (OTHERS=>'0'); VARIABLE n : UNSIGNED(0 TO ml) := (OTHERS=>'0'); BEGIN ASSERT NOT (r = "0") REPORT "Attempted divide by ZERO" SEVERITY ERROR; IF hasx(l) OR hasx(r) THEN FOR i IN lt'range LOOP lt(i) := 'X'; END LOOP; ELSE lt := zxt( l, ml+2 ); WHILE lt >= r LOOP rt := zxt( r, ml+2 ); WHILE rt <= lt LOOP rt := shift(rt); END LOOP; rt := rshift(rt); lt := lt - rt; END LOOP; END IF; RETURN lt(2 TO ml+1); END "REM"; FUNCTION "**" (l, r :STD_ULOGIC_VECTOR) RETURN STD_ULOGIC_VECTOR IS VARIABLE return_vector : STD_ULOGIC_VECTOR(l'range) := (OTHERS=>'0'); VARIABLE tmp : STD_ULOGIC_VECTOR(1 TO (2 * l'length)) := (OTHERS=>'0'); CONSTANT lsh_l : INTEGER := l'length+1; CONSTANT lsh_r : INTEGER := 2 * l'length; VARIABLE pow : INTEGER; BEGIN IF (hasx(l) OR hasx(r)) THEN FOR i IN return_vector'range LOOP return_vector(i) := 'X'; END LOOP; ELSE pow := to_integer( r, 0 ); tmp( tmp'right ) := '1'; FOR i IN 1 TO pow LOOP tmp := tmp(lsh_l TO lsh_r) * l; END LOOP; return_vector := tmp(lsh_l TO lsh_r); END IF; RETURN return_vector; END "**"; FUNCTION "**" (l, r :STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS VARIABLE return_vector : STD_LOGIC_VECTOR(l'range) := (OTHERS=>'0'); VARIABLE tmp : STD_LOGIC_VECTOR(1 TO (2 * l'length)) := (OTHERS=>'0'); CONSTANT lsh_l : INTEGER := l'length+1; CONSTANT lsh_r : INTEGER := 2 * l'length; VARIABLE pow : INTEGER; BEGIN IF (hasx(l) OR hasx(r)) THEN FOR i IN return_vector'range LOOP return_vector(i) := 'X'; END LOOP; ELSE pow := to_integer( r, 0 ); tmp( tmp'right ) := '1'; FOR i IN 1 TO pow LOOP tmp := tmp(lsh_l TO lsh_r) * l; END LOOP; return_vector := tmp(lsh_l TO lsh_r); END IF; RETURN return_vector; END "**"; FUNCTION "**" (l, r :UNSIGNED) RETURN UNSIGNED IS VARIABLE return_vector : UNSIGNED(l'range) := (OTHERS=>'0'); VARIABLE tmp : UNSIGNED(1 TO (2 * l'length)) := (OTHERS=>'0'); CONSTANT lsh_l : INTEGER := l'length+1; CONSTANT lsh_r : INTEGER := 2 * l'length; VARIABLE pow : INTEGER; BEGIN IF (hasx(l) OR hasx(r)) THEN FOR i IN return_vector'range LOOP return_vector(i) := 'X'; END LOOP; ELSE pow := to_integer( r, 0 ); tmp( tmp'right ) := '1'; FOR i IN 1 TO pow LOOP tmp := tmp(lsh_l TO lsh_r) * l; END LOOP; return_vector := tmp(lsh_l TO lsh_r); END IF; RETURN return_vector; END "**"; ---- Absolute Value Functions-- FUNCTION "abs" (arg1:SIGNED) RETURN SIGNED IS constant len : integer := arg1'length; VARIABLE answer, tmp : SIGNED( len-1 downto 0 ) := (others=>'0'); VARIABLE index : integer := len; BEGIN assert arg1'length > 1 report "SIGNED vector must be atleast 2 bits wide" severity ERROR; IF hasx(arg1) THEN answer := (OTHERS => 'X'); ELSIF (arg1(arg1'left) = '0' OR arg1(arg1'left) = 'L') THEN answer := arg1; ELSE tmp := arg1; lp1 : FOR i IN answer'REVERSE_RANGE LOOP IF (tmp(i) = '1' OR tmp(i) = 'H') THEN index := i+1; answer(i downto 0) := tmp(i downto 0); exit; END IF; END LOOP lp1; answer(len-1 downto index) := NOT tmp(len-1 downto index); end if; RETURN (answer); END ;---- Shift Left (arithmetic) Functions-- FUNCTION "sla" (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 => arg1(arg1'right)); 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 "sla" (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 => arg1(arg1'right)); 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 "sla" (arg1:UNSIGNED ; arg2:NATURAL) RETURN UNSIGNED IS CONSTANT len : INTEGER := arg1'length ; CONSTANT se : UNSIGNED(1 to len) := (others => arg1(arg1'right)); 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 "sla" (arg1:SIGNED ; arg2:NATURAL) RETURN SIGNED IS CONSTANT len : INTEGER := arg1'length ; CONSTANT se : SIGNED(1 to len) := (others => arg1(arg1'right)); 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 (arithmetics) Functions-- FUNCTION "sra" (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 => arg1(arg1'left)); 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 "sra" (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 => arg1(arg1'left)); 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 ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?