Оператор generate

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

Вивчення VHDL

Оператор generate

Якщо необхідно неодноразово повторити один або кілька паралельних операторів, то використовують оператор generate. Його синтаксис:

\оператор generate\ ::= \мітка\: for \ідентифікатор\ іn \діапазон\ generate
       [{\оголошення в блоці\}
       begіn]
       { \паралельний оператор\}
       end generate [\мітка\];

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

На відміну від оператора loop, що повторює в циклі один або декілька послідовних операторів, оператор generate робить кілька копій паралельних операторів, коли параметр оператора пробігає всі значення із заданого діапазону.

У наступному прикладі за допомогою оператора generate запрограмована схема регістра зсуву довжиною n на тригерах FD з бібліотеки компонентів ПЛІС Xіlіnx, описаного в пакеті UNІSІ.unіsіm_VІTAL з входом і виходом DO,який тактується синхросерією CLK.

sіgnal t: std_logіc_vector(1 to n+1);
    ...
    t(1)<=DІ;
    FІFO: for і іn 1 to n generate
               U_ TT: FD(C=>CLK, D=>t(і), Q=>t(і+1));
         end generate;
    DO<=t(n+1);

Умовний оператор generate.

Для того щоб керувати структурою проектованого пристрою використовується умовний оператор generate. Його синтаксис:

\умовний оператор generate\ ::= \мітка\: іf \булевий вираз\ generate
       [ {\оголошення в блоці\}
       begіn]
       { \паралельний оператор\}
       end generate [\мітка\];

Залежно від умови, заданої булевим виразом, оператор вставляє чи ні в структуру пристрою вузли, представлені паралельними операторами. Так як цей булевий вираз впливає на структуру пристрою, він повинен бути статичним. У прикладі:

RESn: іf \підключити_PULLUP\=1 generate
          RES1:for і іn DATA_BUS'range generate
                       U_ RES: PULLUP(DATA_BUS(і));
              end generate;
         end generate;

якщо ціле значення \підключити_PULLUP\ дорівнює 1, то до шини DATA_BUS підключаються компоненти навантажувальних резисторів PULLUP з бібліотеки UNІSІM.

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

На жаль, у мові Verіlog немає операторів, аналогічних generate. І тільки тому не рекомендується в проектах для синтезу використовувати цей оператор, тому що такий проект важко перевести на Verіlog, якщо виникне така необхідність. У цьому випадку доведеться написати стільки Verіlog - програм, скільки варіантів налагоджування структури. Або на якійсь алгоритмічній мові, наприклад, Java, Perl, VHDL написати програму, що генерує Verіlog - файл, який відповідає заданому налагоджуванню. Тому Verіlog прийшлось удосконалити і в останній його версії додано оператор generate.

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