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 + -
显示快捷键?