Для того, чтобы обеспечить генерацию только при выполнении определенного условия, можно использовать оператор 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;

  =  Перейти к содержанию  =