- •Предисловие
- •1. Структура проекта на ahdl
- •Оператор options
- •Оператор assert
- •Раздел variable используется для описания и/или генерации переменных, используемых в разделе Logic.
- •Раздел Variable может также содержать операторы If Generate, которые могут быть использованы для генерирования объектов, узлов, регистров, конечных автоматов, и псевдоимен конечных автоматов.
- •2. Элементы языка ahdl
- •2.1. Зарезервированные слова и идентификаторы
- •2.2. Символы
- •2.3. Строковые и символьные имена
- •2.4. Числа
- •2.5. Арифметические и логические выражения
- •2.6. Встроенные оценочные функции
- •2.7. Шины (группы), диапазоны и поддиапазоны шин
- •3. Примитивы и мегафункции
- •3.1. Обращение к примитивам и мегафункциям
- •1. Непосредственное обращение
- •2. Использование элемента как переменной
- •3.2. Примитивы
- •Примитивы триггеров
- •3.3. Библиотека параметризуемых функций (lpm)
- •1. Пример использования lpm_and, _or, _xor, _inv функций
- •2. Пример использования функции lpm_decode
- •3. Пример использования функций lpm_mux, busmux, mux
- •Пример использования функций lpm_counter, _latch, _ff,
- •5. Пример использования функций lpm_add_sub, _compare, _mult
- •6. Пример использования функции lpm_ram_dq
- •4. Описание логических схем
- •4.1. Операторы Оператор if then
- •Оператор case
- •Оператор defaults
- •Оператор if generate
- •Оператор for generate
- •Оператор truth table
- •4.2. Конечные автоматы
- •5. Основы проектирования плис с
- •Текстовой редактор
- •Литература
- •Прототипы примитивов буферов
- •Приложение 2 Прототипы примитивов триггеров
- •Приложение 3 Прототипы мегафункций
- •Содержание
- •Основы языка описания аппаратуры
- •Методические указания
- •630092, Г. Новосибирск, пр. К. Маркса, 20
6. Пример использования функции lpm_ram_dq
INCLUDE “lpm_ram_dq.inc”; INCLUDE “lpm_bustri.inc”; SUBDESIGN ram
(we_ram : INPUT;
data_in[5..0],address_r[3..0] : INPUT;
en_data : INPUT;
data_out[5..0] : BIDIR;
) VARIABLE data_r[5..0] : NODE;
BEGIN data_r[]=lpm_ram_dq(.data[]=data_in[], .address[]=address_r[], .we=we_ram)
WITH (LPM_WIDTH=6, LPM_WIDTHAD=4,
LPM_OUTDATA=”UNREGISTERED”, LPM_ADDRESS_CONTROL=”UNREGISTERED”, LPM_INDATA=”UNREGISTERED”)
RETURNS (.q[]);
data_out[]=lpm_bustri(.data[]=data_r[],.enabledt=en_data) WITH(LPM_WIDTH=6)
RETURNS(.tridata[]); END;
4. Описание логических схем
4.1. Операторы Оператор if then
содержит список операторов, выполняемых в том случае, если булевское выражение, расположенное между ключевыми словами IF и THEN, принимает истинное значение .
Следующий пример демонстрирует использование оператора If Then:
IF a[] == b[] THEN
c[8..1] = H "77";
addr[3..1] = f[3..1].q;
f[].d = addr[] + 1;
ELSIF g3 $ g4 THEN
f[].d = addr[];
ELSE
d = VCC;
END IF;
Оператор If Then имеет следующие характеристики.
-
Между ключевыми словами IF и THEN располагается булевское выражение, в зависимости от значения которого выполняется или не выполняется список операторов, располагающийся за ключевым словом THEN. Каждый оператор в этом списке оканчивается символом (;).
-
Между ключевыми словами ELSEIF и THEN располагается дополнительное булевское выражение, а за ключевым словом THEN также располагается список операторов, выполняемых в зависимости от значения булевского выражения. Эти необязательные ключевые слова и операторы могут повторяться многократно.
-
Оператор(ы), следующий за ключевым словом THEN, активизируется в том случае, если соответствующее ему булевское выражение принимает истинное значение. При этом последующие конструкции ELSEIF THEN игнорируются.
-
Ключевое слово ELSE, за которым следует один или более операторов, схоже по своему значению с ключевыми словами WHEN OTHERS в операторе Case. Если ни одно из булевских выражений не приняло истинное значение, то выполняются операторы, следующие за ключевым словом ELSE. В примере, показанном выше, если ни одно из булевских выражений не приняло истинного значения, то выполняется оператор d = VCC. Использование ключевого слова ELSE не является обязательным.
-
Значения булевских выражений, следующих за ключевыми словами IF и ELSEIF, оцениваются последовательно.
-
Оператор If Then заканчивается ключевыми словами END IF, за которыми следует символ (;).
Оператор If Then может генерировать логические схемы, которые слишком сложны для компилятора. Если оператор If Then содержит сложные булевские выражения, то учет инверсии каждого из этих выражений вероятно приведет к еще более сложным булевским выражениям. Например, если a и b – сложные выражения, то инверсия этих выражений может быть еще более сложной.
Оператор If |
Интерпретация компилятором |
IF a THEN c = d; ELSIF b THEN c = e; ELSE c = f; END IF; |
IF a THEN c = d; END IF; IF !a & b THEN c = e; END IF; IF !a & !b THEN c = f; END IF; |
В отличие от операторов If Then, которые могут оценивать лишь значения булевских выражений, операторы If Generate могут оценивать значения наборов арифметических выражений. Основное различие между операторами If Then и If Generate состоит в том, что в первом случае значение булевского выражения оценивается аппаратным способом, а во втором случае значение набора арифметических выражений оценивается на этапе компиляции.