Читайте также:
|
|
Сигналы(signal), переменные(variable) и константы(constant) являются программными величинами (объектами) языка VHDL, значения которых анализируются и обрабатываются при запуске VHDL программы на исполнение. В процессе объявления программных величин они должны сопровождаться специальными характеристиками, которые отражают форму записи сопоставляемых программным объектам числовых значений и диапазоне допустимых числовых значений. Эти характеристики часто называют типами программных величин.
Итак, тип (type) определяет форму записи и набор (диапазон) значений, которые может принимать программный объект.
В VHDL программные величины могут иметь один из встроенных (предопределенных) типов или один из пользовательских типов.
Встроенные (предопределенные) типы маркируются специальными зарезервированными идентификаторами. Список зарезервированных идентификаторов для встроенных типов показан ниже:
bit, bit_vector, boolen, character, integer, real, string.
Примеры деклараций программных величин посредством встроенных типов:
constant bus_size: integer:= 32;
constant MSB: integer range 0 to 15;
constant Z: character:= ‘Z’;
constant bus12_si: bit:= ‘1’;
constant bus12_sam: bit_vector (3 downto 0):= “1011”;
signal dus12_sum: bit_vector (3 downto 0):= “1011”;
signal rus12_si: bit:= ‘1’;
signal tus12_si23: integer range 0 to 15;
Некоторые пользовательские типы и их синтаксис:
Пользовательские типы (типы определяемые пользователем - A user-defined types) конструируются самим пользователем на основе встроенных типов. При построении VHDL проектов пользователю часто необходимо иметь такие собственные типы: тип перечисление (enumerated type ) тип массив ( array type). На основании построенных пользователем типов в языке VHDL разрешено также конструировать нужное множество подтипов ( subtype).
Конструкция типа enumerated определяемого пользователем имеет такой синтаксис:
type type-name is (value-list);
value-list - is a comma-separated list of all possible values of the type.
Конструкция подтипа enumerated определяемого пользователем имеет такой синтаксис:
subtype subtype-name is type-name range start to en d; -- ascending order
subtype subtype-name is type-name range start downto en d; -- descending order
subtypes of a type. Values must be a contiguous range of values of the base type, from start to en d.
Примеры деклараций программных величин пользовательских типов вида enumerated:
Example (enumerated type):
type traffic_light_state is (reset, stop, wait, go);
type std_logic is (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘-’);
subtype fourval_logic is std_logic range ‘X’ to ‘Z’;
subtype bitnum is integer range 31 downto 0;
constant bus_size: integer:= 32;
constant MSB: integer:= bus_size-1; -- bit number of MSB
Конструкция определяемого пользователем типа array имеет такой синтаксис:
type type-name is array (start to en d) of element-typ e;
type type-name is array (start downto en d) of element-typ e;
type type-name is array (range-typ e) of element-typ e;
type type-name is array (range-type range start to en d) of element-typ e;
type type-name is array (range-type range start downto en d) of element-typ e;
Example (array type):
type monthly_count is array (1 to 1 2) of integer;
type byte is array (7 downto 0) of std_logic;
constant word_len: integer:= 32;
type word is array (word_len – 1 downto 0) of std_logic; -- note: a range
value can be a simple expression.
constant num_regs: integer:= 8;
type reg_file is array (1 to num_reg s) of word; -- a two dimensional array
type statecount is array (traffic_light_stat e) of integer; -- an enumerated
type can be the range.
Примечание 1:
Элементы массива упорядочены слева направо, в том же самом направление как индексный диапазон, Таким образом, крайние левые элементы для массивов типов будут:
monthly_count - 1, byte - 7, word - 31, reg_file - 1 и statecount - не указан.
Примечание 2:
Обращение (доступ) к ячейкам массива реализуется использованием пары круглых скобок. Если M, B, W, R, и S - сигналы или переменные являются массивами указанных выше типовто записи вида: M(11), B(5), W(word_len – 5), R(0, 0), S(reset) определяют доступ к соответствующим ячейкам. Номер ячейки указан в круглых скобках.
Примечание 3:
Массив литералов можно специфицировать путем использования различных форматов:
B:= (‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’, ‘1’);
B:= “11111111”;
W:= (0=>‘0’, 8=>‘0’, 16=>‘0’, 24=>‘0’, others => ‘1’);
W:= “11111110111111101111111011111110”;
Примечание 4:
Возможно также обращение к непрерывному подмножеству или сектору массива.
M(6 to 9), B(3 downto 0), W(15 downto 8), S(stop to go).
Примечание 5:
Вы можете объединять массивы или присоединять ячейки к массиву используя оператор конкатенации & который присоединят массивы и элемент в порядке слева-направо. т.е.
‘0’ & ‘1’ & “1Z” = “011Z”, B(6 downto 0) & B(7) – присоединяет 1-bit слева и образует 8-bit массив B.
Примечание 6:
Самый важный тип массива - unconstrained array type(массив неограниченного типа):
Пример неограниченного типа массива - диапазона массива неопределен:
type STD_LOGIC_VECTOR is array (natural range <>) of STD_LOGIC;
Дата добавления: 2015-11-14; просмотров: 42 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Программные единицы языка VHDL | | | Элементы проектирования устройств комбинаторной логики через поток данных (Dataflow design elements) |