Ваш код ведет себя так, как я ожидал.
signal y_bus: TOutputs(0 to 3);
signal z_bus: TOutputs(3 downto 0);
...
y_bus <= (3 => H, 2 => H, 1 => H, 0 => L);
z_bus <= (3 => H, 2 => H, 1 => H, 0 => L);
Для y_bus
левый бит равен 0
, который вы установили на L
. Для z_bus
левый бит 3
, который вы установили на H
. ПРОВЕРКА.
constant OUTPUTS_TABLE: TOutputsTable :=
(
(3 => H, 2 => H, 1 => H, 0 => L),
...
signal outputs_a: TOutputs(0 to 3);
signal outputs_b: TOutputs(3 downto 0);
....
outputs_a <= OUTPUTS_TABLE(0);
outputs_b <= OUTPUTS_TABLE(0);
Для OUTPUTS_TABLE(0)
левый бит - 0
, который вы установили на L
. Для outputs_a
левый бит равен 0
, поэтому можно ожидать, что он будет L
. Для outputs_b
левый бит равен 3
, поэтому можно ожидать, что он будет L
. ПРОВЕРЬТЕ.
signal outputs_a: TOutputs(0 to 3);
signal outputs_b: TOutputs(3 downto 0);
...
(3 => oa3, 2 => oa2, 1 => oa1, 0 => oa0) <= outputs_a;
(3 => ob3, 2 => ob2, 1 => ob1, 0 => ob0) <= outputs_b;
Для outputs_a
левый бит равен 0
, поэтому можно ожидать, что oa0
будет L
, потому что это то, что является левой стороной. Для outputs_b
левый бит равен 3
, поэтому вы можете ожидать, что ob0
будет L
, потому что это то, что он слева. ЧЕК ОБ ОПЛАТЕ. Но подождите, почему oa0
и ob0
с левой стороны? Потому что именно так будут пронумерованы биты в агрегатах (3 => oa3, 2 => oa2, 1 => oa1, 0 => oa0)
и (3 => ob3, 2 => ob2, 1 => ob1, 0 => ob0)
, потому что тип индекса будет подсчитывать типы integer
и integer
.
signal y_bus: TOutputs(0 to 3);
signal z_bus: TOutputs(3 downto 0);
....
y_bus <= (3 => H, 2 => H, 1 => H, 0 => L);
z_bus <= (3 => H, 2 => H, 1 => H, 0 => L);
....
(3 => y3, 2 => y2, 1 => y1, 0 => y0) <= y_bus;
(3 => z3, 2 => z2, 1 => z1, 0 => z0) <= z_bus;
Итак, как мы уже знаем, для y_bus
левый бит равен 0
, для которого вы установили L
, а для z_bus
левый бит равен 3
, который вы установили на H
. Таким образом, можно ожидать, что y0
(левый бит) будет L
, а z0
(левый бит) будет H
. ПРОВЕРЬТЕ.
У меня болит голова.