Использование констант и оценочных функций
Вы можете использовать константу в AHDL файле, давая ей дескриптивное имя на число или текстовую строку. Аналогичным образом Вы можете использовать оценочную функцию, давая ей дескриптивное имя на арифметическое выражение. Это имя, которое можно использовать по всему файлу, может быть более информативным и читаемым, чем число, строка или арифметическое выражение. Например, числовая константа UPPER_LIMIT более информативна, чем число 130.
Константы и оценочные функции особенно полезны, если одно и тоже число, строка или арифметическое выражение повторяются несколько раз в файле: если оно изменяется, то требуется изменить только один оператор. В AHDL константы реализуются с помощью оператора Constant, а оценочные функции с помощью оператора Define.
AHDL снабжен также предопределенными оценочными функциями USED, CEIL, и FLOOR.
Файл decode2.tdf, приведенный ниже, имеет туже самую функциональность как и decode1.tdf, но использует константу IO_ADDRESS вместо числа H"0370".
CONSTANT IO_ADDRESS = H"0370";
SUBDESIGN decode2
(
a[15..0] : INPUT;
ce : OUTPUT;
)
BEGIN
ce = (a[15..0] == IO_ADDRESS);
END;
Вы можете определить константы и оценочные функции с помощью арифметических выражений. Компилятор оценивает арифметические операторы в арифметическом выражении и сокращает их до числовых значений. Логика для этих выражений не создается.
Файл strcmp.tdf, приведенный ниже, определяет константу FAMILY и использует ее в операторе Assert для проверки того, является ли текущее семейство устройств FLEX 8000.
PARAMETERS
(
DEVICE_FAMILY
% DEVICE_FAMILY является предопределенным параметром %
);
CONSTANT FAMILY = "FLEX8000";
SUBDESIGN strcmp
(
a : INPUT;
b : OUTPUT;
)
BEGIN
IF (DEVICE_FAMILY == FAMILY) GENERATE
ASSERT
REPORT "Обнаружена компиляция для FLEX8000 "
SEVERITY INFO;
b = a;
ELSE GENERATE
ASSERT
REPORT " Обнаружена компиляция для % семейства"
DEVICE_FAMILY
SEVERITY ERROR;
b = a;
END GENERATE;
END;
Файл minport.tdf, приведенный ниже, определяет оценочную функцию MAX, которая гарантирует минимальную ширину порта в разделе Subdesign.
PARAMETERS (WIDTH);
DEFINE MAX(a,b) = (a > b) ? a : b;
SUBDESIGN minport
(
dataA[MAX(WIDTH,0)..0] : INPUT;
dataB[MAX(WIDTH,0)..0] : OUTPUT;
)
BEGIN
dataB[] = dataA[];
END;