Изучение VHDL

       

Изучение 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.

signal t: std_logic_vector(1 to n+1);

t(1)<=DI;



FIFO: for i in 1 to n generate

           U_ TT: FD(C=>CLK, D=>t(i), Q=>t(i+1));

      end generate;

DO<=t(n+1);

Для того чтобы управлять структурой проектируемого устройства исполь­зуется условный оператор generate. Его синтаксис:

\условный оператор generate\::= \метка\: if \булевское выражение\ generate

                                [   {\объявление в блоке\}

                          begin]

                             { \параллельный оператор\}

                          end generate [\метка\];

В зависимости от условия, заданного булевским выражением, оператор вставляет или нет в структуру устройства узлы, представленные параллель­ными операто­рами. Так как это булевское выражение влияет на структуру устройства, оно должно быть статическим. В примере:

RESn: if \подключить_PULLUP\=1 generate

      RES1:for i in DATA_BUS'range generate

                   U_ RES: PULLUP(DATA_BUS(i));

           end generate;

      end generate;

если целое значение \подключить_PULLUP\ равно 1, то к шине DATA_BUS  подключаются компоненты нагрузочных резисторов PULLUP из библиотеки UNISIM.

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

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

Содержание раздела