Проблемы У вас есть две ошибки. Первое, на которое указал Брайан, ваш диапазон неверен. Простой способ express диапазона - использовать диапазон. Это показано в коде ниже.
Кроме того, вы хотите изменить класс вашего параметра byte_in на константу, также показанную в приведенном ниже коде.
Решение
procedure send_midi_byte (
constant byte_in : in std_logic_vector;
signal midi_out : out std_logic
) is
begin
midi_out <= '0';
wait for baudrate;
for i in byte_in'range loop
midi_out <= byte_in(i);
wait for baudrate;
end loop;
midi_out <= '1';
wait for baudrate;
end send_midi_byte;
Так почему же константа? Константа означает, что параметр stati c для времени жизни вызова подпрограммы. Параметры-константы допускают все, что создает значение (литерал, выражение или даже имя сигнала или переменной), например:
send_midi_byte(x"90", midi_in_int);
for i in 0 to 10 loop
send_midi_byte(x"90" + i, midi_in_int);
end loop;
Вы уже знакомы с этим как со всеми языковыми операторами (реализованы как функции) имеют постоянные классифицируемые параметры (это значение по умолчанию, и в стандартных пакетах его обычно не используют).
Рекомендации по параметрам
Для входных данных:
Используйте сигнал , когда ожидается обновление объекта - например, использование события или использование объекта в операторе ожидания. Обычно это означает, что объект исходит из архитектуры (такой как DUT).
Используйте константу , когда вам нужно передать буквальное значение.
Для выходных данных:
Использовать сигнал при передаче значения в архитектуру (например, DUT).
Использовать переменную при передаче значения обратно в локальный процесс .
Почему параметр должен быть константой
В вашем примере он будет работать с сигналом, однако модель использования всегда будет: 1) присваиваться сигналу, а затем 2) вызвать подпрограмму:
byte_slv <= x"90";
send_midi_byte(byte_slv, midi_in_int);
Это может или не может раздражать вас достаточно, чтобы быть проблемой. Для других процедур обновление параметра сигнала может действительно оказаться слишком поздно. Это также можно легко обойти в подпрограмме.
OTOH, как только вы захотите вызвать процедуру send_midi_byte из другой процедуры, она станет более сложной или не будет работать вообще. В приведенной ниже процедуре мы пытаемся выполнить тестирование, отправив инкрементные байты в миди:
procedure send_inc_midi_bytes (
constant first_byte_in : in std_logic_vector;
constant number_bytes : in integer ;
signal midi_out : std_logic
) is
-- signal byte_in : std_logic_vector(7 downto 0); -- want to do this
begin
for i in 0 to number_bytes - 1 loop
byte_in <= byte_in + i ;
send_midi_byte(byte_in, midi_out);
end loop ;
end procedure send_inc_midi_bytes ;
Я понимаю, что исправление диапазона решает вашу конкретную проблему, но однажды вы можете sh сделать больше - в этот момент вы захотите, чтобы кто-то предложил использовать вместо сигнала константу.