9. Конечные автоматы
9.1. КА на ПЛИС
Концепция конечных автоматов широко применяется в программировании, отлично зарекомендовав себя как модель абстракции над последовательной логикой. Общее представление конечного автомата выглядит следующим образом:
[здесь картинка из понга/харрисов где состояние регистр выходы]
Самостоятельное составление подобной структуры по абстрактному описанию вызывает большие проблемы, поэтому в языках описания аппаратуры продумана последовательность использования конструкций, которые позволяют инструментам компиляции и моделирования не только представить в виде последовательной логики, но и извлечь информацию в виде графа конечного автомата и предоставить его пользователю для визуальной верификации корректности описанного поведения.
Конструкции VHDL
Для описания КА в языке VHDL используется конструкция case, собственный тип данных и rising_edge(clk): каждый "случай" по сути своей подразумевает наличие "состояния", в котором может находиться схема, а благодаря тактовому сигналу реализуется дискретность времени. Конструкция case использует инициализированный сигнал любого типа в качестве входного аргумента ветвления и в зависимости от его текущего значения выполняет одну из ветвей. Хотя использование этого оператора соответствует логике поведения КА, у него имеется ряд ограничений:
- Использование номеров в качестве состояний в случае типов данных integer/unsigned/... легко может запутать
- Такой способ описания не распознается инструментами компиляции и моделирования как конечный автомат (а это важно)
Описание конечного автомата на VHDL принято использовать путем создания собственного типа данных, относящегося к перечисляемым (аналог enum), и затем создание сигнала этого типа для дальнейшего использования в конструкции case. Полученная реализация для описанного ранее конечного автомата будет выглядеть следующим образом: