Altifigence Academy

28 / 37 · Conceito

Máquinas de estados: separe estado, transição e saída

Construa uma FSM a partir da tabela e compare Moore, Mealy, estados ilegais e política de solicitações.

O estado resume apenas o passado necessário

Se a saída não depender somente das entradas atuais, defina qual estado armazenar. Em vez de guardar todo o histórico, distinga apenas a informação necessária para decidir o futuro.

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

Considere um controlador de início e conclusão: IDLE espera, BUSY processa e DONE indica conclusão por um ciclo.

Estado atualCondiçãoPróximo estadobusydone
IDLEstart=0IDLE00
IDLEstart=1BUSY00
BUSYwork_done=0BUSY10
BUSYwork_done=1DONE10
DONESempreIDLE01

busy e done são saídas do estado atual. Ao observar conclusão em BUSY, a borda muda para DONE e então done=1. São saídas Moore.

Cada coluna registra uma borda de subidaBorda de subida Instante em que o clock passa de 0 para 1. É diferente do nível alto, que abrange todo o intervalo com CLK=1. Saiba mais, entradas anteriores e estados «depois» posteriores; o alinhamento não representa propagação físicaAtraso de propagação Tempo entre uma mudança de entrada e a estabilização da saída no valor correto. Equivalência lógica e comportamento temporal são propriedades distintas. Saiba mais. Parte-se de IDLE. Ao aceitar work_done, passa-se a DONE com done=1. De DONE retorna-se a IDLE independentemente de start.

Saídas Moore acompanham o estado atual
Ver os dados da forma de onda
Dados da forma de onda: cada caractere é um intervalo; um ponto mantém o estado anterior; p representa um ciclo de clock.
SinalForma de ondaValores do barramento
borda2345E0 → E1 → E2 → E3
start10.1
work_done0.10
estado depois2.34BUSY → DONE → IDLE
busy depois1.0.
done depois0.10

RTL que separa transição e armazenamento

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);

Este exemplo SystemVerilog explica a estrutura de controle. A geração de work_done pelo processador conectado e a sincronização das entradas são implementadas separadamente.

Perguntas que costumam faltar na especificação

O circuito ignora start em BUSY e DONE. Para aceitar uma solicitação ao concluir, mude primeiro a tabela. Uma saída Mealy usa estado e entrada atual e pode responder antes, mas exige revisar temporização e pulsos espúrios combinacionais. Escolher codificação binária ou one-hotOne-hot Representação na qual exatamente um bit vale 1. Se todos em 0 também forem permitidos, a condição é chamada one-hot-or-zero. Saiba mais e escolher Moore ou Mealy são decisões diferentes.

Experimente

Em DONE, start=1 por um ciclo. Esta FSM inicia outro trabalho imediatamente? O que deve mudar para admitir trabalhos consecutivos?

Ler a explicação

A tabela leva DONE→IDLE e não aceita essa solicitação. Mude a transição para BUSY se start estiver ativo em DONE, ou projete um protocolo que mantenha a solicitação. Verifique novamente a duração de done e o instante de aceitação.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.