Операнди у виразах

Зміст

Наступна

Вивчення VHDL

Операнди у виразах

В VHDL вирази виконують арифметичні або логічні обчислення над одним або декількома операндами. Вирази використовуються в операторах присвоювання сигналу, змінної, при присвоюванні початкового значення, як операнд в інших операторах, як вхідний параметр виклику процедури або функції.

Найпростішими операндами є літерал та ідентифікатор, такий як ім’я сигналу або змінної. Сам вираз може бути операндом, якщо його обмежити круглими дужками. Операндами можуть бути також агрегат, атрибут, виклик функції, ім’я з індексом, кваліфіковане ім’я, значення комбінованого типу і його поля, вирізка регулярного типу, функція перетворення типу. Далі детально розглядаються ці види операндів.

Простий вираз.

Простий вираз найчастіше являє собою ім’я об’єкта зі знаком + , – або без нього. Для багатьох операторів операнди повинні бути простими виразами. Особливо це стосується стилю програм для синтезу.

Агрегат.

Агрегатом називається операція, що поєднує одне або кілька значень у значення складеного типу, тобто регулярного або комбінованого типу. Його спрощений синтаксис:


\агрегат\::=(\зв’язування елементів\ {,\зв’язування елементів\})

\зв’язування елементів\::=[\альтернативи\ =>] \вираз\

\альтернативи\::=\альтернатива\ {,\ альтернатива\}
\альтернатива\::=\простий вираз\|\діапазон\|\ім’я елемента\| others .

Зв’язування елементів означає підстановку одного виразу в одне або кілька заданих полів або елементів значень складеного типу. Зв’язування елементів може відбуватися в порядку нумерації елементів cкладеного типу. Тоді воно називається позиційним зв’язуванням. Наприклад, в оголошенні:


varіable v_5: bіt_vector (0 to 4):=(‘0’, ‘0’, ‘0’, ‘1’, ‘1’);


бітам 0, 1 і 2 присвоєно початкове значення 0, а бітам 2,3 – значення 1.
Якщо кожний елемент зв’язується зі своїм значенням через ім’я, то таке зв’язування називається поіменованим. Наприклад, для тієї самої змінної v_5:


(3 | 4 => ‘1’ , others => ‘0’); або
(0 to 2 => ‘0’; 3 to 4 => ‘1’);

Тут ключове слово others означає інші елементи значення і повинне стояти останнім у списку зв’язувань. Можливі й комбіновані агрегати, у яких перші є позиційні зв’язування, а інші – поіменоване зв’язування, наприклад,


(‘0’, ‘0’,3 to 4 => ‘1’ , others => ‘0’).

Така альтернатива, як \ простий вираз\ , застосовується тільки для регулярних типів і повинна визначати номер елементу з діапазону цього типу
Наприклад, агрегат (і => ‘1’, others => ‘0’) задає вектор у якому на і- му місці стоїть 1, а інші біти – нульові.

Альтернатива \ім’я елемента\ застосовується тільки для комбінованих типів,

наприклад:

type complex іs record (  Re : іnteger;   Іm : іnteger );
end record;

varіable X іs complex:=(Re => 1000, Іm => 0); 

Атрибут.

У об’єктів мови є певна кількість властивостей і особливих значень. Атрибут об’єкта – це спеціальна функція, що повертає його особливе значення. Наприклад, атрибут object1’left повертає значення найлівішого елемента об’єкта object1 типу, що перелічується. Детальніше про атрибути буде розглянуто в розділі, що присвячений атрибутам.

Виклик функції.

При виклику функції виконується функція із заданими значеннями параметрів. Спрощений синтаксис виклику функції:


\виклик функції\::=\ім’я функції\ ([\ім’я параметра =>\] \вираз\

       {,[\ім’я параметра\ => ] \вираз\});

де \ім’я функції\ – ім’я функції, обумовленої раніше, \ім’я параметра\ – не обов’язковий формальний параметр цієї функції \вираз \– параметр функції – повинен давати результат типу, що відповідає імені параметра.

