Altifigence Academy

28 / 37 · Теория

Конечный автомат: разделение состояния, переходов и выходов

Постройте FSM по таблице спецификации и сравните выходы Мура и Мили, недопустимые состояния и политику запросов.

Состояние хранит только нужное о прошлом

Если текущих входов недостаточно для определения выхода, задайте сохраняемое состояние. Вместо всей истории различайте лишь то, что влияет на будущее поведение.

Sk+1=F(Sk,Xk)S_{k+1}=F(S_k,X_k)

Рассмотрим контроллер запуска и завершения работы. IDLE ждёт запрос, BUSY обрабатывает, DONE показывает завершение один цикл.

Текущее состояниеУсловиеСледующее состояниеbusydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONEВсегдаIDLE01

busy и done — выходы текущего состояния. Например, после фронта, на котором BUSY наблюдает завершение, состояние становится DONE и done=1. Это выходы автомата Мура.

Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
Начально IDLE. После фронта принятия work_done состояние становится DONE, done=1. За DONE следует IDLE независимо от start.

Выход автомата Мура следует текущему состоянию
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
фронт2345E0 → E1 → E2 → E3
start10.1
work_done0.10
state после2.34BUSY → DONE → IDLE
busy после1.0.
done после0.10

RTL с разделением перехода и хранения

SystemVerilog
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;
state_t state, next_state;
always_comb begin
  next_state = state;
  case (state)
    IDLE: if (start) next_state = BUSY;
    BUSY: if (work_done) next_state = DONE;
    DONE: next_state = IDLE;
    default: next_state = IDLE;
  endcase
end
always_ff @(posedge clk)
  if (rst) state <= IDLE;
  else state <= next_state;
assign busy = (state == BUSY);
assign done = (state == DONE);

Это пример SystemVerilog, поясняющий структуру управления. Формирование work_done подключённым обработчиком и синхронизацию входов нужно реализовать отдельно.

Что легко пропустить в спецификации

Схема игнорирует start в BUSY и DONE. Если новый запрос нужен одновременно с завершением, сначала меняйте таблицу переходов. Выход Мили использует и состояние, и текущий вход, позволяя быструю реакцию, но требует проверки комбинационного пути и выбросов. Выбор двоичного либо one-hotOne-hot — представление, в котором ровно один бит равен 1. Если допускаются также все нули, это отдельно называют one-hot-or-zero. Подробнее-кодирования независим от классификации Мура/Мили.

Попробуйте сами

В состоянии DONE пришёл start=1 на один цикл. Начнёт ли FSM выше новую работу сразу? Что изменить для непрерывной обработки?

Прочитать объяснение

Таблица задаёт DONE→IDLE, поэтому запрос не принимается. Нужно перейти из DONE в BUSY при start либо спроектировать протокол сохранения запроса. Затем проверить длительность done и момент приёма по новой спецификации.

Выбор действует в этом браузере. Его можно изменить внизу страницы.