- •Предисловие
- •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
4.2. Конечные автоматы
В языке AHDL конечные автоматы реализуются так же легко, как таблицы истинности и булевы уравнения. Компилятор использует эвристические алгоритмы автоматического присваивания состояний, которые минимизируют логические ресурсы, необходимые для реализации конечных автоматов, а также автоматически назначает биты, выбирая или T- или D-триггер (TFF или DFF) для каждого бита, присваивает значения состояниям, применяет технику логического синтеза для получения уравнений возбуждения.
Для определения конечного автомата на языке AHDL необходимо включить следующие элементы:
объявление конечного автомата (раздел Variable);
булевы уравнения управления (раздел Logic);
переходы между состояниями в операторе Table или Case (раздел Logic).
В AHDL можно импортировать и экспортировать конечные автоматы между TDF файлами и другими файлами проекта, определяя входные и выходные сигналы как автоматные порты в разделе Subdesign.
Для создания конечного автомата необходимо объявить его имя, состояния и, дополнительно, биты конечного автомата в объявлении конечного автомата в разделе Variable.
В приведенном ниже примере конечный автомат с именем ss объявлен в разделе Variable. Состояния автомата определены как s0 и s1, а биты состояния не объявлены. Бит состояния – это выход триггера, который используется конечным автоматом для запоминания однобитного значения.
SUBDESIGN example_sm ( clk, reset, d, enable : INPUT; q : OUTPUT; )
VARIABLE ss: MACHINE WITH STATES (s0, s1);
BEGIN ss.clk = clk; ss.reset = reset; ss.ena = enable; |
CASE ss IS WHEN s0 => q = GND; IF d THEN ss = s1; END IF; WHEN s1 => q = VCC; IF !d THEN ss = s0; END IF; END CASE; END; |
Переходы конечного автомата определяют условия изменения к новому состоянию. Необходимо условно присвоить состояния в пределах одной поведенческой конструкции для определения переходов конечного автомата. Для этой цели рекомендуются операторы Case или Table. Также можно определить выходное значение для состояния с помощью оператора If Then. В примере переходы из каждого состояния определяются в предложениях WHEN оператора Case.
Сигналы Clk, Reset, и Ena управляют триггерами регистра состояний конечного автомата.
Пример:
SUBDESIGN example_sm ( clk, reset : INPUT; ccw, cw : INPUT; phase[3..0] : OUTPUT; ) |
BEGIN ss.clk = clk; ss.reset = reset; TABLE ss, ccw, cw => ss; s0, 1, x => s3;
|
VARIABLE ss: MACHINE OF BITS (phase[3..0]) WITH STATES ( s0 = B"0001", s1 = B"0010", s2 = B"0100", s3 = B"1000");
|
s0, x, 1 => s1; s1, 1, x => s0; s1, x, 1 => s2; s2, 1, x => s1; s2, x, 1 => s3; s3, 1, x => s2; s3, x, 1 => s0; END TABLE; END; |
В этом примере показан конечный автомат, выходы которого зависят только от состояний автомата (конечный автомат с синхронными выходами). Выходы phase[3..0], объявленные в разделе Subdesign, также объявлены как биты конечного автомата ss в описании конечного автомата. Переходы между состояниями определены в таблице переходов, которая реализована с помощью оператора Table. Необходимо отметить, что для данного примера ccw и cw никогда не должны одновременно равняться 1 в одной и той же таблице, перекрытие комбинаций битов может привести к непредсказуемым результатам.
Другой способ проектирования конечного автомата с синхронными выходами – опускание присваиваний значений состояниям и точное объявление выходных триггеров.
Пример: автомат Мура
SUBDESIGN example_sm ( clk : INPUT; reset : INPUT; y : INPUT; z : OUTPUT; ) VARIABLE ss: MACHINE WITH STATES (s0, s1, s2, s3); zd: NODE; BEGIN ss.clk = clk; ss.reset = reset; |
z = DFF(zd, clk, VCC, VCC); TABLE ss, y => ss, zd; s0, 0 => s0, 0; s0, 1 => s2, 1; s1, 0 => s0, 0; s1, 1 => s2, 1; s2, 0 => s2, 1; s2, 1 => s3, 0; s3, 0 => s3, 0; s3, 1 => s1, 1; END TABLE; END; |
Здесь используется D-триггер (DFF), вызванный с помощью ссылки, для синхронизации выходов с тактовой частотой.
AHDL также поддерживает реализацию конечных автоматов с асинхронными выходами. Выходы этих типов конечных автоматов могут изменяться при изменении входов, несмотря на переходы сигнала Clock.
Пример (автомат Мили):
SUBDESIGN example_sm ( clk : INPUT; reset : INPUT; y : INPUT; z : OUTPUT; ) VARIABLE ss: MACHINE WITH STATES (s0, s1, s2, s3); BEGIN ss.clk = clk; ss.reset = reset; |
TABLE ss, y => z, ss;
s0, 0 => 0, s0; s0, 1 => 1, s1; s1, 0 => 1, s1; s1, 1 => 0, s2; s2, 0 => 0, s2; s2, 1 => 1, s3; s3, 0 => 0, s3; s3, 1 => 1, s0; END TABLE; END; |
Логика, созданная для конечного автомата компилятором, будет вести себя так, как это описано в файле TDF. Тем не менее проекты конечных автоматов, которые точно объявляют биты состояния и не используют позиционного кодирования, часто допускают значения битов состояния, не связанные с действительными состояниями. Эти неприсвоенные значения называются некорректными состояниями. Проект, который вводит некорректные состояния, например в результате нарушений времени предустановки и удержания, может приводить к неверным выходам. Для возвращения из некорректных состояний в проектах, не использующих FLEX-устройств или опцию позиционного кодирования, необходимо назвать все некорректные состояния автомата. Предложение WHEN OTHERS в операторе Case, которое принуждает выполнить каждый переход из некорректного в известное состояние, применяется только к состояниям, которые объявлены, но не упоминаются в предложении WHEN. Предложение WHEN OTHERS может форсировать принудительные переходы, только если все некорректные состояния объявлены в описании конечного автомата.
Для n-битного конечного автомата, существует 2n возможных состояний. Если объявлен автомат с n бит, то необходимо добавить имена фиктивных состояний.
Пример:
SUBDESIGN recover ( clk : INPUT; go : INPUT; ok : OUTPUT; ) VARIABLE sequence : MACHINE OF BITS (q[2..0]) WITH STATES ( idle, one, two, three, four, illegal1, illegal2, illegal3);
|
BEGIN sequence.clk = clk; CASE sequence IS WHEN idle => IF go THEN sequence = one; END IF; WHEN one => sequence = two; WHEN two => sequence = three; WHEN three => sequence = four; WHEN OTHERS => sequence = idle; END CASE; ok = (sequence == four); END; |
Этот пример содержит 3 бита: q2, q1, и q0. Следовательно, существует 8 состояний. Так как объявлено только 5 из них, было добавлено 3 фиктивных состояния.