Почему эта функция компилируется без сбоев, а Modelsim отказывается имитировать ее? - PullRequest
0 голосов
/ 16 апреля 2020

Итак, я пытаюсь использовать эту функцию, которую я написал, чтобы преобразовать двоичное кодирование (3 бита) в однокадровое кодирование (8 бит). Весь процесс компиляции от анализа и синтеза до списка соединений в Quartus не показывает ошибок, сборка Modelsim также не показывает ошибок. Но когда я тестирую компонент, который использует эту функцию, симуляция просто останавливается всякий раз, когда он сталкивается с вызовом функции. Он даже не возвращает ошибку, процесс моделирования просто не продвигается дальше. Кажется, что проблема исходит от самого l oop, потому что, когда я помещаю его содержание в комментарии, он все еще не работает. Любая идея, почему?

FUNCTION ONEHOT (adBin : STD_LOGIC_VECTOR) 
    RETURN STD_LOGIC_VECTOR IS
    VARIABLE onehot : STD_LOGIC_VECTOR(7 DOWNTO 0);
    VARIABLE bitPos : INTEGER RANGE 0 TO 8 := 0;
BEGIN

    onehot := (OTHERS => '0');

    FOR i IN adBin'range LOOP
      IF adBin(i) = '1' THEN
        bitPos := bitPos + 2**i;
      END IF;
    END LOOP;

    onehot(bitPos-1) := '1';

    RETURN onehot;

END FUNCTION;

Также я пытался использовать инструкцию CASE в этой функции, чтобы избежать использования математики, но он говорит мне: «Выражение типа массива должно иметь локально устаревший c подтип». но я не знаю, что это значит ...

FUNCTION ONEHOT (adBin : STD_LOGIC_VECTOR) 
        RETURN STD_LOGIC_VECTOR IS
        VARIABLE onehot : STD_LOGIC_VECTOR(7 DOWNTO 0);
        VARIABLE bitPos : INTEGER RANGE 0 TO 8 := 0;
    BEGIN

        onehot := (OTHERS => '0');

        CASE adBin IS
            WHEN "000" => onehot(0) := '1';
            WHEN "001" => onehot(1) := '1';
            WHEN "010" => onehot(2) := '1';
            WHEN "011" => onehot(3) := '1';
            WHEN "100" => onehot(4) := '1';
            WHEN "101" => onehot(5) := '1';
            WHEN "110" => onehot(6) := '1';
            WHEN "111" => onehot(7) := '1';
            WHEN OTHERS => NULL;
        END CASE;

        RETURN onehot;

    END FUNCTION;

Спасибо за любую помощь

Редактировать: Кажется, что ошибка происходит от экспоненты 2 ** я.

...