
- •Типы vhdl-данных и их интерпретация
- •1 Объявление типов
- •2 Классификация скалярных типов данных
- •3 Целочисленные типы
- •4 Вещественные типы
- •5 Физические типы
- •6 Перечислимые типы
- •7 Подтипы
- •8 Атрибуты
- •9 Массивы
- •10 Многомерные массивы
- •11 Неограниченные массивы
- •12 Атрибуты
- •13 Операции
- •14 Преобразование типов
- •15 Агрегаты
- •16 Строковые литералы
- •17 Записи
- •18 Преобразование типов данных в процессе vhdl-синтеза
- •Перечислимый тип представляется набором шин:
6 Перечислимые типы
Перечислимые типы языка VHDL используются для представления множества имен, определяющих допустимые значения некоторого объекта. Множество определяется путем перечисления всех его членов, в качестве которых может выступать или идентификатор, или символьный литерал. При этом допускается совместное использование обеих форм в рамках одного типа. Примером перечислимого типа, в котором одновременно используются разные формы представления элементов, является символьный тип (character).
<определение перечислимого типа> ::=
([<идентификатор> | <символьный литерал>]
{, [<идентификатор> | <символьный литерал>]}*)
На перечислимые типы накладываются следующие ограничения:
множество значений перечисления не может быть пустым;
все элементы одного перечисления должны быть различны.
При этом допускается, чтобы различные перечислимые типы включали одинаковые элементы. Примером могут служить типы для представления символов (character) и битов (bit), содержащие идентичные символьные литералы '0' и '1'. Такое использование одного и того же символьного литерала либо идентификатора в разных перечислениях называется перегрузкой (overload).
В VHDL по умолчанию предоставляется шесть перечислимых типов. Три из них это типы, предназначенные для управления работой VHDL моделей:
тип, определяющий возможные уровни серьезности ошибок (severity_level), используемый в механизме утверждений;
type severity_level is (note, warning, error, failure);
тип, определяющий допустимые способы открытия файлов (file_open_kind) и тип, определяющий результаты открытия файла (file_open_status).
Три других перечислимых типа предназначены для представления объектов модели:
тип, содержащий символьные литералы, соответствующие набору ISO 8859-1 и идентификаторы для тех диапазонов, которые явно не определены в данном наборе символов (character);
тип, предназначенный для представления логических значений (boolean);
type boolean is (false, true);
тип, который предназначен для моделирования цифровых сигналов на высоком уровне абстракции (bit).
type bit is ('0', '1');
Следует отметить, что в пакете стандартной логики std_logic_1164 предоставляется перечислимый тип, который позволяет моделировать цифровые сигналы на низком уровне.
Это тип std_ulogic, определенный следующим образом:
type std_ulogic is ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');
Данный тип позволяет значительно более точно моделировать цифровые сигналы, чем битовый тип. Однако, при описании высокоуровневых модулей использование данного типа (или его подтипов) может быть избыточным. Особенности этого типа и работа с ним будут рассмотрены позже.
К объектам перечислимых типов не применимы никакие арифметические операции. Но, к объектам, которые принадлежат к булевому типу и к типу бит можно применять ряд логических операций:
отрицание (not A);
конъюнкция (A and B);
штрих Шеффера (A nand B);
дизъюнкция (A or B);
стрелка Пирса (A nor B);
неэквивалентность (A xor B);
эквивалентность (A xnor B).
Как и в случае с арифметическими операциями оба операнда для любой логической операции должны принадлежать одному и тому же типу.
Операции конъюнкция, штрих Шеффера, дизъюнкция и стрелка Пирса вычисляются согласно схеме, которую иногда называют коротким вычислением (short-circuit). То есть, вычисление продолжается до тех пор, пока результат достоверно не известен. Например, в выражении (b /= 0) and (a/b > 1) второй операнд будет вычисляться только в случае, если первый операнд истинен.
Как было отмечено ранее, к любым объектам скалярных типов можно применить ряд операций сравнения. Это операции равенства (equality, A = B) и неравенства (inequality, A /= B), которые могут быть применены к любым объектам одного типа. А, кроме того, это операции, которые применимы только к объектам, принадлежащим упорядоченным типам:
меньше (less-than, A < B);
меньше либо равно (less-than-or-equal, A <= B);
больше (greater-than, A > B);
больше либо равно (greater-than-or-equal, A >= B).
Результатом всех перечисленных операций являются объекты булевого типа.