Агрегат
(foo'high => '1', foo'high - 1 downto foo'low => '0')
имеет направление диапазона индекса «к». Ваше предупреждение гласит: не думайте, что его направление "вниз" только потому, что вы включили в него массив, который определен как "вниз" .
Почему направление по умолчанию «к»? Что ж, нам нужно подумать о том, какого типа этот агрегат. (Давай - это VHDL - у него должен быть тип).
В моем коде это тип unsigned
. Зачем? Ну, потому что я связал его с входом для процедуры типа unsigned
. В вашем коде его тип также unsigned
. Зачем? Ну, потому что это правый аргумент оператора =
, левый аргумент которого определенно равен unsigned
. Существует только одна возможная версия оператора =
, которая может быть проверена двумя unsigned
с.
Теперь нам нужно посмотреть, как объявлен тип unsigned
, и когда мы увидим, что он объявлен как неограниченный массив с типом индекса natural
:
type unsigned is array (natural range <>) of std_logic;
Левое значение типа natural
равно 0. Итак, именно поэтому ваш агрегат имеет направление диапазона индекса «к».
Если вы выполните этот код, вы увидите, как VHDL определил индексирование для агрегата:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity E is
end entity ;
architecture A of E is
signal foo : unsigned(4 downto 0);
begin
process
procedure display (constant foo : in unsigned) is
begin
report "foo'left= " & integer'image(foo'left);
report "foo'right= " & integer'image(foo'right);
report "foo'high= " & integer'image(foo'high);
report "foo'low= " & integer'image(foo'low);
end procedure;
begin
display((foo'high => '1', foo'high - 1 downto foo'low => '0'));
wait;
end process;
end architecture A;