Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AHDL.doc
Скачиваний:
20
Добавлен:
08.11.2018
Размер:
869.89 Кб
Скачать

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 фиктивных состояния.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]