Я построил счетчик mod-16, и результатом вывода является INTEGER (все примеры, которые я видел, использовали INTEGER).
Я построил декодер с шестнадцатеричным-7-сегментным дисплеем, и его вход представляет собой STD_LOGIC_VECTOR (записал его так, потому что было легко отобразить таблицу истинности).
Я хотел бы соединить выход счетчика со входом декодера, но я получаю ошибки «несоответствие типов» при попытке компиляции в QuartusII.
Есть ли способ преобразования из типа INTEGER в тип STD_LOGIC_VECTOR в листинге VHDL?
Допустим, у вашего 4-битного счетчика был выход INTEGER SOME_INTEGER, и вы хотели преобразовать его в 4-битный STD_LOGIC_VECTOR
Вы также можете использовать это для инициализации векторов со значимыми числами
Я думаю, что вам может понадобиться добавить "use IEEE.STD_LOGIC_ARITH.ALL;" и / или STD_LOGIC_UNSIGNED.
Дополнительной операцией является conv_integer (vector). Мне нравится использовать это, когда я делаю сравнения. Так что я мог бы объявить
А потом, позже, я могу использовать это в операторе if
РЕДАКТИРОВАТЬ: вам не нужно объявлять переменную как целое число. Попробуйте вместо этого изменить объявление на std_logic_vector. Операторы + и - работают с std_logic_vectors.
источник
Вы можете быть заинтересованы в использовании типов
unsigned
иsigned
отieee.numeric_std
. Они совместимы сstd_logic_vector
, но имеют числовую интерпретацию (двоичную или двухкомпонентную). Есть также возможность поставить такую интерпретациюstd_logic_vector
, но это не рекомендуется .источник
Как говорится в основном ответе, рекомендуемый метод следующий:
Тем не менее, я хотел бы уточнить, почему это рекомендуется и почему VHDL имеет такой, казалось бы, запутанный способ преобразования целых чисел в std_logic_vectors.
Все сводится к тому, как эти типы рассматриваются инструментами.
Standard_logic_vector - буквально группа 1 или 0. У меня 10001. Какой это номер? Смотря как. Это подписано или не подписано? Это SLV не знает или не заботится. Сколько бит? Ну, как долго твой SLV?
Целое число подписано и обычно 32 бита (если я правильно помню).
Этап 1: сделать мое целое число короче и без знака. Вот эта часть:
Этап 2: Затем возьмите эти биты и используйте их для управления my_slv.
(Примечание по терминологии.
A <= B
В VHDL читается вслух как «A управляется B»)В сочетании это дает вам:
Исходя из традиционного программирования, очень легко застрять в мышлении программирования. Но в VHDL код, который вы пишете, имеет физическое значение для аппаратного обеспечения. Знание того, почему этот метод работает и рекомендуется, на один шаг ближе к размышлению о том, что вы пишете в терминах оборудования.
Бонусный совет: функции с префиксом to_ - это те, которые сокращают / меняют операнды. Они делают их без знака или определенной длины или обоих. Вот почему to_unsigned требует от вас указать длину. Функции без to_ (прямой std_logic_vector (...) в этом примере) используются, когда типы уже напрямую совместимы. Msgstr "Возьми эти биты и наполни их этим типом, никаких изменений не требуется" У них нет аргумента длины, потому что обе стороны уже одинаковы. Поэтому при создании таких вещей мне не нужно искать это, я просто думаю о том, как я изменяю данные.
источник
Чтобы преобразовать целое число в std_logic_vector, у вас есть несколько вариантов. Используя numeric_std:
или
Использование std_logic_arith:
std_logic_arith не является стандартом ieee, но большинство инструментов компилирует его в библиотеку IEEE, и он широко используется.
источник