9. Конечные автоматы

9.1. КА на ПЛИС

Концепция конечных автоматов широко применяется в программировании, отлично зарекомендовав себя как модель абстракции над последовательной логикой. Общее представление конечного автомата выглядит следующим образом:

[здесь картинка из понга/харрисов где состояние регистр выходы]

Самостоятельное составление подобной  структуры по абстрактному описанию вызывает большие проблемы, поэтому в языках описания аппаратуры продумана последовательность использования конструкций, которые позволяют инструментам компиляции и моделирования не только представить в виде последовательной логики, но и извлечь информацию в виде графа конечного автомата и предоставить его пользователю для визуальной верификации корректности описанного поведения.

Конструкции VHDL

Для описания КА в языке VHDL используется конструкция case, собственный тип данных и rising_edge(clk): каждый "случай" по сути своей подразумевает наличие "состояния", в котором может находиться схема, а благодаря тактовому сигналу реализуется дискретность времени.  Конструкция case использует инициализированный сигнал любого типа  в качестве входного аргумента ветвления и в зависимости от его текущего значения выполняет одну из ветвей. Хотя использование этого оператора соответствует логике поведения КА, у него имеется ряд ограничений:

  • Использование номеров в качестве состояний в случае типов данных integer/unsigned/... легко может запутать
  • Такой способ описания не распознается инструментами компиляции и моделирования как конечный автомат (а это важно)

Описание конечного автомата на VHDL принято использовать путем создания собственного типа данных, относящегося к перечисляемым (аналог enum), и затем создание сигнала этого типа для дальнейшего использования в конструкции case. Полученная реализация для описанного ранее конечного автомата будет выглядеть следующим образом: