Атрибуты скалярного типа в языке VHDL.
Атрибутом называют особенное, долговременное свойство предмета. В языке VHDL сигналы, переменные и другие объекты, кроме своего значения, также имеют множество атрибутов. У каждого типа объектов есть несколько предопределенных атрибутов. Пользователь также может ввести ряд специальных атрибутов. Атрибуты бывают различного типа: атрибут - тип, значение, сигнал, функция, диапазон.
Атрибут объекта записывается как
\имя объекта\' \имя атрибута\.
Для скалярного типа Т предопределены следующие атрибуты:
T'left - самое левое значение множества элементов скалярного типа Т.
T'right - самое правое значение множества элементов скалярного типа Т.
T'high - наибольшее значение в множестве элементов скалярного типа Т.
T'low -наименьшее значение в множества элементов скалярного типа Т.
T'image(X) - функция строкового представление выражения Х типа Т.
T'value(Х) - функция значения типа Т от строкового представления Х.
T'pos(Х) - функция номера позиции элемента Х типа Т.
T'val(Х) -функция значения элемента типа Т стоящего в позиции Х.
Примерыатрибутов:
type st is (one,two,three); st'right = three, st'pos(three) = 2, st'val(1) = two.
positive'low = 1, positive'high =2147483647.
integer'value("1_000") =1000, integer'image(330) ="330".
Атрибуты регулярного типа в языке VHDL.
Атрибутом называют особенное, долговременное свойство предмета. В языке VHDL сигналы, переменные и другие объекты, кроме своего значения, также имеют множество атрибутов. У каждого типа объектов есть несколько предопределенных атрибутов. Пользователь также может ввести ряд специальных атрибутов. Атрибуты бывают различного типа: атрибут - тип, значение, сигнал, функция, диапазон.
Атрибут объекта записывается как
\имя объекта\' \имя атрибута\.
Для регулярного типа A предопределены следующие атрибуты:
A'left[(N)] - левое значение диапазона индексов по N-й размерности.
A'right[(N)] - правое значение диапазона индексов по N-й размерности.
A'high[(N)] - наибольшее значение диапазона индексов по N-й размерности.
A'low[(N)] - наименьшее значение диапазона индексов по N-й размерности.
A'range[(N)] - диапазон индексов по N-й размерности.
A'reverse_range[(N)] - обратный диапазон индексов по N-й размерности.
A'length[(N)] - протяженность диапазона индексов по N-й размерности.
A'ascending[(N)] - функция, равная true, если диапазон индексов по N-й размерности - возврастающий.
Примерыпримененияатрибутов:
type s2 is array(2 downto 1, 0 to 3)of integer;
s2'left(1) = 2, s2'right(2) = 3, s2'high(1) = 2, s2'low(2) = 0,
s2'range(2) = 0 to 3, s2'reverse_range(1) = 1 to 2, s2'length(2) = 4.
Циклы в VHDL.
В VHDL существует три вида циклов: бесконечный, whileи for. Синтаксис бесконечного цикла выглядит следующим образом:
[ loop_label: ] loop
{ sequential_statement }
end loop [ loop_label ] ;
Такие циклы часто используются для генерирования синхросигнала, как это сделано в следующем примере:
signalClock: BIT := ’0′; — инициализация в 0
Clk_1: process(Clock)
Begin
L1: loop
Clock <= notClock after5 ns; — период Clock равен 10 ns
endloop L1;
end process Clk_1;
Для завершения цикла может быть применен оператор exit, а для прерывания теку-
щейитерации – оператор next:
[ label: ]exit [ loop_label ][when boolean _expression];
[ label:]next [ loop_label ] [when boolean _expression];
Если метка не указана, то действие оператора относится к содержащему его циклу. Необязательное выражение boolean_expression позволяет задавать условие прерыва- ния выполнения цикла или его итерации. В следующем коде выполнение цикла завер- шится, когда А станет больше 10:
L2: loop
A := A+1;
exitL2 whenA > 10;
endloop L2;
Цикл for
Общая форма циклаforимеет следующий вид:
[loop_label:]for loop_indexin rangeloop
sequential statements
end loop [loop-label];
Индекс цикла loop_index автоматически описывается при использовании оператора цикла и не требует его предварительного декларирования. Индекс инициализируется первым значением из указанного диапазона range, после чего выполняются последо- вательные операторы (sequential statements). Индекс цикла может быть использован в последовательных операторах, но не может быть изменен в них. После выполнения одной итерации цикла индекс получает следующее значение из диапазона и последо- вательность операторов выполняется снова. Процесс продолжается до тех пор, пока индекс цикла не переберет все значения диапазона. После этого выполнение операто- ра цикла заканчивается и индекс становится недоступным. Для следующего цикла- индекс count_value в начале выполнения цикла будет инициализирован значением 0 и последовательность операторов в цикле будет выполнена 128 раз:
for count_valuein0to127 loop
count_out <= count_valueafter5 ns;
endloop;
Цикл while
Выполнение операторов, размещенных в условном цикле while, будет продолжаться до тех пор, пока условие conditionимеет значение истины:
[ loop_label: ] while conditionloop
{ sequential_statement }
end loop [ loop_label ] ;