
4 семестр / ППЭВС. Упражнение. Конечный автомат
.pdf
Методические указания по программному проектированию конечного автомата.
При программном проектировании конечного автомата, прежде всего необходимо представить его структуру и выделить два разных процесса: процесс перехода из одного состояния в другое и процессы действий (событий), происходящих в каждом из имеющихся состояний.
1. Смена состояний.
Конечный автомат всегда должен иметь определенный набор состояний. Начальным состоянием автомата всегда считается состояние на момент его включения. Затем автомат начинает «перебирать» состояния, исходя из заданных условий.
Набор состояний автомата определяется разработчиком перед началом проектирования. Каждое состояние желательно поименовать согласно смыслу выполняемых в нем действий, хотя можно и оставить порядковые номера – S1, S2 и т.д. (S-state). Каждому состоянию необходимо присвоить свой код (параметризировать). Например: parameter S0=3’d0, S1=3’d1, S2=3’d2 и т.д.
Предположим, автомат имеет некий набор состояний, в котором исходное состояние именуется STOP. Далее автомат при включении переходит в режим ожидания (Wait) в течение первых трех тактов удерживает это состояние, а затем переходит в режим чтения (Read).
Переходы, или удержания состояний всегда определяются на момент прихода фронта частоты синхронизации. Таким образом, блок описания переходов всегда имеет в списке чувствительности положительный перепад

импульса тактовой частоты. Относительно каждого состояния в этом блоке будет приниматься решение, при каких условиях буде совершаться тот или иной переход.
always@(posedge clk) begin
if (t0) state<=STOP else
case (state) STOP:
State<=Wait;
Wait:
If(count<3’d3)
State<=Wait; else state<=Read;
……..
2.Действия внутри состояний.
Каждое состояние автомата, хранящееся определенное время в регистре, сообщается входам LUT и порождает управление устройствами автомата: счетчиками циклов, регистрами, цепями непрерывного назначения.
В программе, если действия внутри состояний предусматривают наличие тактируемых устройств – счетчиков, регистров, то блок

описания также должен иметь в списке чувствительности фронт тактового импульса. Для нашего случая
always@(posedge clk) begin
case (state) STOP: begin: count<=3’d0;
обнуляем все используемые далее в программе ячейки; end
Wait: begin
count<=count+3’d1; end
……..