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.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
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.
Considere um controlador de início e conclusão: IDLE espera, BUSY processa e DONE indica conclusão por um ciclo.
| Estado atual | Condição | Próximo estado | busy | done |
|---|---|---|---|---|
| IDLE | start=0 | IDLE | 0 | 0 |
| IDLE | start=1 | BUSY | 0 | 0 |
| BUSY | work_done=0 | BUSY | 1 | 0 |
| BUSY | work_done=1 | DONE | 1 | 0 |
| DONE | Sempre | IDLE | 0 | 1 |
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.
Ver os dados da forma de onda
| Sinal | Forma de onda | Valores do barramento |
|---|---|---|
| borda | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| estado depois | 2.34 | BUSY → DONE → IDLE |
| busy depois | 1.0. | |
| done depois | 0.10 |
RTL que separa transição e armazenamento
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.