Смекни!
smekni.com

Основы языка VHDL (стр. 2 из 4)

Тип “массив”

Объект типа arrayсостоит из элементов одного типа. Нижеданыпримерымассивов:

type ADDRESS_WORD is array (0 to 63) of BIT;

type DATA_WORD is array (7 downto 0) of MVL;

type ROM is array (0 to 125) of DATA_WORD;

ADDRESS_WORD– одноразмерный массив из 64 элементов типа BIT. DATA_WORD– одноразмерный массив из 8 элементов типа MVL. ROM– массив из 126 элементов типа DATA_WORD, т.е. в данном случае имеем дело с массивом массивов.

Доступ к элементам массива осуществляется с помощью индексов, например, ADDRESS_WORD(26) ссылается на 27-ой элемент массива ADDRESS_WORD.

1.5 Операции языка VHDL

В языке VHDLимеются операции следующих категорий:

1. Логические операции

2. Операции отношений

3. Операции сложения/вычитания

4. Операции умножения/деления

5. Прочие

Приоритет операций возрастает от категории 1 к категории 5. Операции одной категории имеют одинаковый приоритет и выполняются в последовательности: слева направо. Скобки используются для изменения последовательности исполнения.

Операции логические

Существует шесть логических операций: and, or, nand, nor, xor, not.

Операции применимы к типам BIT, BOOLEAN, к одноразмерным массивам BITи BOOLEAN. При выполнении битовые значения ‘0’ и ‘1’ интерпретируются как булевские FALSEи TRUE. Результат имеет тот же тип, что и операнды. Операция not– унарная операция, она имеет приоритет категории 5.

Операции отношений

В языке VHDLимеются следующие операции отношений:

=, /=, <, <=, >, >=

Результатом выполнения любой операции отношений является булевское выражение BOOLEAN. Операции равенства ( = ) и неравенства ( /= ) допустимы со всеми типами, за исключением типа “файл”. Остальные четыре операции допустимы над скалярными типами (целочисленными, перечислимыми) или над массивами дискретного типа. Когда операндами являются массивы, то сравнение выполняется слева направо по одному элементу, например при следующем сравнении:

BIT_VECTOR'('0', '1', '1') < BIT_VECTOR'('1', '0', '1')

получен результат TRUE, т.к. первый элемент вектора слева меньше первого элемента вектора справа. Другой пример, если декларирован тип:

typeMVLis('U', '0', '1', 'Z' );

то результат сравнения:

MVL'( 'U' ) <MVL'( 'Z' )

будет TRUE, т.к. ‘U’ находится левее ‘Z’.

Операции суммирования, вычитания, конкатенации

Операции имеют обозначения:

+, -, &.

Операнды, участвующие в операциях сложения ( + ) и вычитания ( - ) должны быть одного числового типа, результат оказывается того же типа. Операндами в конкатенации ( & ) могут быть или отдельные элементы или одномерные массивы. Результат выдается в виде массива, например при выполнении конкатенации:

‘0’ & ‘1’

образуется массив символов “01”, или еще пример:

‘C’ & ‘A’ & ‘T’

дает“CAT”.

Операции умножения, деления

К этой группе оператций относятся: *, /, mod, rem.

Операнды умножения ( * ) и деления ( / ) должны быть одновременно либо целочисленного типа (integer) либо типа с плавающей запятой (floatingpoint). Результат всегда того типа, что и операнды. Операция умножения может иметь один операнд физического типа, а другой – либо целочисленного, либо натурального типа. Результат выдается в виде физического типа.

В операции деления допустимо делить объект физического типа на целочисленный или натуральный. Результат - всегда физического типа. Деление физического типа на физический дает целочисленный результат.

Операции остатка ( rem) и “деления по модулю” ( mod) в качестве операндов могут иметь целочисленные типы и результат - целочисленного типа. Результат remимеет знак первого операнда и определяется следующим образом:

AremB= A- ( A/ B) * B

Результат mod имеет знак второго операнда и определяется следующим образом:

AmodB= A– B* N,

где N– некоторое целое.

Прочие операции

К их числу следует отнести: Abs, ** и другие. Операция выделения абсолютного значения ( abs ) совместима с любым числовым типом операнда. Операция возведения в степень ( ** ) операндом слева имеет целое или тип с плавающей точкой, а в качестве правого операнда (степень) - только целое.

1.6 Последовательные операторы

К последовательным операторам (SequentialStatements) относятся операторы присваивания (AssignmentStatements), условные операторы if(ifStatements) и case(caseStatements), операторы цикла (loop - next Statements) и другие. Рассмотрим некоторые из операторов этого типа

Оператор присваивания

Эти операторы делятся на операторы присваивания переменной (обозначается знаком :=) и операторы назначения сигнала (<=). В обоих случаях снаала вычисляется значение выражения, стоящее справа от знака равенства, а затем полученное значение присваивается переменной или сигналу, стоящим слева от знака. Например, оператор

abar:= nota;

задает новое значение переменной abar, а именно – инверсное значение a.

Оператор

z <= not (a and b);

задает новое значение сигнала z, которое получается справа от знака <=.

Оператор if

В общем случае ifпредставляет собой последовательность выражений, оговаривающих условия. В качестве условий применимы любые выражения, при вычисление которых получается булевская величина (FALSEи TRUE).

ifбулевское_выражение then

последовательностные_выражения

[elsifбулевское_выражение then

последовательностные_выражения ]

[else

последовательностные_выражения]

endif;

