Как рассчитать количество бит, необходимое для std_logic_vector, когда его размер параметризуем? - PullRequest
2 голосов
/ 08 октября 2019

У меня есть объект, который создает FIFO, глубина которого является общей:

DEPTH_FIFO : natural range 2 to 64 := 3; -- number of vectors in the FIFO

Я должен объявить счетчик, который может хранить индекс FIFO, но мне нужно знать, какой размер должен бытьСчетчик.

signal cnt_FIFO : unsigned(length_cnt_FIFO-1 downto 0);

Моя проблема заключается в том, чтобы найти способ вычислить константу length_cnt_FIFO.

Я пробовал это:

constant length_cnt_FIFO : natural := CEIL(LOG(2, DEPTH_FIFO));

с библиотекой use ieee.MATH_REAL.all;

но у меня возникают проблемы с преобразованием типов.

У кого-нибудь есть идея сделать эту работу или любое другое решение?

Заранее спасибо,

SLP

Ответы [ 2 ]

3 голосов
/ 08 октября 2019
  1. Ваш DEPTH_FIFO является естественным, но вы должны преобразовать его в вещественное число, чтобы передать его в логарифмическую функцию.
  2. Функция CEIL возвращает действительное значение: вы должны преобразовать его обратно вЕстественно хранить его в константе натурального типа.
  3. Параметры функции LOG действительны, поэтому передача литерала 2 вызывает проблемы, поскольку он обрабатывается как целое число. Вместо этого используйте, например, 2.0 или функцию LOG2.

Это помогло мне:

constant length_cnt_FIFO : natural := natural(CEIL(LOG2(real(DEPTH_FIFO))));
2 голосов
/ 08 октября 2019

У меня есть следующая функция, определенная в пакете утилит, который я держу под рукой:

function ilog2(val : integer) return integer
is
    constant vec : std_logic_vector(31 downto 0) :=
        std_logic_vector(to_unsigned(val, 32));
begin
    for i in vec'left downto vec'right loop
        if (vec(i) = '1') then
            return i;
        end if;
    end loop;
    return -1; -- The number is '0'.
end function ilog2;
...