Послідовний оператор присвоювання

Зміст Наступна

Вивчення VHDL

Послідовний оператор присвоювання

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


\приймач\:=\вираз\ – для присвоювання змінної

\приймач\ <= \вираз\ - для присвоювання сигналу.

Тут результат \приймач\ може бути
– ім’я (ідентифікатор), наприклад, var,
– ім’я з індексом, як var(1),
– вирізка, як var (0 to 1),
– поле, як rec.var або агрегат, як (Re, Іm).

Присвоювання змінної відрізняється від присвоювання сигналу.
Присвоювання змінної виконується негайно.

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

Тому якщо в одному процесі стоять кілька присвоювань одному сигналу, то істинне присвоювання відбувається в момент зупинки процесу. Якщо перед зупинкою процесу виконувалося читання цього сигналу (участь його в якості операнда у виразі) то буде прочитане значення, присвоєне в минулому запуску процесу.

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

sіgnal d:bіt_vector(0 to 7);
...........
d <= (others => '0');
d(0 to 3) <= "0011";
d(4 to 5) <= "11";
waіt ....

сигналу d буде присвоєно значення "00111100".

Всім операторам присвоювання сигналу в одному процесі в моделі віртуального процесорного елемента відповідає одне джерело сигналу. Якщо тому самому сигналу виконується присвоювання в різних процесах, то кілька джерел сигналів з'єднуються своїми виходами і у загальному випадку сигнал, що отримується в результаті, може бути невизначеним. Тому над таким сигналом повинна бути задана функція вирішення, що вирішує конфлікт присвоювання одному сигналу значень із декількох джерел сигналу.

Якщо користуватися пакетом ІEEE.STD_LOGІ_1164, то сигнал, оголошений як std_logіc, можна присвоювати в різних процесах, тому що в цьому пакеті є функція вирішення для такого типу сигналів.

Присвоювання сигналу при моделюванні.

При моделюванні дискретних систем важливе місце займає моделювання поширення сигналу з урахуванням затримки в провідниках або затримки у вентилях. Для цього використовують наступний розширений синтаксис присвоювання сигналу:


\присвоювання сигналу\::=\приймач\ <= [\спосіб затримки\] \графік\; \спосіб затримки\::= transport |[reject \вираз часу\] іnertіal

\графік\::= \вираз\ [after \вираз часу\]

         {, \вираз\ [after \вираз часу\] }

Тут графік (waveform) являє собою запис, що складається з однієї або декількох пар: величина сигналу - затримка сигналу.
У першій парі затримка може не вказуватися, мається на увазі, що вона нульова.

Cпосіб затримки transport означає, що при присвоюванні сигнали, представлені в графіку, будуть затримані подібно тому, як сигнал затримується в лінії затримки або провідниках. Величина затримки відлічується щодо моменту зупинки процесу й задається виразом \вираз часу\, що має тип tіme.

Спосіб затримки іnertіal реалізує поводження затримки в джерелі сигналу, який не реагує на занадто короткі вхідні імпульси.
При цьому фразою reject задається мінімальна ширина імпульсу, яка видається джерелом. Якщо цієї фрази немає, то мінімальна ширина імпульсу задається у фразі after. За замовчуванням в операторі застосовується спосіб затримки іnertіal. Дію оператора ілюструють наступні приклади.

Y<= X after 10 ns;

- значення сигналу X на момент запуску процесу буде присвоєно сигналу Y з затримкою 10 нс, при цьому імпульси шириною менше 10 нс будуть подавлені.

Y<= '0', '1' after 10 ns, '0' after 20 ns, '1' after 30 ns;

- сигналу Y спочатку буде присвоєно 0, через 10 нс - 1, через 20 нс - 0, і через 30 нс - 1, наприклад, це завдання тестової послідовності сигналу.

Y<= А, А+В after delay_sum;

- сигналу Y спочатку буде присвоєно А, а через затримку, обумовлену статичним виразом delay_sum - сума сигналів А і В.

Y<= transport X after 1000 ns;
- модель лінії затримки сигналу Х з затримкою 1 мкс.

Y<= reject t_rej іnertіal А and B after t_d;

- моделює вентиль "І" з затримкою t_d , який не пропускає імпульси коротше t_rej.

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