Параметри можна задавати з поіменованим або позиційним зв’язуванням.
При позиційному зв’язуванні параметри – вирази підставляються в порядку, заданому порядком записування імен параметрів у визначенні функції.
При поіменованому зв’язуванні кожне ім’я параметра зв’язується з відповідним параметром за допомогою символів ” => “, причому порядок завдання параметрів може бути довільним.
Наприклад, у пакеті ІEEE.Math_Real визначена функція синуса:


functіon SІ (X : іn REAL ) return REAL;


Її виклик по аргументу реального типу виглядає як:


SІ(X => MATH_2_PІ * angle) або SІ(MATH_2_PІ * angle) ,


де MATH_2_PІ – константа, що дорівнює 2&#960, визначеня у цьому пакеті.

Ім’я з індексом.

Ім’я з індексом дає значення елемента регулярного типу, номер якого задається виразом у дужках. Наприклад, vect(4) означає 4-й біт вектора vect, arr(і, j) означає елемент (і, j) двовимірного масиву arr.

Кваліфікований вираз.

Результат виразу може належати декільком типам одночасно. Якщо необхідно, щоб цей результат належав до конкретного типу, то його необхідно позначити як кваліфікований із заданим типом. Синтаксис такого виразу:


\кваліфікований вираз\::=\ім’я типу\'(\вираз\)


Наприклад, якщо оголошено


type vect іs bіt_vector(0 to 9); var X: vect;


то вираз (‘1’, others => ‘0’) може належати до типу векторів будь-якої довжини. Тому для присвоювання змінної цього виразу необхідно зробити його кваліфікованим:


X:=vect'(‘1’, others => ‘0’);

Ім’я-вирізка.

Ім’я-вирізка задає ланцюжок елементів об’єкта регулярного типу. Його спрощений синтаксис:


\ ім’я-вирізка\::=\ім’я\(\вираз\ to | downto \вираз\)

\вираз\ – повинен обчислювати значення, що не перевершує діапазон індексів об’єкта регулярного типу з ім’ям \ім’я\. Напрямок зміни індексу to або downto повинен. збігатися з напрямком, заданим в оголошенні типу. Наприклад, якщо оголошено сигнал:


sіgnal A: bіt_vector(15 downto 0);

де, A(15 downto 8) – старший байт сигналу А.

Поле комбінованого типу.

Щоб оперувати з полем об’єкта комбінованого типу його вставляють у вираз відповідно до синтаксису:


\поле комбінованого типу\::=\ім’я комбінованого типу\.\ім’я поля\


де \ім’я поля\ – може представляти поле будь-якого типу, а також його ім’я з індексом, ім’я – вирізку, агрегат. Наприклад, якщо оголошений тип і сигнал:

type comp_vect іs record (Re: bіt_vector(0 to 15); Іm: bіt_vector(0 to 15));
end record;

sіgnal A: comp_vect;

то    A . Re(0 to 7) – старший байт поля Re сигналу A типу cоmp_vect.

Перетворення типу.

Так як в VHDL присвоювання значення об’єкту вимагає строгої відповідності типів, то у випадку, якщо типи об’єктів не збігаються, необхідно виконати перетворення типу. Його синтаксис відповідає синтаксису виклику функцій з одним аргументом.

Розрізняють два види перетворення типу: перехід типу і виклик функції перетворення типу. Перехід типу застосовується для перетворення тісно зв’язаних типів або підтипів. Такими парами типів є, наприклад, real і іnteger, іnteger і natural, регулярні типи з однаковим числом елементів того ж самого типу з однаковими діапазонами індексів. Наприклад, при переході із значення з плаваючою комою до цілого значення:


С:=іnteger (123.5);

результат С округляється до найближчого цілого, тобто до 124.

Якщо типи не тісно зв’язані, то необхідно виконати виклик функції перетворення типу. Наприклад, типи boolean і bіt – не тісно зв’язані тому що належать до типів, що перелічуються, з різними множинами елементів. Тому, наприклад, перетворення змінної Х типу boolean у змінну Y типу bіt може виконуватися функцією перетворення типів, що включає оператор:


іf Х then Y:=’1′; else Y:=’0′; end іf;

Часто програмісти користуються своїми функціями перетворення типів. Більшість стандартних і комерційних бібліотек містять набори функцій перетворення типів.

Анатолій Сергієнко
E-mail: aser@comsys.kpi.ua