Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://www.sm.bmstu.ru/sm5/n4/oba/gl3.html
Дата изменения: Thu Feb 15 17:43:24 2007 Дата индексирования: Mon Oct 1 18:46:11 2012 Кодировка: Windows-1251 Поисковые слова: п п п п п п п п п п п п п п п |
![]() |
![]() |
![]() |
Глава 3. Язык описания аппаратуры AHDL |
3.1. Общие сведения Язык описания аппаратуры AHDL разработан фирмой Altera и предназначен для описания комбинационных и последовательностных логических устройств, групповых операций, цифровых автоматов (state machine) и таблиц истинности с учетом архитектурных особенностей ПЛИС фирмы Altera. Он полностью интегрируется с системой автоматизированного проектирования ПЛИС MAX+PLUS II. Файлы описания аппаратуры, написанные на языке AHDL, имеют расширение *.TDF (Text design file). Для создания TDF-файла можно использовать как текстовый редактор системы MAX+PLUS II, так и любой другой. Проект, выполненный в виде TDF-файла, компилируется, отлаживается и используется для формирования файла программирования или загрузки ПЛИС фирмы Altera.Операторы и элементы языка AHDL являются достаточно мощным и универсальным средством описания алгоритмов функционирования цифровых устройств, удобным в использовании. Язык описания аппаратуры AHDL дает возможность создавать иерархические проекты в рамках одного этого языка или же в иерархическом проекте использовать как TDF-файлы, разработанные на языке AHDL, так и другие типы файлов. Для создания проектов на AHDL можно, конечно, пользоваться любым текстовым редактором, но текстовый редактор системы MAX+PLUS II предоставляет ряд дополнительных возможностей для ввода, компиляции и отладки проектов (см. Главу 2).Проекты, созданные на языке AHDL, легко внедряются в иерархическую структуру. Система MAX+PLUS II позволяет автоматически создать символ компонента, алгоритм функционирования которого описывается TDF-файлом, и затем вставить его в файл схемного описания (GDF-файл). Подобным же образом можно вводить собственные функции разработчика помимо порядка 300 макрофункций, разработанных фирмой Al tera, в любой TDF-файл. Для всех функций, включенных в макробиблиотеку системы MAX+PLUS II, фирма Altera поставляет файлы с расширением *.inc, которые используются в операторе включения INCLUDE.При распределении ресурсов устройств разработчик может пользоваться командами текстового редактора или операторами языка AHDL для того, чтобы сделать назначения ресурсов и устройств. Кроме того, разработчик может только проверить синтаксис или выполнить полную компиляцию для отладки и запуска проекта. Любые ошибки автоматически обнаруживаются обработчиком сообщений и высвечиваются в окне текстового редактора. При работе с AHDL следует соблюдать так называемые 'Золотые правила' (Golden Rules). Выполнение этих правил позволит эффективно применять язык AHDL и избежать многих ошибок:
Общие 'золотые правила' ввода проекта :Общие 'золотые правила' системы MAX+PLUS II :
3.2. Использование чисел и констант в языке AHDL 3.2.1 Использование чисел Числа используются для представления констант в булевских выражениях и уравнениях. Язык AHDL поддерживает все комбинации десятичных, двоичных, восьмеричных и шестнадцатеричных чисел. Ниже приведен файл decode1.tdf, который представляет собой дешифратор адреса, генерирующий высокий активный уровень сигнала разрешения доступа к шине, если адрес равен шестнадцатеричному числу 370h.SUBDESIGN decode1 ( address[15..0] : INPUT; chip_enable : OUTPUT; ) BEGIN chip_enable = (address[15..0] == H"0370"); END; В этом примере десятичные числа использованы для указания размерности массива бит, которым записывается адрес шины. Шестнадцатеричным числом H'0370' записано значение адреса, при котором обеспечивается высокий уровень сигнала. 3.2.2. Использование констант В файле AHDL можно использовать константы для описательных имен разных чисел. Такое имя, используемое на протяжении всего файла, может быть более информативным, чем число; например, имя UPPER_LI несет больше информации, чем число 103. В языке AHDL константы вводятся объявлением CONSTANT. Приведенный выше файл можно записать по-другому, используя вместо числа H'0370' константу IO_ADDRESS. CONSTANT IO_ADDRESS = H'0370'; SUBDESIGN decode2 ( a[15..0] : INPUT; ce : OUTPUT; ) BEGIN ce = (a[15..0] == IO_ADDRESS); END; Преимущество использования констант особенно заметно, если одно и то же число используется в файле несколько раз. Тогда, если его нужно изменить, меняют его только один раз в объявлении константы. 3.3. Комбинационная логика Как известно, логическая схема называется комбинационной, если в заданный момент времени выходы являются только функциями входов в этот момент времени. Комбинационная логика в языке AHDL реализована булевыми выражениями и уравнениями, таблицами истинности и большим количеством макрофункций. В число примеров комбинаторных логических функций входят Дешифраторы, мультиплексоры и сумматоры. 3.3.1. Реализация булевых выражений и уравнений Булевы выражения - это множества узлов, чисел, констант и других булевых выражений, выделяемых операторами, компараторами и, возможно, сгруппированные в заключающих круглых скобках. Булево уравнение устанавливает равенство между узлом или группой и булевым выражением. В качестве примера приведен файл boole1.tdf, в котором даны два простых булевых выражения, представляющих два логических элемента. SUBDESIGN boole1 ( a0, a1, b : INPUT; out1, out2 : OUTPUT; ) BEGIN out1 = a1 & !a0; out2 = out1 # b; END; Здесь выход out1 получается в результате логической операции И, примененной ко входу а1 и инвертированному входу а0, а выход out2 получается в результате применения логической операции ИЛИ к выходу out1 и входу b. Поскольку эти уравнения обрабатываются одновременно, последовательность их следования в файле не важна.3.3.2. Объявление NODE (узел) Узел, который объявляется в секции переменных VARIABLE в объявлении NODE, можно использовать для хранения промежуточных выражений. Это полезно делать, если булево выражение повторяется несколько раз и его целесообразно заменить именем узла. Приведенный выше файл boole1.tdf можно переписать по-другому: SUBDESIGN boole2 ( a0, a1, b : INPUT; out : OUTPUT; ) VARIABLE a_equals_2 : NODE; BEGIN a_equals_2 = a1 & !a0; out = a_equals_2 # b; END; Здесь объявляется узел a_equals_2 и ему присваивается значение выражения a1 & !a0. Использование узлов помогает экономить ресурсы устройств, если узел используется в нескольких выражениях.3.3.3. Определение групп Группа может включать в себя до 256 элементов (бит), рассматривается как совокупность узлов и участвует в различных действиях как единое целое. В булевых уравнениях группа может быть приравнена булевому выражению, другой группе, одному узлу, VCC, GND,1 или 0. В каждом случае значения группы разные. Если группа определена, для краткого указания всего диапазона ставят две квадратные скобки [ ]. Например, группу а[4..1] можно кратко записать как а[ ]. Примеры определения групп: 3.3.4. Реализация условной логики Условная логика делает выбор между режимами в зависимости от логических входов. Для реализации условной логики используются операторы IF или CASE: В операторе IF оценивается одно или несколько булевых выражений и затем описываются режимы для разных значений этих выражений. В операторе CASE дается список альтернатив, которые имеются для каждого возможного значения некоторого выражения. Оператор оценивает значение выражения и по нему выбирает режим в соответствии со списком. 3.3.4.1. Логика оператора IF В качестве примера рассмотрим файл priority.tdf, в котором описан кодировщик приоритета, который преобразует уровень самого приоритетного активного входа в значение. Он генерирует двухразрядный код, показывающий вход с наивысшим приоритетом, запускаемый VCC.
SUBDESIGN priority ( low, middle, high : INPUT; highest_level[1..0] : OUTPUT; ) BEGIN IF high THEN highest_level[] = 3; ELSIF middle THEN highest_level[] = 2; ELSIF low THEN highest_level[] = 1; ELSE highest_level[] = 0; END IF; END; Здесь оцениваются входы low, middle и high, чтобы определить, запущены ли они VCC. На выходе получится код, соответствующий приоритету того входа, который был запущен VCC. Если ни один вход не запущен, значение кода станет 0.3.3.4.2. Логика оператора CASE В качестве примера рассмотрим файл decoder.tdf, реализующий функции Дешифратора, преобразующего код из двухразрядного в четырехразрядный. В результате его работы два двухразрядных двоичных входа преобразуются в один 'горячий код', который так называется потому, что четыре его допустимых значения содержат по одной единице: 0001, 0010, 0100, 1000.SUBDESIGN decoder ( code[1..0] : INPUT; out[3..0] : OUTPUT; ) BEGIN CASE code[] IS WHEN 0 => out[] = B"0001"; WHEN 1 => out[] = B"0010"; WHEN 2 => out[] = B"0100"; WHEN 3 => out[] = B"1000"; END CASE; END; Здесь группа входа code [1..2] может принимать значения 0, 1, 2, 3. В зависимости от реального кода активизируется соответствующая ветвь оператора и только она одна в данный момент времени. Например, если на входе code [] равен 1, на выходе out устанавливается значение В'0010'.3.3.4.3. Сравнение операторов IF и CASE Операторы IF и CASE похожи. Иногда использование любого из них приводит к одним и тем же результатам: |
If Then |
Case |
IF a[] == 0 THEN y = c & d; ELSIF a[] == 1 THEN y = e & f; ELSIF a[] == 2 THEN y = g & h; ELSIF a[] == 3 THEN y = i; ELSE y = GND; END IF; |
CASE a[] IS WHEN 0 => y = c & d; WHEN 1 => y = e & f; WHEN 2 => y = g & h; WHEN 3 => y = i; WHEN OTHERS => y = GND; END CASE; |
Однако между этими двумя операторами существуют несколько важных различий: IF a THEN IF a THEN c = d; c = d; END IF; ELSIF b THEN IF !a & |