Использование итеративно-генерируемой логики
Когда Вы хотите использовать несколько схожих блоков логики, Вы можете использовать оператор For Generate
для итеративно-генерируемой логики.
Файл iter_add.tdf, приведенный ниже, демонстрирует пример итеративного создания логики:
CONSTANT NUM_OF_ADDERS = 8;
SUBDESIGN iter_add
(
a[NUM_OF_ADDERS..1], [NUM_OF_ADDERS..1],
cin : INPUT;
c[NUM_OF_ADDERS..1], cout : OUTPUT;
)
VARIABLE
sum[NUM_OF_ADDERS..1], carryout[(NUM_OF_ADDERS+1)..1] : NODE;
BEGIN
carryout[1] = cin;
FOR i IN 1 TO NUM_OF_ADDERS GENERATE
sum[i] = a[i] $ b[i] $ carryout[i]; % Полный суматор %
carryout[i+1] = a[i] & b[i] # carryout[i] & (a[i] $ b[i]);
END GENERATE;
cout = carryout[NUM_OF_ADDERS+1];
c[] = sum[];
END;
В iter_add.tdf оператор For Generate используется для присваивания значений полным сумматорам. Выходной перенос carryout генерируется вместе с каждым полным сумматором.
Оператор If Generate
особенно полезен с оператором For Generate, который раздельно управляет специальными случаями, например, в первом и последнем каскадах многокаскадного умножителя.