. ПрочиеПриоритет операций возрастает от категории 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, т.к. первый элемент вектора слева меньше первого элемента вектора справа. Другой пример, если декларирован тип: type MVL is ('U', '0', '1', 'Z' ); то результат сравнения: MVL'( 'U' ) < MVL'( 'Z' ) будет TRUE, т.к. `U' находится левее `Z'. Операции суммирования, вычитания, конкатенацииОперации имеют обозначения:+, -, &.Операнды, участвующие в операциях сложения ( + ) и вычитания ( - ) должны быть одного числового типа, результат оказывается того же типа. Операндами в конкатенации ( & ) могут быть или отдельные элементы или одномерные массивы. Результат выдается в виде массива, например при выполнении конкатенации:`0' & `1' образуется массив символов “01”, или еще пример: `C' & `A' & `T' дает “CAT”. Операции умножения, деленияК этой группе оператций относятся: *, /, mod, rem.Операнды умножения ( * ) и деления ( / ) должны быть одновременно либо целочисленного типа (integer) либо типа с плавающей запятой (floating point). Результат всегда того типа, что и операнды. Операция умножения может иметь один операнд физического типа, а другой - либо целочисленного, либо натурального типа. Результат выдается в виде физического типа. В операции деления допустимо делить объект физического типа на целочисленный или натуральный. Результат - всегда физического типа. Деление физического типа на физический дает целочисленный результат.Операции остатка ( rem ) и “деления по модулю” ( mod ) в качестве операндов могут иметь целочисленные типы и результат - целочисленного типа. Результат rem имеет знак первого операнда и определяется следующим образом: A rem B = A - ( A / B ) * B Результат mod имеет знак второго операнда и определяется следующим образом: A mod B = A - B * N, где N - некоторое целое. Прочие операцииК их числу следует отнести: Abs, ** и другие. Операция выделения абсолютного значения ( abs ) совместима с любым числовым типом операнда. Операция возведения в степень ( ** ) операндом слева имеет целое или тип с плавающей точкой, а в качестве правого операнда (степень) - только целое.1.6 Последовательные операторыК последовательным операторам (Sequential Statements) относятся операторы присваивания (Assignment Statements), условные операторы if (if Statements) и case (case Statements), операторы цикла (loop - next Statements) и другие. Рассмотрим некоторые из операторов этого типаОператор присваиванияЭти операторы делятся на операторы присваивания переменной (обозначается знаком :=) и операторы назначения сигнала (<=). В обоих случаях снаала вычисляется значение выражения, стоящее справа от знака равенства, а затем полученное значение присваивается переменной или сигналу, стоящим слева от знака. Например, оператор abar := not a; задает новое значение переменной abar, а именно - инверсное значение a. Оператор z <= not (a and b); задает новое значение сигнала z, которое получается справа от знака <=. Оператор ifВ общем случае if представляет собой последовательность выражений, оговаривающих условия. В качестве условий применимы любые выражения, при вычисление которых получается булевская величина (FALSE и TRUE).if булевское_выражение then последовательностные_выражения [elsif булевское_выражение then последовательностные_выражения ] [else последовательностные_выражения] end if; Выражение if вычисляется путем просмотра условий одного за другим, пока не будет найдено истинное. Затем вычисляется набор последовательностных выражений, связанных с этим условием. Предложений вида elsif в выражении if может быть от 0 и более. Может использоваться и предложение else. Выражения if могут вкладываться одно в другое без ограничений. Рассмотрим простой пример. if CTRL = '1' then MUX_OUT<= "10"; else MUX_OUT<= "01"; end if; Если управляющий сигнал CTRL1 равен `1', то выходной сигнал MUX_OUT принимает значение "10", иначе MUX_OUT примет значение "01". На этом оператор if завершается. Рассмотрим более сложный пример. if CTRLI = '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; end if; Если управляющий сигнал 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 вариант выбора => последовательностные_выражения -- произвольное число вариантов выбора. when others => последовательностные_выражения] end case; При вычислении выражения 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 end case; Переменная WEEK_DAY имеет значения перечислимого типа (дни недели). Переменная DOLLARS имеет целочисленные значения в диапазоне от 0 до 10. Ветвь 1 выбирается, когда день недели TUE. Ветвь 2 выбирается в случае когда дни недели MON или WED (вертикальная черта означает ИЛИ). Ветвь 3 покрывает значения от FRI до SUN, т.е. FRI, SAT и SUN. Ветвь 4 покрывает все оставшиеся значения, т.е. THU. Оператор loopОператор loop используется для задания итерации набора последовательных выражений.[ярлык для loop: ] итерационная схема loop последовательностные_выражения end loop [ярлык для 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; end loop L2; В этом примере выражение exit заставляет выходить из петли L2 когда SUM становится больше 100. При отсутствии выражения exit loop будет исполняться бесконечно. 1.7 Параллельные операторыК параллельным операторам (Concurrent Statements) оператор process, оператор параллельного вызова процедуры, оператор конкретизаци компонента, оператор генерации (generate) и другие. Параллельные операторы определяют параллельное поведение схем, порядок их выполнения не зависит от их появления внутри блока.Рассмотрим кратко оператор process. В общем виде он может быть записан следующим образом.[имя процесса:][postponed] process [(список)] раздел деклараций begin операторы end process [имя процесса]; Имя процесса и ключевое слово [postponed] являются необязательными и часто отсутствуют. Список, находящийся после ключевого слова process, хотя и является необязательным, на практике используется достаточно часто для указания сигналов запуска. Перед ключевым словом могут находиться различного рода декларации типов, констант атрибутов и т. д. Хотя процесс является параллельным оператором, он может содержать последовательные операторы. Внутри процессов не мегут быть декларированы сигналы. 1.8 Описание интерфейса устройстваВ начале главы уже говорилось, что на моделируемое устройство в первую очередь следует посмотреть со стороны (“вид снаружи”) и для этого “черного ящика” определить интерфейс с внешним миром. Такая задача решается в VHDL декларацией интерфейса entity. Она задает имя описания, имена интерфейсных портов, направление передачи, тип портов. Порт - это сигнальная линия (шина), с помощью которой устройство (модель) взаимодействуют с окружающей средой. Например, для полусумматора (рис. 1.2) декларация будет выглядеть следующим образом:Рис. 1.2. Полусумматорentity half_adder is port(a, b: in BIT; sum, cur: out BIT); end half_adder; Здесь описание с именем half_adder имеет два входных порта, a и b (in - означает входной порт), и два выходных порта, sum и carry (out - означает выходной порт). Тип портов определен как BIT - означает, что сигналы на линиях портов могут принимать значения: `0' или `1'. Другим примером может послужить дешифратор, показанный на рис. 1.3. entity dec2x4 is port(a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3)); end dec2x4; Здесь описание с именем dec2x4 имеет три входных порта и четыре выходных. Выходные порты описаны как массив. BIT_VECTOR - это одномерный массив, диапазон задается параметром Z (0 to 3). Рис. 1.3. Декодер 2х4 Каждый интерфейсный порт может функционировать в следующих режимах: in - значение порта только считывается для использования внутри модели, out - значение порта может только обновляться моделью, но не считывается, inout - двунаправленный порт, значение считывается и обновляется моделью, buffer - буферный порт, значение считывается и обновляется моделью, но источником сигнала может быть либо буфер, либо одиночный источник. 1.9 АрхитектураАрхитектура (architecture body) моделирует взгляд на устройство “изнутри”. Устройство может рассматриваться под разными углами и описываться по-разному. Оно может предстать либо как композиция более простых модулей (структурный стиль моделирования), либо как набор параллельно исполняемых алгоритмов (стиль dataflow), либо описано как процесс последовательного исполнения операций (стиль “поведенческий”), либо может быть раскрыто сочетанием указанных стилей.
Страницы: 1, 2, 3
|