Выражение ifвычисляется путем просмотра условий одного за другим, пока не будет найдено истинное. Затем вычисляется набор последовательностных выражений, связанных с этим условием. Предложений вида elsifв выражении ifможет быть от 0 и более. Может использоваться и предложение else. Выражения ifмогут вкладываться одно в другое без ограничений.

Рассмотрим простой пример.

ifCTRL= '1' then

MUX_OUT<= "10";

else

MUX_OUT<= "01";

endif;

Если управляющий сигнал CTRL1 равен ‘1’, то выходной сигнал MUX_OUTпринимает значение "10", иначе MUX_OUTпримет значение "01". На этом оператор ifзавершается.

Рассмотрим более сложный пример.

ifCTRLI= '1' then

if CTRL2 = '0' then

MUX_OUT<= "0010";

else

MUX_OUT<= "0001";

end if;

else

if CTRL2 = '0' then

MUX_OUT <= "1000";

else

MUX_OUT <= "0100";

end if;

endif;

Если управляющий сигнал CTRL1 равен ‘1’, тогда при условии (открывается вложенное if) CTRL2=’0’ выходной сигнал MUX_OUT<= "0010", иначе (т.е. при любых других значениях сигнала CTRL2) MUX_OUT<= "0001". Здесь завершается внутренний (вложенный) оператор if. Иначе (т.е. при любых других значениях сигнала CTRL1), если (открывается новый вложенный оператор if) CTRL2=’0’, тогда MUX_OUT<= "1000", иначе (т.е. при любых других значениях сигнала CTRL2) MUX_OUT<= "1000". Здесь завершается внутренний (вложенный) оператор if, а также завершается и наружный.

Оператор case

Операторcaseимеет следующий формат:

caseвыражение is

whenвариант выбора => последовательностные_выражения

whenвариант выбора => последовательностные_выражения

-- произвольное число вариантов выбора.

whenothers=> последовательностные_выражения]

endcase;

При вычислении выражения caseвыбирается одна из ветвей в соответствии со значением выражения. Выражение может иметь значения типа перечислимого или типа одномерного массива. Рассмотримпример:

type WEEK_DAY is (MON, TUE, WED, THU, FRI, SAT, SUN);

type DOLLARS is range 0 to 10;

variable DAY: WEEK_DAY;

variable POCKET_MONEY: DOLLARS;

case DAY is

when TUE => POCKET_MONEY := 6; -- ветвь 1

when MON I WED => POCKET_MONEY := 2; -- ветвь 2

when FRI to SUN => POCKET_MONEY := 7; -- ветвь 3

when others => POCKET_MONEY := 0; -- ветвь 4

endcase;

Переменная WEEK_DAYимеет значения перечислимого типа (дни недели). Переменная DOLLARSимеет целочисленные значения в диапазоне от 0 до 10. Ветвь 1 выбирается, когда день недели TUE. Ветвь 2 выбирается в случае когда дни недели MONили WED(вертикальная черта означает ИЛИ). Ветвь 3 покрывает значения от FRIдо SUN, т.е. FRI, SATи SUN. Ветвь 4 покрывает все оставшиеся значения, т.е. THU.

Оператор loop

Оператор loopиспользуется для задания итерации набора последовательных выражений.

[ярлык для loop: ] итерационная схема loop

последовательностные_выражения

endloop[ярлык для loop] ;

Существует три итерационных схемы. Первая имеет форму:

forидентификатор inдиапазон

Пример использования схемы:

FACTORIAL := 1;

for NUMBER in 2 to N loop

FACTORIAL := FACTORIAL * NUMBER;

end loop;

Тело loopисполняется N-1 раз, при этом идентификатор NUMBERв конце каждой итерации увеличивается на 1. Подразумевается, что идентификатор целочисленного типа и значения его лежат в диапазоне от 2 до N.

Второй итерационной схемой является следующая:

whileбулевскоe_выражение

Пример использования схемы:

J:=0;SUM:=10;

WH-LOOP: while J<20 loop -- loop имеет ярлык WH_LOOP

SUM := SUM * 2;

J:=J+3;

end loop;

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

Третьей cхемой является конструкция, в которой итерационная схема не задается и выход из loopосуществляется с использованием выражений: exit, nextили return, например:

SUM:=1;J:=0;

L2: loop--loopимеет ярлык

J:=J+21;

SUM := SUM* 10;

exit when SUM > 100;

endloopL2;

В этом примере выражение exitзаставляет выходить из петли L2 когда SUMстановится больше 100. При отсутствии выражения exitloopбудет исполняться бесконечно.

1.7 Параллельные операторы

К параллельным операторам (Concurrent Statements) оператор process, оператор параллельного вызова процедуры, оператор конкретизаци компонента, оператор генерации (generate) и другие. Параллельные операторы определяют параллельное поведение схем, порядок их выполнения не зависит от их появления внутри блока.

Рассмотрим кратко оператор process. В общем виде он может быть записан следующим образом.

[имя процесса:][postponed] process [(список)]

раздел деклараций

begin

операторы

endprocess[имя процесса];

Имя процесса и ключевое слово [postponed] являются необязательными и часто отсутствуют. Список, находящийся после ключевого слова process, хотя и является необязательным, на практике используется достаточно часто для указания сигналов запуска. Перед ключевым словом могут находиться различного рода декларации типов, констант атрибутов и т. д.

Хотя процесс является параллельным оператором, он может содержать последовательные операторы. Внутри процессов не мегут быть декларированы сигналы.