Итак, я пытаюсь использовать эту функцию, которую я написал, чтобы преобразовать двоичное кодирование (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 ** я.