Для того, чтобы обеспечить генерацию только при выполнении определенного условия, можно использовать оператор generate, который имеет следующий вид:
[<generate label>:] if<condition>generate
<concurrent statements>
endgenerate [<generatelabel>];
Рассмотрим пример проекта, в котором может либо присутствовать аппаратный умножитель, либо производиться последовательное умножение путем сложения со сдвигом. В зависимости от установленного пользователем параметра HARDWARE_MULTIPLIER, производится или не производится синтез выраженияmult<= a * b;
gen_mult:
if HARDWARE_MULTIPLIER = “YES” generate
mult<= a * b;
endgenerategen_mult;
Условная генерация удобна для описания зависимых от семейства ПЛИС компонентов. Если использовать параметры, описывающие наличие или отсутствие каких-либо блоков, в сочетании с операторами условной генерации, то такой модуль на VHDL не потребует редактирования при смене целевого семейства ПЛИС. Например:
clk_gen_sp6:
ifTARGET_FAMILY = “Spartan-6” generate
--устанавливаем модуль тактового генератора
--избиблиотеки Spartan-6
end generate clk_gen_sp6;
clk_gen_v6:
if TARGET_FAMILY = “Virtex-6” generate
--устанавливаеммодультактовогогенератора
--из библиотеки Virtex-6
end generate clk_gen_v6;
При необходимости создания нескольких экземпляров какого-либо устройства или компонента можно использовать оператор множественной генерации:
[<generate label>:] for<identifier>in<range>generate
<concurrent statements>
end generate [<generate label>];
С использованием такого оператора можно создать компактное описание схемы, состоящей из похожих фрагментов. Например, следующий фрагмент создаст 8 умножителей, каждый из которых умножает один и тот же сигнал data на собственный коэффициент k(i).
channel8: foriin 0 to 7 generate
mult(i) <= k(i) * data;
endgeneratechannel8;