ПАКЕТ NUMERIC_STD ЯЗЫКА VHDL

    Первоисточник

    Введение

    Язык VHDL (Very high speed integrated circuits Hardware Description Language) широко используется во всем мире для разработки цифровых систем. Первый стандарт VHDL’87 языка появился в 1987 году [1], второй стандарт VHDL’93 – в 1993 году [2]. В 1999 году был принят стандарт VHDL-AMS аналогового надмножества языка VHDL [3], что позволило проводить описание смешанных (цифро-аналоговых) схем. Желательно, чтобы читатель был знаком с основными элементами языка VHDL. С языком VHDL можно познакомиться по книгам [4 - 10].

    Для VHDL разработаны и стандартизированы ряд пакетов [6, 7], в которых описаны различные арифметические и логические функции для работы с различными типами данных. Одним из самых важных является пакет STD_LOGIC_1164, в котором декларируется девятизначный тип std_ulogic для описания различных состояний сигналов в проводниках (межсоединениях) между элементами и устройствами и важный подтип std_logic этого типа. Для типа std_logic разрешается назначать значение сигнала из различных источников, что является удобным для описания монтажных соединений в логических схемах и описания шин. Соответствующая “разрешающая” функция имеется в пакете STD_LOGIC_1164. Заметим, что в общем случае ее необходимо написать самому разработчику VHDL-кода. Кроме того, имеющиеся в практике проектирования синтезаторы логических схем (LeonardoSpestrum, XST, Synplify и др.), позволяющие по исходным алгоритмическим VHDL-описаниям синтезировать логические схемы, используют для описания синтезированных схем типы std_logic, std_logic_vector. Последний тип является обобщением типа std_logic на случай векторов – одноразмерных массивов значений типа std_logic. Таким образом, если часть VHDL-проекта синтезирована и описывается в терминах девятизначного логического алфавита, а часть проекта остается на алгоритмическом уровне описания и использует типы INTEGER и NATURAL, то возникает проблема совместимости типов std_logic, std_logic_vector с типами INTEGER и NATURAL. Логические функции, описанные в пакете STD_LOGIC_1164, не позволяют напрямую использовать тип std_logic совместно с целыми типами INTEGER и NATURAL. Для того чтобы упростить согласование алгоритмических и схемных описаний, разработан VHDL-пакет NUMERIC_STD. Пакет NUMERIC_STD ориентирован на стандарт языка VHDL’93 [2]. Если необходима совместимость с VHDL’87, то требуется из пакета NUMERIC_STD удалить (например, закомментировать двумя знаками дефис) декларации и тела функций xnor (логическая функция “эквивалентость”), sll, srl, rol, ror (функции сдвига).

    Данная работа посвящена описанию пакета NUMERIC_STD, его возможностям, особенностям и ограничениям, возникающим при моделировании VHDL-программ. Использование данного пакета при синтезе логических схем требует отдельного изучения и в данной работе не рассматривается. Приведенные в статье примеры работы функций пакета были проверены в системе моделирования ModelSim PE 5.7f, в которой содержится рассматриваемая в статье версия пакета NUMERIC_STD.
    Основные типы данных

    В пакете NUMERIC_STD определены два новых UNSIGNED, SIGNED числовых типа данных и различные арифметические функции над ними, которые поддерживаются системами синтеза. Тип UNSIGNED представляет собой числа без знака в векторном двоичном (булевом) представлении, а тип SIGNED – знаковые числа (числа со знаком). Для векторов SIGNED старший (левый) бит определяет знак числа. Отрицательные числа представляются в дополнительном коде. Например, двоичный вектор “1001” представляет число –7. Вектор “1000” типа UNSIGNED понимается как 8, вектор “1000” типа SIGNED понимается как –8. Базовым элементом типов UNSIGNED и SIGNED является стандартный тип std_logic, описанный в пакете STD_LOGIC_1164. Тип std_logic является многозначным (перечислимым) подтипом типа std_ulogic (табл. 1). Типы UNSIGNED и SIGNED в пакете NUMERIC_STD (далее просто в пакете) определены следующим образом:

    type UNSIGNED is array (NATURAL range <>) of STD_LOGIC;

    type SIGNED is array (NATURAL range <>) of STD_LOGIC;

    Размерности векторов UNSIGNED и SIGNED ограничены типом NATURAL, который определен в пакете STANDARD [7] как подтип типа INTEGER:

    type INTEGER is range -2147483648 to 2147483647;

    subtype NATURAL is integer range 0 to INTEGER\'high;

    В VHDL через S\'high обозначается атрибут “верхняя граница” объекта S. Следовательно, запись INTEGER\'high означает верхнюю границу типа INTEGER. Далее в статье будут использоваться атрибуты \'left (левая граница), \'range (диапазон), \'length (длина диапазона). Заметим также, что в VHDL (и в текстах VHDL-кодов данной статьи) не различаются прописные и строчные буквы.

    Таблица 1 Элементы базового типа std_ulogic
    Элемент типа

    std_ulogic

    \'U\' не инициализировано (Uninitialized)

    \'X\' сильное неизвестное (Forcing Unknown)

    \'0\' сильный нуль (Forcing 0)

    \'1\' сильная единица (Forcing 1)

    \'Z\' высокий импеданс (High Impedance)

    \'W\' слабое неизвестное (Weak Unknown)

    \'L\' слабый нуль (Weak 0)

    \'H\' слабая единица (Weak 1)

    \'–\' безразлично (Don\'t care)

    Тип NATURAL включает в себя все положительные целые числа от 0 до 2147483647, а тип INTEGER – положительные и отрицательные числа от -2147483648 до 2147483647. Если перейти к двоичной системе счисления, то тип INTEGER ограничен 32-разрядным вектором, старший (левый) разряд которого означает знак числа (\'0\' – число положительное, \'1\' – число отрицательное). Тип NATURAL ограничен 31-разрядным двоичным вектором.

    Функции пакета NUMERIC_STD

    Пакет NUMERIC_STD содержит описания следующих функций над типами UNSIGNED и SIGNED:

    · функции, реализующие арифметические операции;

    · функции, реализующие операции сравнения;

    · функции сдвига (и вращения);

    · функции изменения размерности;

    · функции преобразования типов;

    · функции, реализующие логические операции.