Изучение VHDL

       

Oбъекты языка VHDL


Сигналы, переменные, константы и другие объекты языка VHDL служат для содержания и переноса некоторых значений. Эти значения могут быть присвоены объектам в одном месте и затем использованы в другом месте программы, как операнды в выражениях, функциях и т.п. На данной страничке приведены объекты языка и синтаксис их объявления (декларации).

Сигнал.

Сигналом является объект, который переносит значение от одного процесса к другому и вместе с ним - синхронизирующее воздействие. Сигнал может быть запомнен в своей истории и воспроизведен в симуляторе в виде графика или таблицы. Объявление сигнала выглядит как:

signal : \идентификатор\{,\идентификатор\}:=[\начальное значение\];
где - \начальное значение\ - выражение, представляющее константу, значение которой принимает сигнал перед первым запуском процесса.

Константа.

Константой является объект, не изменяющий свое значение при вычислениях. После объявления константы присваивание ей значения запрещено (кроме случая отложенной константы). Пример объявления константы:
сonstant thousand: integer:=1000;

Переменная.

Переменной является объект, хранящий значение в пределах операторов процесса, функции или процедуры. В отличие от сигнала, присваивание переменной выполняется немедленно. Упрощенный синтаксис объявления переменной:
\объявление переменной\::=
[shared] variable \идентификатор\{,\идентификатор\}:\тип\[:=\начальное значение\];

Пример объявления переменной:
variable tmp: integer range -128 to 127:=0;



Порт.

В структуре программы VHDL выделяются объекты проекта, называемые entity. Не путать объекты языка с объектом проекта. Это связано с тем, что, во-первых, object и entity переводятся одинаково, во-вторых, в Language Reference Manual сигналы, переменные и др. в некоторых декларативных местах обзываются как entities. В этом слове есть что-то философское, как в афоризме: "Электрон неисчерпаем, как и атом".

Порт представляет собой интерфейсный сигнал объекта проекта. Как и в декларации сигнала, в декларации порта указывается его идентификатор, тип, начальное значение. Дополнительно указывается режим работы: in - прием, out - передача, inout - прием и передача, buffer - передача и использование как сигнал-операнд внутри объекта проекта и link – двунаправленное соединение с другим портом с таким же режимом. Упрощенный синтаксис объявления портов объекта проекта следующий:

\объявление портов\::=port (\объявление порта\ {; \объявление порта\}); \объявление порта\::=\идентификатор\: in |out|inout|buffer|link \тип\ [:=\начальное значение\]

Настроечная константа generic.

Настроечная константа generic кодирует определенное свойство объекта проекта. Она используется, например, для задания разрядности линий связи, кодирования структуры моделируемого устройства. Упрощенный синтаксис объявления настроечных констант следующий:

\объявление настроечных констант\::= generic( \объявление настроечной константы\ {; \объявление настроечной константы\}); \объявление настроечной константы\::= \идентификатор\:\тип\[:=\начальное значение\]

Переменная цикла.

Переменная цикла - это специальный объект в том смысле, что он не требует объявления. Подробнее о ней сказано при описании оператора цикла loop.

Начальное значение объекта.

Начальное значение объекта в его объявлении - это то значение которое принимает объект перед первым циклом моделирования. Если начальное значение не присвоено, то симулятор присваивает наименьшее значение данного типа, если тип - числовой или самое левое значение, если тип - перечисляемый.

Например, многие вначале удивляются, почему проект, написаный с сигналами стандартного типа STD_LOGIC, отказывается вести себя как задумано - на всех выходах модели - значение U (не инициализировано). Объяснение простое: U - это самое левое значение перечисляемого типа STD_LOGIC, а каким-то сигналам в модели не дали ожидаемого начального значения или на них не распространился сигнал сброса. И значение U распространилось до выходов модели в согласии с логикой STD_LOGIC.

Начальное значение может быть выражением. Но значение выражения должно быть вычисленным до момента трансляции данного объявления. Например, первое объявление:
signal bb:bit:=aa;
signal aa:bit :='1';

неверно, так как при его рассмотрении компилятор еще не имеет сведений о идентификаторе аа.

В аппаратной модели вычислителя VHDL начальное значение объекта эквивалентно состоянию триггеров и шин сразу после включения питания до прихода сигналов сброса, т.е. оно не определено. Поэтому компиляторы – синтезаторы не допускают или игнорируют начальные значения всех объектов, кроме констант или объектов, которые не изменяют свое значение при вычислениях.

Содержание раздела