Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 2 Типы VHDL_данных и их интерпретация при R...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
287.23 Кб
Скачать

8 Атрибуты

Любой скалярный тип обладает рядом атрибутов. В первую очередь это следующий набор атрибутов:

  • крайнее левое значение диапазона – 'left;

  • крайнее правое значение диапазона – 'right;

  • наименьшее значение диапазона – 'low;

  • наибольшее значение диапазона – 'high;

  • упорядоченность диапазона по возрастанию – 'ascending;

  • литерал, соответствующий значению – 'image (x);

  • значение, соответствующее литералу – 'value (s).

Использование атрибута 'image (x) позволяет получить корректно сформированный литерал, а использование атрибута 'value (s) –сформировать значение соответствующее корректному литералу. Основное применение этих двух атрибутов – ввод и вывод данных.

Все скалярные типы, кроме вещественных, обладают несколькими дополнительными атрибутами:

  • позиция значения в диапазоне типа – 'pos (x);

  • значение в диапазоне типа в позиции – 'val (n);

  • значение, следующее за заданным – 'succ (x);

  • значение, предшествующее заданному – 'pred (x);

  • значение, находящееся слева от заданного – 'leftof (x);

  • значение, находящееся справа от заданного – 'rightof (x);

Например, для типов упорядоченных по возрастанию значение, расположенное справа от некоего значения это следующее за ним значение. С другой стороны, для типов, которые упорядочены по убыванию, следующим является значение находящееся слева от заданного.

Последним является атрибут 'base, но он может применяться только к подтипам для получения исходного для них типа. К полученному типу можно применять все допустимые для него атрибуты.

9 Массивы

В языке VHDL массив представляет собой упорядоченный набор объектов, которые принадлежат одному типу. Каждый элемент массива располагается в определенной позиции, которая определяется объектом скалярного типа данных, называемого индексом.

Перед созданием объекта массива необходимо предварительно выполнить объявление типа для него, согласно следующему правилу:

<определение типа массива> ::=

array (<дискретный диапазон> {, <дискретный диапазон>}*)

of <определение подтипа>

Это правило позволяет определить тип массива, путем задания одного или нескольких диапазонов индексов и подтипа для его элементов. Правила для определения подтипа и для задания дискретного диапазона были рассмотрены в предыдущих лекциях.

Допустим, необходимо описать устройство, которое обеспечивает расчет факториала значений, лежащих в диапазоне . Так как диапазон входных значений известен заранее, можно использовать метод выборки значения из таблицы поиска (lookup table):

package types is

subtype fast_factorial_arg is natural range 0 to 10;

end package types;

use work.types.all;

entity fast_factorial is

port (

data_in : in fast_factorial_arg;

data_out : out integer

);

end entity fast_factorial;

architecture behavioral of fast_factorial is

type factorials_lookup_table is

array (fast_factorial_arg) of integer;

constant factorials : factorials_lookup_table :=

(1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800);

begin

lookup : data_out <= factorials (data_in);

end architecture behavioral;

В показанном примере для задания диапазона индексов использовалось имя подтипа, так как создаваемый массив должен содержать элементы, которые соответствуют каждому из значений этого подтипа.

Для доступа к некоторому элементу массива необходимо задать имя массива и индекс необходимого элемента в круглых скобках. Кроме того, можно обращаться к части массива, называемой срезом (array slice), посредством задания диапазона индексов. Также, можно использовать объект массива как единое целое, например, для присвоения значения одного массива другому.