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

📄 numeric_bit-body.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 4 页
字号:
    alias XL: UNSIGNED(L_LEFT downto 0) is L;    alias XR: UNSIGNED(R_LEFT downto 0) is R;    variable RESULT: UNSIGNED((L'LENGTH+R'LENGTH-1) downto 0) := (others => '0');    variable ADVAL: UNSIGNED((L'LENGTH+R'LENGTH-1) downto 0);  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAU;    end if;    ADVAL := RESIZE(XR, RESULT'LENGTH);    for I in 0 to L_LEFT loop      if XL(I)='1' then RESULT := RESULT + ADVAL;      end if;      ADVAL := SHIFT_LEFT(ADVAL, 1);    end loop;    return RESULT;  end "*";  -- Id: A.16  function "*" (L, R: SIGNED) return SIGNED is    constant L_LEFT: INTEGER := L'LENGTH-1;    constant R_LEFT: INTEGER := R'LENGTH-1;    variable XL: SIGNED(L_LEFT downto 0);    variable XR: SIGNED(R_LEFT downto 0);    variable RESULT: SIGNED((L_LEFT+R_LEFT+1) downto 0) := (others => '0');    variable ADVAL: SIGNED((L_LEFT+R_LEFT+1) downto 0);  begin    if ((L_LEFT < 0) or (R_LEFT < 0)) then return NAS;    end if;    XL := L;    XR := R;    ADVAL := RESIZE(XR, RESULT'LENGTH);    for I in 0 to L_LEFT-1 loop      if XL(I)='1' then RESULT := RESULT + ADVAL;      end if;      ADVAL := SHIFT_LEFT(ADVAL, 1);    end loop;    if XL(L_LEFT)='1' then      RESULT := RESULT - ADVAL;    end if;    return RESULT;  end "*";  -- Id: A.17  function "*" (L: UNSIGNED; R: NATURAL) return UNSIGNED is  begin    return L * TO_UNSIGNED(R, L'LENGTH);  end "*";  -- Id: A.18  function "*" (L: NATURAL; R: UNSIGNED) return UNSIGNED is  begin    return TO_UNSIGNED(L, R'LENGTH) * R;  end "*";  -- Id: A.19  function "*" (L: SIGNED; R: INTEGER) return SIGNED is  begin    return L * TO_SIGNED(R, L'LENGTH);  end "*";  -- Id: A.20  function "*" (L: INTEGER; R: SIGNED) return SIGNED is  begin    return TO_SIGNED(L, R'LENGTH) * R;  end "*";  --============================================================================  -- Id: A.21  function "/" (L, R: UNSIGNED) return UNSIGNED is    variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0);    variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0);  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAU;    end if;    DIVMOD(L, R, FQUOT, FREMAIN);    return FQUOT;  end "/";  -- Id: A.22  function "/" (L, R: SIGNED) return SIGNED is    variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0);    variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0);    variable XNUM: UNSIGNED(L'LENGTH-1 downto 0);    variable XDENOM: UNSIGNED(R'LENGTH-1 downto 0);    variable QNEG: BOOLEAN := FALSE;  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAS;    end if;    if L(L'LEFT)='1' then      XNUM := UNSIGNED(-L);      QNEG := TRUE;    else      XNUM := UNSIGNED(L);    end if;    if R(R'LEFT)='1' then      XDENOM := UNSIGNED(-R);      QNEG := not QNEG;    else      XDENOM := UNSIGNED(R);    end if;    DIVMOD(XNUM, XDENOM, FQUOT, FREMAIN);    if QNEG then FQUOT := "0"-FQUOT;    end if;    return SIGNED(FQUOT);  end "/";  -- Id: A.23  function "/" (L: UNSIGNED; R: NATURAL) return UNSIGNED is    constant R_LENGTH: NATURAL := MAX(L'LENGTH, UNSIGNED_NUM_BITS(R));    variable XR, QUOT: UNSIGNED(R_LENGTH-1 downto 0);  begin    if (L'LENGTH < 1) then return NAU;    end if;    if (R_LENGTH > L'LENGTH) then      QUOT := (others => '0');      return RESIZE(QUOT, L'LENGTH);    end if;    XR := TO_UNSIGNED(R, R_LENGTH);    QUOT := RESIZE((L / XR), QUOT'LENGTH);    return RESIZE(QUOT, L'LENGTH);  end "/";  -- Id: A.24  function "/" (L: NATURAL; R: UNSIGNED) return UNSIGNED is    constant L_LENGTH: NATURAL := MAX(UNSIGNED_NUM_BITS(L), R'LENGTH);    variable XL, QUOT: UNSIGNED(L_LENGTH-1 downto 0);  begin    if (R'LENGTH < 1) then return NAU;    end if;    XL := TO_UNSIGNED(L, L_LENGTH);    QUOT := RESIZE((XL / R), QUOT'LENGTH);    if L_LENGTH > R'LENGTH        and QUOT(L_LENGTH-1 downto R'LENGTH)        /= (L_LENGTH-1 downto R'LENGTH => '0')        then      assert NO_WARNING report "NUMERIC_BIT.""/"": Quotient Truncated"          severity WARNING;    end if;    return RESIZE(QUOT, R'LENGTH);  end "/";  -- Id: A.25  function "/" (L: SIGNED; R: INTEGER) return SIGNED is    constant R_LENGTH: NATURAL := MAX(L'LENGTH, SIGNED_NUM_BITS(R));    variable XR, QUOT: SIGNED(R_LENGTH-1 downto 0);  begin    if (L'LENGTH < 1) then return NAS;    end if;    if (R_LENGTH > L'LENGTH) then      QUOT := (others => '0');      return RESIZE(QUOT, L'LENGTH);    end if;    XR := TO_SIGNED(R, R_LENGTH);    QUOT := RESIZE((L / XR), QUOT'LENGTH);    return RESIZE(QUOT, L'LENGTH);  end "/";  -- Id: A.26  function "/" (L: INTEGER; R: SIGNED) return SIGNED is    constant L_LENGTH: NATURAL := MAX(SIGNED_NUM_BITS(L), R'LENGTH);    variable XL, QUOT: SIGNED(L_LENGTH-1 downto 0);  begin    if (R'LENGTH < 1) then return NAS;    end if;    XL := TO_SIGNED(L, L_LENGTH);    QUOT := RESIZE((XL / R), QUOT'LENGTH);    if L_LENGTH > R'LENGTH and QUOT(L_LENGTH-1 downto R'LENGTH)        /= (L_LENGTH-1 downto R'LENGTH => QUOT(R'LENGTH-1))        then      assert NO_WARNING report "NUMERIC_BIT.""/"": Quotient Truncated"          severity WARNING;    end if;    return RESIZE(QUOT, R'LENGTH);  end "/";  --============================================================================  -- Id: A.27  function "rem" (L, R: UNSIGNED) return UNSIGNED is    variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0);    variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0);  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAU;    end if;    DIVMOD(L, R, FQUOT, FREMAIN);    return FREMAIN;  end "rem";  -- Id: A.28  function "rem" (L, R: SIGNED) return SIGNED is    variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0);    variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0);    variable XNUM: UNSIGNED(L'LENGTH-1 downto 0);    variable XDENOM: UNSIGNED(R'LENGTH-1 downto 0);    variable RNEG: BOOLEAN := FALSE;  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAS;    end if;    if L(L'LEFT)='1' then      XNUM := UNSIGNED(-L);      RNEG := TRUE;    else      XNUM := UNSIGNED(L);    end if;    if R(R'LEFT)='1' then      XDENOM := UNSIGNED(-R);    else      XDENOM := UNSIGNED(R);    end if;    DIVMOD(XNUM, XDENOM, FQUOT, FREMAIN);    if RNEG then      FREMAIN := "0"-FREMAIN;    end if;    return SIGNED(FREMAIN);  end "rem";  -- Id: A.29  function "rem" (L: UNSIGNED; R: NATURAL) return UNSIGNED is    constant R_LENGTH: NATURAL := MAX(L'LENGTH, UNSIGNED_NUM_BITS(R));    variable XR, XREM: UNSIGNED(R_LENGTH-1 downto 0);  begin    if (L'LENGTH < 1) then return NAU;    end if;    XR := TO_UNSIGNED(R, R_LENGTH);    XREM := RESIZE((L rem XR), XREM'LENGTH);    if R_LENGTH > L'LENGTH and XREM(R_LENGTH-1 downto L'LENGTH)        /= (R_LENGTH-1 downto L'LENGTH => '0')        then      assert NO_WARNING report "NUMERIC_BIT.""rem"": Remainder Truncated"          severity WARNING;    end if;    return RESIZE(XREM, L'LENGTH);  end "rem";  -- Id: A.30  function "rem" (L: NATURAL; R: UNSIGNED) return UNSIGNED is    constant L_LENGTH: NATURAL := MAX(UNSIGNED_NUM_BITS(L), R'LENGTH);    variable XL, XREM: UNSIGNED(L_LENGTH-1 downto 0);  begin    if (R'LENGTH < 1) then return NAU;    end if;    XL := TO_UNSIGNED(L, L_LENGTH);    XREM := RESIZE((XL rem R), XREM'LENGTH);    if L_LENGTH > R'LENGTH and XREM(L_LENGTH-1 downto R'LENGTH)        /= (L_LENGTH-1 downto R'LENGTH => '0')        then      assert NO_WARNING report "NUMERIC_BIT.""rem"": Remainder Truncated"          severity WARNING;    end if;    return RESIZE(XREM, R'LENGTH);  end "rem";  -- Id: A.31  function "rem" (L: SIGNED; R: INTEGER) return SIGNED is    constant R_LENGTH: NATURAL := MAX(L'LENGTH, SIGNED_NUM_BITS(R));    variable XR, XREM: SIGNED(R_LENGTH-1 downto 0);  begin    if (L'LENGTH < 1) then return NAS;    end if;    XR := TO_SIGNED(R, R_LENGTH);    XREM := RESIZE((L rem XR), XREM'LENGTH);    if R_LENGTH > L'LENGTH and XREM(R_LENGTH-1 downto L'LENGTH)        /= (R_LENGTH-1 downto L'LENGTH => XREM(L'LENGTH-1))        then      assert NO_WARNING report "NUMERIC_BIT.""rem"": Remainder Truncated"          severity WARNING;    end if;    return RESIZE(XREM, L'LENGTH);  end "rem";  -- Id: A.32  function "rem" (L: INTEGER; R: SIGNED) return SIGNED is    constant L_LENGTH: NATURAL := MAX(SIGNED_NUM_BITS(L), R'LENGTH);    variable XL, XREM: SIGNED(L_LENGTH-1 downto 0);  begin    if (R'LENGTH < 1) then return NAS;    end if;    XL := TO_SIGNED(L, L_LENGTH);    XREM := RESIZE((XL rem R), XREM'LENGTH);    if L_LENGTH > R'LENGTH and XREM(L_LENGTH-1 downto R'LENGTH)        /= (L_LENGTH-1 downto R'LENGTH => XREM(R'LENGTH-1))        then      assert NO_WARNING report "NUMERIC_BIT.""rem"": Remainder Truncated"          severity WARNING;    end if;    return RESIZE(XREM, R'LENGTH);  end "rem";  --============================================================================  -- Id: A.33  function "mod" (L, R: UNSIGNED) return UNSIGNED is    variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0);    variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0);  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAU;    end if;    DIVMOD(L, R, FQUOT, FREMAIN);    return FREMAIN;  end "mod";  -- Id: A.34  function "mod" (L, R: SIGNED) return SIGNED is    variable FQUOT: UNSIGNED(L'LENGTH-1 downto 0);    variable FREMAIN: UNSIGNED(R'LENGTH-1 downto 0);    variable XNUM: UNSIGNED(L'LENGTH-1 downto 0);    variable XDENOM: UNSIGNED(R'LENGTH-1 downto 0);    variable RNEG: BOOLEAN := FALSE;  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAS;    end if;    if L(L'LEFT)='1' then      XNUM := UNSIGNED(-L);    else      XNUM := UNSIGNED(L);    end if;    if R(R'LEFT)='1' then      XDENOM := UNSIGNED(-R);      RNEG := TRUE;    else      XDENOM := UNSIGNED(R);    end if;    DIVMOD(XNUM, XDENOM, FQUOT, FREMAIN);    if RNEG and L(L'LEFT)='1' then      FREMAIN := "0"-FREMAIN;      elsif RNEG and FREMAIN/="0" then          FREMAIN := FREMAIN-XDENOM;      elsif L(L'LEFT)='1' and FREMAIN/="0" then          FREMAIN := XDENOM-FREMAIN;    end if;    return SIGNED(FREMAIN);  end "mod";  -- Id: A.35  function "mod" (L: UNSIGNED; R: NATURAL) return UNSIGNED is    constant R_LENGTH: NATURAL := MAX(L'LENGTH, UNSIGNED_NUM_BITS(R));    variable XR, XREM: UNSIGNED(R_LENGTH-1 downto 0);  begin    if (L'LENGTH < 1) then return NAU;    end if;    XR := TO_UNSIGNED(R, R_LENGTH);    XREM := RESIZE((L mod XR), XREM'LENGTH);    if R_LENGTH > L'LENGTH and XREM(R_LENGTH-1 downto L'LENGTH)        /= (R_LENGTH-1 downto L'LENGTH => '0')        then      assert NO_WARNING report "NUMERIC_BIT.""mod"": modulus Truncated"          severity WARNING;    end if;    return RESIZE(XREM, L'LENGTH);  end "mod";  -- Id: A.36  function "mod" (L: NATURAL; R: UNSIGNED) return UNSIGNED is    constant L_LENGTH: NATURAL := MAX(UNSIGNED_NUM_BITS(L), R'LENGTH);    variable XL, XREM: UNSIGNED(L_LENGTH-1 downto 0);  begin    if (R'LENGTH < 1) then return NAU;    end if;    XL := TO_UNSIGNED(L, L_LENGTH);    XREM := RESIZE((XL mod R), XREM'LENGTH);    if L_LENGTH > R'LENGTH and XREM(L_LENGTH-1 downto R'LENGTH)        /= (L_LENGTH-1 downto R'LENGTH => '0')        then      assert NO_WARNING report "NUMERIC_BIT.""mod"": modulus Truncated"          severity WARNING;    end if;    return RESIZE(XREM, R'LENGTH);  end "mod";  -- Id: A.37  function "mod" (L: SIGNED; R: INTEGER) return SIGNED is    constant R_LENGTH: NATURAL := MAX(L'LENGTH, SIGNED_NUM_BITS(R));    variable XR, XREM: SIGNED(R_LENGTH-1 downto 0);  begin    if (L'LENGTH < 1) then return NAS;    end if;    XR := TO_SIGNED(R, R_LENGTH);    XREM := RESIZE((L mod XR), XREM'LENGTH);    if R_LENGTH > L'LENGTH and XREM(R_LENGTH-1 downto L'LENGTH)        /= (R_LENGTH-1 downto L'LENGTH => XREM(L'LENGTH-1))        then      assert NO_WARNING report "NUMERIC_BIT.""mod"": modulus Truncated"          severity WARNING;    end if;    return RESIZE(XREM, L'LENGTH);  end "mod";  -- Id: A.38  function "mod" (L: INTEGER; R: SIGNED) return SIGNED is    constant L_LENGTH: NATURAL := MAX(SIGNED_NUM_BITS(L), R'LENGTH);    variable XL, XREM: SIGNED(L_LENGTH-1 downto 0);  begin    if (R'LENGTH < 1) then return NAS;    end if;    XL := TO_SIGNED(L, L_LENGTH);    XREM := RESIZE((XL mod R), XREM'LENGTH);    if L_LENGTH > R'LENGTH and XREM(L_LENGTH-1 downto R'LENGTH)        /= (L_LENGTH-1 downto R'LENGTH => XREM(R'LENGTH-1))        then      assert NO_WARNING report "NUMERIC_BIT.""mod"": modulus Truncated"          severity WARNING;    end if;    return RESIZE(XREM, R'LENGTH);  end "mod";  --============================================================================  -- Id: C.1  function ">" (L, R: UNSIGNED) return BOOLEAN is    variable SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH);  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then      assert NO_WARNING          report "NUMERIC_BIT."">"": null argument detected, returning FALSE"          severity WARNING;      return FALSE;    end if;    return not UNSIGNED_LESS_OR_EQUAL(RESIZE(L, SIZE), RESIZE(R, SIZE));  end ">";  -- Id: C.2  function ">" (L, R: SIGNED) return BOOLEAN is    variable SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH);  begin    if ((L'LENGTH < 1) or (R'LENGTH < 1)) then      assert NO_WARNING          report "NUMERIC_BIT."">"": null argument detected, returning FALSE"          severity WARNING;      return FALSE;    end if;    return not SIGNED_LESS_OR_EQUAL(RESIZE(L, SIZE), RESIZE(R, SIZE));  end ">";  -- Id: C.3  function ">" (L: NATURAL; R: UNSIGNED) return BOOLEAN is  begin    if (R'LENGTH < 1) then      assert NO_WARNING          report "NUMERIC_BIT."">"": null argument detected, returning FALSE"          severity WARNING;      return FALSE;    end if;    if UNSIGNED_NUM_BITS(L) > R'LENGTH then return TRUE;    end if;    return not UNSIGNED_LESS_OR_EQUAL(TO_UNSIGNED(L, R'LENGTH), R);  end ">";  -- Id: C.4  function ">" (L: INTEGER; R: SIGNED) return BOOLEAN is  begin    if (R'LENGTH < 1) then      assert NO_WARNING          report "NUMERIC_BIT."">"": null argument detected, returning FALSE"          severity WARNING;      return FALSE;

⌨️ 快捷键说明

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