Оператор generate

Cодержание Следующая

Изучение VHDL

Оператор generate

Если необходимо неоднократно повторить один или несколько параллельных операторов, то используют оператор generate. Его синтаксис:

\оператор generate\ ::= \метка\: for \идентификатор\ in \диапазон\ generate
       [{\объявление в блоке\}
       begin]
       { \параллельный оператор\}
       end generate [\метка\];

Метка оператора generate необходима для обозначения сгенерированной структуры, \идентификатор\ — это параметр оператора generate, а фраза \диапазон\ — диапазон его изменения. Они имеют такие же синтаксис и семантику, как и в операторе loop. В операторе могут быть вставлены такие же объявления, как в декларативной части тела архитектуры.

В отличие от оператора loop, который повторяет в цикле один или несколько последовательных операторов, оператор generate делает несколько копий параллельных операторов, когда параметр оператора пробегает все значения из заданного диапазона.

В следующем примере с помощью оператора generate запрограммирована схема сдвигового регистра длиной n на триггерах FD из библиотеки компонентов ПЛИС Xilinx, описанного в пакете UNISIM.unisim_VITAL с входом DI и выходом 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\ ::= \метка\: if \булевское выражение\ generate
       [ {\объявление в блоке\}
       begin]
       { \параллельный оператор\}
       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 из библиотеки UNISIM.

Направлением научной деятельности автора является синтез структур вычислительных устройств. Поэтому язык VHDL нравится именно тем, что с помощью таких средств, как оператор generate можно программировать структуру устройства в зависимости от параметров ее настройки. Например, можно создать проект универсального цифрового фильтра, число ступеней которого изменяется в зависимости от заданного качества фильтрации.

К сожалению, в языке Verilog нет операторов, аналогичных generate. И только поэтому не рекомендуется в проектах для синтеза использовать этот оператор, так как такой проект трудно перевести на Verilog, если возникнет такая необходимость. В этом случае прийдется написать столько Verilog - программ, сколько вариантов настройки структуры. Или на каком-то алгоритмическом языке, например, Java, Perl, VHDL написать программу, генерирующую Verilog - файл, соответствующий заданной настройке.

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