Як говорить головна відповідь, рекомендований спосіб такий:
use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
Однак я хотів би детальніше розповісти про те, чому це рекомендується, і чому VHDL має такий, здавалося б, заплутаний спосіб перетворення цілих чисел у std_logic_vectors.
Це зводиться до того, як ці типи переглядаються інструментами.
Standard_logic_vector - це буквально купа 1s або 0s. У мене 10001. Яке це число? Ну, це залежить. Він підписаний чи непідписаний? Цей SLV не знає і не хвилює. Скільки бітів? Ну, як довго ваше SLV?
Ціле число підписується, і зазвичай 32 біти (якщо я правильно пам'ятаю).
Етап 1: Зробити моє ціле число скороченим і непідписаним. Ось ця частина:
to_unsigned(my_int, my_slv'length));
"У мене це ціле число, я хочу, щоб воно не було підписане, і я хочу, щоб воно вписувалося в довжину моєї SLV".
Етап 2: Потім візьміть ці біти і використовуйте їх для керування my_slv.
my_slv <= std_logic_vector(...)
"Візьміть ці шматочки та використовуйте їх для проїзду мого слізу"
(Примітка про термінологію. A <= B
У VHDL читається вголос як "A рухає B")
У поєднанні це дає вам:
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
Походячи з традиційного фону програмування, дуже легко зациклюватися на програмуванні мислення. Але у VHDL код, який ви пишете, має фізичні наслідки для обладнання. Знання, чому цей метод працює і його рекомендують, - це на крок ближче до роздумів про те, що ви пишете в апаратному плані.
Порада про бонус: функції з префіксом to_ - це ті, що скорочують / змінюють операнди. Вони роблять їх без підпису або певної довжини або обох. Ось чому to_unsigned вимагає вказати довжину. Функції без to_ (прямого std_logic_vector (...) у цьому прикладі) використовуються, коли типи вже сумісні. Msgstr "Візьміть ці біти та вставте їх у цей тип, не потребуючи жодних модифікацій". У них немає аргументу довжини, оскільки обидві сторони вже однакові. Отже, будуючи такі речі, мені не потрібно це шукати, я просто думаю про те, як я змінюю дані.