Изучение 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 - файл, соответствующий заданной настройке.