Совокупный порядок в названной ассоциации - PullRequest
0 голосов
/ 01 марта 2020

Я изо всех сил пытаюсь понять порядок битов агрегата, тем более что я использовал ассоциацию имен.

Шины определены как (0 to 3) и (3 downto 0), но так как я использовал именованная ассоциация, почему выходы z3..0 и ob3..0 противоположны друг другу? Почему outputs_b противоположно z_bus? Почему присвоение outputs_b из массива констант изменило порядок следования битов по сравнению с назначением z_bus из литерала?

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Test_TB is
end entity;

architecture V1 of Test_TB is
    type TLogicLevel is (L, H, X);
    type TOutputs is array(natural range<>) of TLogicLevel;
    type TOutputsTable is array(natural range<>) of TOutputs;

    constant OUTPUTS_TABLE: TOutputsTable :=
    (
        (3 => H,  2 => H,  1 => H,  0 => L),
        (3 => X,  2 => X,  1 => X,  0 => X)  -- Added this because it can't compile an array with a single element.
    );

    signal outputs_a: TOutputs(0 to 3);
    signal outputs_b: TOutputs(3 downto 0);
    signal oa0, oa1, oa2, oa3: TLogicLevel;
    signal ob0, ob1, ob2, ob3: TLogicLevel;

    signal y_bus: TOutputs(0 to 3);
    signal z_bus: TOutputs(3 downto 0);
    signal y0, y1, y2, y3: TLogicLevel;
    signal z0, z1, z2, z3: TLogicLevel;

begin

    process
    begin
        wait for 10 ns;
        y_bus <= (3 => H, 2 => H, 1 => H, 0 => L);              -- Performs bit-for-bit copy.
        z_bus <= (3 => H, 2 => H, 1 => H, 0 => L);              -- Performs bit-for-bit copy. NOT REVERSED.
        outputs_a <= OUTPUTS_TABLE(0);                          -- Performs bit-for-bit copy.
        outputs_b <= OUTPUTS_TABLE(0);                          -- Performs bit-reverse copy. IS REVERSED.
        wait for 10 ns;
        (3 => oa3, 2 => oa2, 1 => oa1, 0 => oa0) <= outputs_a;  -- Performs bit-for-bit copy.
        (3 => ob3, 2 => ob2, 1 => ob1, 0 => ob0) <= outputs_b;  -- Performs bit-reverse copy of a reverse copy, i.e. reverse reverse.
        wait for 10 ns;
        (3 => y3, 2 => y2, 1 => y1, 0 => y0) <= y_bus;          -- Performs bit-for-bit copy.
        (3 => z3, 2 => z2, 1 => z1, 0 => z0) <= z_bus;          -- Performs bit-reverse copy of non-reverse copy. So z3..0 is the reverse of ob3..0.
        wait;
    end process;

end architecture;

enter image description here

1 Ответ

2 голосов
/ 02 марта 2020

Ваш код ведет себя так, как я ожидал.

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. ПРОВЕРЬТЕ.

У меня болит голова.

...