Функция преобразования "To_bit" должна иметь ровно один формальный параметр
Я получаю вышеуказанную ошибку при запуске modelsim на VHDL Testcase и не могу понять, почему это ошибка.
Тестовый случай:
LIBRARY IEEE;
Use ieee.std_logic_1164.all;
entity a is
port (in11 : in std_logic
);
end a;
Архитектура А это:
component b_1
port ( in1 : in bit);
end component;
begin
inst : b_1 port map ( in1=> **to_Bit**(in11));
end a;
2 ответа
Это ошибка modelsim, на самом деле она должна сообщить, что вам не разрешено использовать эту функцию как актуальную в карте портов, это работает:
LIBRARY IEEE; Use ieee.std_logic_1164.all;
entity a is port (in11 : in std_logic ); end a;
architecture a of a is
signal inBit : Bit;
component b_1 port ( in1 : in bit); end component;
begin
inBit <= to_bit(in11);
inst : b_1 port map ( in1=> inBit); end a;
Существуют ограничения, которые применяются к фактическим данным в картах портов, см. Vhdlref:
Фактический, если порт или сигнал, должен быть обозначен статическим именем (см. 6.1). Фактическое, если выражение, должно быть глобально статическим выражением (см. 7.4).
Дело в том, что оба случая должны быть глобально статичными...
VHDL-93 допускает преобразования типов и функции преобразования в списках ассоциаций. Функция преобразования - это особый случай функции с одним аргументом.
Давайте посмотрим на декларацию to_bit
:
function to_bit(s : std_ulogic; xmap : bit := '0') return bit;
Хотя to_bit(s)
выглядит как действительная функция преобразования, это не так, потому что объявление содержит два аргумента. Второй аргумент xmap
используется в качестве результата, когда is_x(s)
правда.
Это не ошибка ModelSim, но, возможно, сообщение об ошибке немного загадочно. ModelSim считает, что to_bit
предполагается, что это функция преобразования, но отказывается использовать ее, потому что она имеет второй аргумент и, следовательно, не является допустимой функцией преобразования.
Простая функция-обертка может решить проблему:
function to_bit(s : std_ulogic) return bit is
begin
return to_bit(s, '0');
end;
Обратите внимание, что функция также может иметь имя to_bit
потому что VHDL поддерживает перегрузку функций. Было бы неплохо иметь это в пакете std_logic_1164.