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