n 位计数器最多可以表示 2^n 个状态,因此 2^n 进制计数至少需要 n 位位宽;
当计数不足 2^n 次时,应向上补足,因此 2^(n-1) + 1 ~ 2^n 都需要 n 位寄存器进行计数;
综上所述,k 进制计数器的位宽为 ceil(log2(k)),ceil 表示向上取整,log2 表示以 2 为底取对数;
下面提供对数取整函数的 VHDL 代码:
FUNCTION logceil(X: INTEGER) RETURN INTEGER IS
-- WARNING: logceil thinks that counters begin at 0.
-- It may be confusing when the parameter is power of 2,
-- such as logceil(16) return 4. (16D = 10000B)
-- If you want to convert integer to unsigned/signed,
-- use to_unsigned/to_signed(i, logceil(i+1)).
BEGIN
ASSERT(X > 0)
REPORT "X: Valid Range [1..]"
SEVERITY ERROR;
FOR I IN 1 TO X LOOP
IF 2**I >= X THEN
RETURN I;
END IF;
END LOOP;
END FUNCTION logceil;
2022-05-15 广告