Функция преобразования "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.

Другие вопросы по тегам