VHDL / Как инициализировать мой сигнал?

Я новичок в VHDL, и у меня есть основной вопрос.

Рассмотрим следующий ввод:

A  : in std_logic_vector(22 downto 0);

И этот сигнал:

signal dummyA : std_logic_vector(47 downto 0);

Я хочу инициализировать dummyA с помощью A, поэтому я сделал следующее:

dummyA <= A;

Это правильно ? Я имею в виду, эквивалентно ли это:

dummyA <= "0000000000000000000000000" & A; ? Или я должен добавить 0 явно так.


person user2336315    schedule 16.05.2013    source источник


Ответы (2)


Вы не можете использовать dummyA <= A;, потому что существует несоответствие типов, и любой хороший компилятор VHDL отклонит его.

Вы можете использовать что-то вроде

dummyA <= (A'RANGE => A, OTHERS => '0');

или (только в последовательном контексте)

dummyA <= (OTHERS => '0');
dummyA(A'RANGE) <= A;

or

FOR i IN dummyA'RANGE LOOP
    IF i >= A'LOW AND i <= A'HIGH THEN
        dummyA(i) <= A(i);
    ELSE
        dummyA(i) <= '0';
    END IF;
END LOOP;

В параллельном контексте вы можете использовать

FOR i IN dummyA'RANGE GENERATE
    IF i >= A'LOW AND i <= A'HIGH GENERATE
        dummyA(i) <= A(i);
    END GENERATE;
    -- ELSE
    IF i < A'LOW OR i > A'HIGH GENERATE
        dummyA(i) <= '0';
    END GENERATE;
END GENERATE;

Все вышеперечисленное гарантирует, что dummyA(i) загружается с A(i). Но "00000" & A может привести к неправильному сопряжению, если их диапазоны не совпадают в нижней части.

person Ben Voigt    schedule 16.05.2013
comment
Является ли dummyA <= (A'RANGE => A, OTHERS => '0'); эквивалентом dummyA <= "0000000000000000000000000" & A;? - person user2336315; 16.05.2013
comment
@user2336315: user2336315: Так и должно быть, но вам не нужно отслеживать, сколько лишних нулей. - person Ben Voigt; 16.05.2013
comment
Если диапазон A превосходит диапазон dummyA, будет ли он усекать данные A? - person user2336315; 16.05.2013
comment
@ user2336315: Нет, не получится. Что-то вроде комбинации FOR и IF должно быть полезно, если вы не знаете, какой вектор больше. - person Ben Voigt; 16.05.2013
comment
Вы также можете использовать dummyA <= ext(dummy,dummyA'length);, который эффективно заполняет нулями MSb, тогда как dummyA <= sxt(dummy,dummyA'length); выполняет расширение знака, дополняющее MSb старшим битом фиктивного. - person TOTA; 16.05.2013
comment
@TOTA: я никогда не знаю об этих функциях ... если присмотреться, похоже, это потому, что они нестандартны. - person Ben Voigt; 16.05.2013
comment
Как насчет второго примера, который вы привели, dummyA <= (OTHERS => '0'); dummyA(A'RANGE) <= A; Поскольку сигналы назначаются после завершения процесса, будет ли он работать в любом случае? - person 3yakuya; 07.12.2015
comment
Разве dummyA <= (A'RANGE => A, OTHERS => '0'); (ваш первый пример) не является неправильным синтаксисом? Я могу ошибаться, но я не думаю, что агрегатный оператор () разрешил бы эту первую часть, A'RANGE => A, поскольку A является вектором, тогда как правая часть этого присваивания в этом случае должна быть std_logic. - person gblomqvist; 31.08.2019

Используя стандартную функцию из ieee.numeric_std, вы можете сделать следующее, чтобы обнулить MSB:

dummyA <= std_logic_vector(resize(unsigned(A), dummyA'length));

Хотя вы не просили об этом, можно также расширить подпись следующим образом:

dummyA <= std_logic_vector(resize(signed(A), dummyA'length));

Хотя в этом случае я бы сказал, что пользователь должен использовать подписанный тип данных как для A, так и для dummyA, если они дают им арифметические интерпретации.

person Martin Thompson    schedule 17.05.2013