Почему библиотека «numeric_std» является более предпочтительной, чем «std_logic_arith» и другие

Эта статья основана на переписке по электронной почте, которую я вел с одним VHDL экспертом. Если вы просмотрите некоторые форумы о VHDL, то вы можете увидеть некоторые предложения, например, использовать «numeric_std» библиотеку вместо «std_logic_arith» и «std_logic_unsigned». Я в этом сомневался, прежде чем, (к сожалению я не знаю его фамилию) рассказал мне:

std_logic_arith и др. пакеты были написаны компанией Synopsis и включены в их инструменты и версии ieee библиотеки, без одобрения института стандартизации IEEE. В LRM (Language reference manual) резервирует библиотеку IEEE для официально баллотированных и одобренных пакетов для языка VHDL. Так как весь мир начал использовать Synopsys, и каждый начал писать код, который зависит от std_logic_arith, Synopsys отказался изъять их реализации. И поскольку другие инструменты, как правило, были вынуждены работать с кодом, который работал в Synopsys, они последовали его примеру. Однако, различные поставщики реализовывали пакет несколько по-разному, что обусловило некоторые проблемы в совместимости. Поскольку не существует стандарта, регулирующего его деятельность, работа может измениться в любое время.

IEEE решил написать и утвердить стандартный пакет для числовых операций над SL (std_logic) и bit_vectors. Эти пакеты называются numeric_std и numeric_bit. Эти ieee standard (стандартные) пакеты, расположены в официальной версии библиотеки IEEE, и их поведение регулируется стандартными, так что совместимость будет обеспечена.

Numeric_std — это не попытка ввода численного интерпретирования SLV (std_logic_vector) , этот пакет скорее определяет связанные типы UNSIGNED и SIGNED которые имеют как числовые, так и побитовые интерпретации (т.е. AND и OR определены для них). Это позволяет избежать путаницы при необходимости использовать знаковую и без знаковую арифметики в одном теле (std_logic_arith предполагает все операции как операции без знака). Numeric_std определяет арифметические операций между различными комбинациями signed, unsigned и целочисленными операндами. Во всех случаях размер результата будет таким же, как большего signed/unsigned операнда. Переполнения (потеря значимости) усекаются.

Последняя версия vhdl стандарта не включает в себя пакет numeric_std_unsigned, схожий по функциям с std_logic_arith, который не включает в себя арифметические операции без знака для std_logic_vector операндов. К сожалению, я не знаю ни одного средства, которые еще поддерживают его.

В общем, если вы можете, создать свой entity интерфейс, используя unsigned или signed (или даже integer — целочисленный формат), если они могут быть численно интерпретированы. (т.е. устройство может хранить любые типы бинарных данных, т.е. SLV имеет смысл здесь, а вот цифровой фильтр имеет специфичную организацию входных данных, что может быть закодировано с помощью соответствующего типа порта). Использование соответствующих типов портов позволяет, избежать преобразования внутри тела описания.

Например, если вы использовали SLV входной порт, и вы должны добавить к нему единицу и подать на вывод, вы должны преобразовать его два раза:

output <= std_logic_vector(unsigned(input) + 1);

Это преобразует SLV input в unsigned (операция сложения определена для этого типа), добавляет один (целое число, результат имеет тип unsigned), затем преобразует результат обратно SLV для вывода output. Все было бы гораздо проще, если бы входные и выходные порты были объявлены без знака (unsigned) изначально:

output <= input + 1;

В то же время вы не должны следовать философии «не использовать SLV». В некоторых случаях SLV лучше, чем unsigned или signed данные. Например, АЛУ (Арифметико-логические устройство), которое принимает signed или unsigned данные (в зависимости от входа управления) может всегда иметь числовое интерпретацию данных своих портов, но пока мы не знаем, представлены данные как знаковые или как без знаковые, SLV — подходящий вариант для этих портов. Другим примером,где SLV — это более подходящий вариант, является какой-нибудь «сборник» битов, которые не имеют численного значения, таких как биты векторов разрешения, прерывания и др.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий

  1. Анатолий

    То, что Numeric_std — более стандартный, это правда.

    А в остальном — не совсем так.

    Как правило, в проекте данные — или со знаком, или без.

    Тогда проще объявить библиотеки std_logic_arith и std_logic_unsigned и считать все SLV как беззнаковые и вообще не применять никакие функции перехода, кроме длиннючей conv_std_logic_vector, если нужно преобразовать целое.

    Ответить