Máquinas de estados e controladores
Projetar Moore e Mealy, codificar estados, minimizar e coordenar circuitos.
Uma máquina de estados finita, FSM, guarda apenas a parte do passado necessária para decidir o comportamento seguinte. Para reconhecer se um número binário é múltiplo de 3, não precisamos de guardar todos os bits recebidos: chega guardar o resto da divisão por 3, porque o próximo resto depende só do resto atual e do bit que chega.
Moore e Mealy
Numa Moore, a saída depende só do estado atual. Numa Mealy, pode depender também das entradas atuais. O próximo estado depende sempre do estado e das entradas.
Num diagrama Moore, escreve a saída dentro do estado e a condição na seta. Num Mealy, escreve condição/saída na seta. Uma saída Mealy pode mudar entre flancos se a entrada mudar; não a trates como um valor sempre registado.
Resto de uma sequência binária
Se o prefixo lido vale e chega um bit , o novo valor é . Para o resto módulo 3, com
Usamos estados R0, R1, R2 e saída em R0. O reset põe a máquina em R0. Aqui o prefixo vazio é interpretado como zero; se a especificação exigir pelo menos um bit, é preciso guardar também essa informação.
| Estado | |||
|---|---|---|---|
| R0 | R0 | R1 | 1 |
| R1 | R2 | R0 | 0 |
| R2 | R1 | R2 | 0 |
Diagrama da Moore
Ao ler 110, passamos R0 → R1 → R0 → R0, e o número é 6, múltiplo de 3. Ao ler 101, passamos R0 → R1 → R2 → R2: 5 deixa resto 2; a saída observada depois de cada flanco corresponde ao prefixo já recebido.
Laboratório de máquinas
No laboratório, cada passo corresponde a um flanco com o bit indicado. A saída de R0 antes de receber bits aparece no passo 0. Altera a saída de R0 para 0 e executa a entrada vazia: o erro já é observável antes do primeiro bit. Repõe o exemplo e segue 110; o percurso R0,R1,R0,R0 deve produzir 1,0,1,1, incluindo a saída inicial.
Em Resolver exercício, recebe uma máquina com um erro. Corrige-a ou usa Construir do zero para criar a tua solução. Verificar máquina compara as saídas para todas as entradas: explora os pares de estados alcançáveis com a referência e mostra uma palavra testemunha se encontrar uma diferença. Os exemplos apresentados ajudam a localizar o erro; são a exploração completa dos pares, e não esses exemplos isolados, que decide a equivalência. Esta comparação é entre máquinas do mesmo modelo e alfabeto, não entre Moore e Mealy.
Moore: saída inicial e uma saída após cada flanco, n + 1 saídas para n bits.
Editar estados e transições
Até 12 estados, 8 símbolos e 128 símbolos de entrada. Edições e resultados ficam neste dispositivo durante esta visita.
Pronta para executar.
Ver solução
Repõe o exemplo para consultar a máquina de referência. Os estados podem ter outros nomes: a verificação compara o comportamento para todas as entradas.
O seletor inclui também os exercícios do resto módulo 5 e da deteção Mealy de 11. Para o resto módulo 5, escolhe essa máquina e usa Resolver exercício seguido de Construir do zero. O estado após cada prefixo deve representar o seu resto. Com 1010, que representa 10, visita R1,R2,R0,R0 depois dos flancos; as saídas são 0,0,1,1, além do 1 inicial. A prática do capítulo pede a tabela e a justificação desse significado.
Síntese com flip-flops D
Codifica R0=00, R1=01, R2=10. São necessários dois flip-flops, porque . Escolhe recuperação de 11 para 00, com saída 0.
A tabela anterior, expandida para bits com próximo estado , dá o seguinte, onde cada linha com próximo bit 1 gera um termo do produto:
| 00 pronto R0 | 00 | 01 |
| 01 pronto R1 | 10 | 00 |
| 10 pronto R2 | 01 | 10 |
| 11 inválido | 00 | 00 |
Cada termo de D vem de uma linha cuja próxima saída do flip-flop é 1. As equações dão 00 para o estado inválido, como escolhido. O circuito tem lógica combinatória para D e dois flip-flops que atualizam juntos.
Em one-hot usamos um bit por estado: representam R0,R1,R2, com exatamente um bit a 1. A escrita h0 h1 h2 dá R0=100, R1=010, R2=001. Para obter o próximo bit de cada estado, reúne as setas que chegam a esse estado:
Por exemplo, R0 recebe uma seta de R0 com b=0 e outra de R1 com b=1. São os dois produtos de . Cada equação é uma OR de duas AND de duas entradas.
Estas equações só garantem a máquina pretendida nos códigos válidos. O código 000 ficaria em 000, porque todos os produtos valem 0. O reset estabelece 100; só a partir de um código válido é que as transições seguem a tabela. Se exigirmos recuperação de qualquer código inválido, precisamos também de verificar o invariante:
Com , escolhemos
Se val=1, conservamos as transições normais. Se val=0, os próximos bits são 100, mesmo num código com vários bits a 1. O custo desta recuperação é adicional ao das três equações base; one-hot não elimina estados inválidos.
Reconhecer padrões e produzir um impulso
Para detetar 101 com sobreposição, os estados distinguem os prefixos já reconhecidos: nenhum, 1, 10 e deteção 101. Depois de detetar, o último 1 já pode iniciar outra ocorrência, por isso em 10101 há duas deteções; voltar incondicionalmente ao estado inicial perderia a segunda.
Uma Moore completa para esse caso tem esta tabela, onde a saída indicada é a do estado atual e só D deteta o padrão:
| Estado | Prefixo útil | Saída | Próximo com 0 | Próximo com 1 |
|---|---|---|---|---|
| A | Nenhum | 0 | A | B |
| B | 1 | 0 | C | B |
| C | 10 | 0 | A | D |
| D | Deteção 101, termina em 1 | 1 | C | B |
Partindo de A, 10101 dá B,C,D,C,D. Observamos 0,0,1,0,1 depois dos flancos; em D, um novo 0 já completa o prefixo 10, por isso a transição vai para C. É esta informação conservada que permite a sobreposição.
Para produzir um impulso de um ciclo quando um botão fica 1, usa estados Espera, Impulso e Libertação. Espera entra em Impulso quando x=1; Impulso passa a Libertação se x ainda for 1, ou Espera se já for 0; Libertação conserva enquanto x=1. A saída só é 1 em Impulso. Sem Libertação, uma entrada longa pode provocar vários impulsos.
Mealy e sobreposição
Para detetar 11, basta recordar se o bit anterior era 1. Usa A para bit anterior 0, incluindo o reset, e B para bit anterior 1; a saída é 1 só quando o estado anterior é B e a entrada atual é 1:
| Estado anterior | Entrada 0, destino/saída | Entrada 1, destino/saída |
|---|---|---|
| A | A/0 | B/0 |
| B | A/0 | B/1 |
Em B, um novo 1 deteta um par e conserva B. Por isso, 111 produz 0,1,1: o segundo bit completa o primeiro par e o terceiro completa outro par com o segundo. Se a deteção voltasse a A, a segunda ocorrência perder-se-ia.
No laboratório, escolhe Mealy: detetar 11 e segue 111011. Antes dos flancos, os estados são A,B,B,B,A,B; as saídas da amostra são 0,1,1,0,0,1. O estado indicado na linha de cada passo é o destino da transição, mas a saída usa o estado anterior e o bit dessa linha. Não uses o novo estado B para atribuir 1 ao primeiro bit: ainda não havia um 1 anterior.
Com um flip-flop q que guarda esse bit anterior, as equações são e . A entrada b pode mudar z entre flancos. O simulador mostra amostras de entradas estáveis; não modela atrasos, glitches nem metastabilidade. Uma saída registada depois do flanco exigiria um registo de saída e uma especificação temporal própria.
Controlar uma soma em memória
Um controlador pode coordenar um contador de endereços e um acumulador sem executar instruções. Considera uma memória de 64 words com sinal de 32 bits, leitura combinatória e dados que não mudam durante o cálculo. Queremos somar os módulos dos 64 valores. Supomos que cada leitura, cálculo do módulo e soma estabilizam antes do flanco seguinte.
Usa um contador i de 6 bits para endereçar a memória. Se o bit de sinal do dado for 0, conserva-o; se for 1, calcula o complemento para dois. Interpreta a saída deste bloco como magnitude sem sinal: para 0x80000000, o módulo é e continua a ter o padrão 0x80000000. Não cabe como inteiro positivo com sinal de 32 bits, mas cabe numa magnitude sem sinal de 32 bits.
Antes de somar ao acumulador, alarga a magnitude com zeros. O pior caso são 64 valores iguais a :
Um acumulador sem sinal de 37 bits só chega a . São necessários 38 bits para garantir o resultado exato. O somador e o registo do acumulador têm essa largura; os endereços continuam a ter 6 bits.
Uma Moore com Espera, Soma e Concluído controla o percurso:
| Estado | Ação no flanco seguinte | Próximo estado |
|---|---|---|
| Espera, start=0 | S←0, i←0 | Espera |
| Espera, start=1 | S←0, i←0 | Soma |
| Soma, i diferente de 63 | S←S+módulo(Mem[i]), i←i+1 | Soma |
| Soma, i=63 | Acrescenta o último módulo; contador volta a 0 | Concluído |
| Concluído | Conserva o resultado | Concluído |
done=1 só em Concluído; o reset coloca o controlador em Espera. Neste contrato, reset prepara uma nova operação. Não o confundas com um controlador que aceite start novamente em Concluído.
Os controlos da Moore dependem só do estado: Espera inicializa os registos em cada flanco; Soma habilita a soma e o contador; Concluído conserva. start e a comparação i=63 só decidem o próximo estado.
O flanco de arranque inicializa, mas ainda não soma. Os 64 flancos seguintes somam as posições 0 a 63. No último, soma-se o dado do endereço antigo 63, o contador volta a 0 e entra-se em Concluído; a habilitação da soma desliga-se nesse novo estado. Se o contador voltasse a 0 com a soma ainda habilitada, os mesmos dados seriam somados de novo.
Com memória síncrona de latência de um ciclo, este traço deixa de servir: seria preciso lançar o endereço num ciclo e usar o dado no seguinte, com registos e estados adicionais. A largura da memória, a capacidade, a latência de leitura e a largura do resultado são decisões distintas.
Minimização e comunicação
Para minimizar uma Moore, agrupa primeiro estados com a mesma saída. Divide um grupo quando dois dos seus estados, para a mesma entrada, transitam para grupos diferentes. Repete até estabilizar. Só estados que continuam indistinguíveis podem ser fundidos; ter a mesma saída hoje não chega.
Exemplo de partição
Considera esta Moore, com estado inicial A:
| Estado | Saída | Próximo com 0 | Próximo com 1 |
|---|---|---|---|
| A | 0 | B | D |
| B | 0 | C | D |
| C | 0 | C | C |
| D | 1 | E | D |
| E | 1 | D | E |
Começamos com e . A entrada 1 separa C de A,B, pois C permanece no grupo de saída 0 enquanto A,B vão para saída 1. Ficamos com . A entrada 0 separa agora A de B: A vai para o grupo A,B, mas B para C. A partição final é . D e E continuam juntos porque ambas as suas transições ficam no seu próprio grupo.
A máquina reduzida tem quatro estados: A, B, C e H, que representa D/E. A vai para B/H, B para C/H, C para C/C e H para H/H, respetivamente com 0/1. Conserva as saídas 0,0,0,1. Não conseguimos fundir A e B, apesar da mesma saída inicial: a sequência 01 termina em saída 1 a partir de A e 0 a partir de B.
Duas máquinas podem coordenar-se por handshake de quatro fases, com dados, valid e ack no tempo, segundo a tabela seguinte:
| Passo | Dados | valid | ack | Regra |
|---|---|---|---|---|
| 1 | emissor fixa D | 0 | 0 | D estabiliza antes de valid |
| 2 | D estável | 1 | 0 | emissor pede aceitação |
| 3 | D estável | 1 | 1 | recetor aceitou D |
| 4 | D estável | 0 | 1 | emissor fecha pedido |
| 5 | livre | 0 | 0 | recetor fecha confirmação |
Neste protocolo conservamos D até ao fim da confirmação. O emissor baixa valid depois de ver ack=1; o recetor baixa ack depois de ver valid=0. Só então se prepara a transferência seguinte. Mudar D logo após pôr valid=1 pode fazer o recetor aceitar outra palavra. A confirmação também permite esperar pelo recetor: um impulso de um ciclo sem confirmação pode ser perdido se ele não o observar.
Entre relógios diferentes, entradas podem violar setup/hold e provocar metastabilidade. O modelo de FSM assume entradas amostradas válidas. A implementação exige sincronização apropriada; sincronizar bits independentes não garante uma palavra de dados coerente.
Exercícios
Guardar o que interessa
Constrói a tabela de transições Moore que indica se o prefixo binário é divisível por 5. Usa estados R0 a R4, com saída 1 só em R0, e segue a entrada 1010.
Constrói também a máquina no laboratório da lição: escolhe Moore: resto módulo 5, Resolver exercício e Construir do zero. Define as saídas e as dez transições, depois executa 1010. Verificar máquina compara o comportamento para todas as entradas; a autoavaliação abaixo serve para conferir a tabela e a explicação de cada estado.
Pista
Usa r seguinte=(2r+b) módulo 5.
Mais uma pista
Cada linha tem duas transições, uma por bit de entrada.
Solução
Para b=0/b=1: R0→R0/R1; R1→R2/R3; R2→R4/R0; R3→R1/R2; R4→R3/R4. Partindo de R0, 1010 dá R1,R2,R0,R0. O valor 10 é divisível por 5. O prefixo vazio continua interpretado como zero.
Confere a tua resposta:
- Constrói dez transições pelo resto (2r+b) módulo 5.
- Segue 1010 por R1,R2,R0,R0.
Erros frequentes
Não guardes apenas o último bit nem confundas o resto anterior com o valor completo.
Binário e one-hot
Uma Moore tem seis estados. Quantos flip-flops precisa com codificação binária mínima e com one-hot? Como deve ficar o reset one-hot?
Pista
Conta códigos na opção binária.
Mais uma pista
No one-hot apenas o flip-flop do estado inicial deve estar a 1.
Solução
Binária: flip-flops, com dois códigos não usados cujo comportamento deve ser definido. One-hot: seis flip-flops. No reset, o bit do estado inicial fica 1 e os outros cinco 0. Todos a zero não representa qualquer dos seis estados.
Confere a tua resposta:
- Binário três FF; one-hot seis.
- Reset one-hot ativa só o estado inicial.
Erros frequentes
One-hot não usa logaritmo do número de estados nem elimina automaticamente estados inválidos.
Entrada longa, saída curta
Partindo de Espera, segue a entrada amostrada 0,1,1,1,0,1 no controlador Espera/Impulso/Libertação. Dá a saída depois de cada flanco.
Pista
A saída Moore é 1 só no estado Impulso.
Solução
Os estados depois dos flancos são Espera,Impulso,Libertação,Libertação,Espera,Impulso. As saídas são 0,1,0,0,0,1. A sequência longa de 1 gera um único impulso; o 0 prepara a próxima deteção.
Confere a tua resposta:
- Saídas 0,1,0,0,0,1.
- Libertação impede repetir o impulso durante uma entrada longa.
Erros frequentes
Não retomes Espera incondicionalmente no fim de Impulso, porque a entrada longa poderia gerar outra deteção.
Uma saída igual não chega
Numa Moore, P e Q têm saída 0, R tem saída 1. Com entrada 0, P vai para R e Q para Q. Podem P e Q ser fundidos? Justifica pela minimização.
Pista
Começa pela partição das saídas.
Solução
Não. A partição inicial é e . Com entrada 0, P vai para o grupo de saída 1 e Q para o grupo de saída 0. O grupo tem de ser dividido. Um observador distingue-os depois desse input, apesar de a saída inicial ser igual.
Confere a tua resposta:
- P e Q não são equivalentes.
- A entrada 0 leva-os a grupos de saídas diferentes.
Erros frequentes
Comparar apenas a saída atual não prova equivalência de estados, porque dois estados só se fundem se as saídas futuras também coincidirem.
Dados recebidos antes de mudar
Num handshake valid/ack de quatro fases, o emissor pode mudar os dados assim que põe valid=1? Dá a sequência correta.
Pista
Valid anuncia dados estáveis, por isso o emissor só os pode mudar depois da aceitação.
Mais uma pista
O recetor confirma a aceitação com ack.
Solução
O emissor prepara dados e ativa valid. O recetor aceita-os e sobe ack; o emissor observa ack=1 e baixa valid; o recetor observa valid=0 e baixa ack. Neste protocolo, os dados ficam estáveis durante toda a confirmação, até ack voltar a 0. Só então pode prepará-los para a transferência seguinte. Mudar antes de ack pode fazer o recetor aceitar outra palavra. Um impulso curto sem confirmação pode perder-se.
Confere a tua resposta:
- Sequência valid1, ack1, valid0, ack0.
- Mantém os dados até ack voltar a 0, conforme o protocolo da lição.
Erros frequentes
Não assumas que os dois circuitos observam valid no mesmo instante.
Saída na transição
Projeta uma Mealy que, na amostra antes de cada flanco, produz z=1 quando a entrada atual completa dois bits 1 consecutivos, permitindo sobreposição. Usa um estado q que guarda o bit anterior, reset q=0, e define q seguinte e z. Segue 1,1,1,0,1,1. A saída deve ser observada com a entrada estável antes do flanco.
No laboratório, escolhe Mealy: detetar 11 e constrói a tua resposta através de Resolver exercício e Construir do zero. A e B podem representar q=0 e q=1, mas os nomes não influenciam a correção. Verifica a máquina e compara a saída de 111011 com a sequência calculada à mão. A verificação automática compara saídas; a autoavaliação abaixo inclui também as equações e a interpretação temporal.
Pista
Só precisas de recordar se o bit anterior era 1.
Mais uma pista
A saída usa q antigo e a entrada b atual.
Solução
Escolhe e . Antes dos seis flancos, q é 0,1,1,1,0,1, pelo que z é 0,1,1,0,0,1. Em 111, o segundo e o terceiro 1 completam pares diferentes. Como é Mealy, z também depende de b entre flancos. Se precisarmos de uma saída registada depois do flanco, a especificação e o circuito têm de o dizer.
Confere a tua resposta:
- q seguinte=b e z=q AND b.
- Saídas antes dos flancos 0,1,1,0,0,1; permite sobreposição.
Erros frequentes
Não uses o q recém-atualizado para a saída pedida antes do flanco. Isso marcaria também o primeiro 1, que ainda não completa um par.
One-hot do resto módulo 3
Uma Moore lê bits b do mais significativo para o menos significativo e guarda o resto . Usa a codificação one-hot h0 h1 h2: R0=100, R1=010, R2=001, com saída z=h0 nos estados válidos. Escreve as três equações de próximo estado para esses códigos. Modifica-as para que qualquer código inválido, incluindo 000 e 110, recupere para R0 no flanco seguinte. Define também z nos códigos inválidos.
Pista
Aplica r+=(2r+b) mod 3 a cada origem one-hot.
Mais uma pista
h0+=h0¬b+h1b; h1+=h0b+h2¬b; h2+=h1¬b+h2b sob exatamente-um-a-1; 000 regressa a 100 com o termo de recuperação.
Solução
As transições normais dão , e . Cada termo corresponde a uma seta que entra no estado respetivo.
Define , que só vale 1 nos três códigos válidos. Usa , e . Se v=0, o próximo código é 100, tanto para 000 como para 110, independentemente de b. Para manter z=0 até à recuperação, usa . O reset também estabelece 100; não substitui a lógica de recuperação se esta for exigida durante a execução.
Confere a tua resposta:
- Derivaste as três equações das transições
- Garantiste recuperação para 100 de todos os códigos inválidos
- Definiste z=0 nos códigos inválidos
Erros frequentes
Pôr tudo a 0 não é R0 válido.
O último endereço e o maior módulo
Uma memória de leitura combinatória contém 64 words de 32 bits em complemento para dois. Os dados não mudam durante a operação e todos os caminhos estabilizam antes do flanco seguinte. Projeta um datapath com um único somador e um controlador Moore para somar os módulos de todos os valores, sem overflow.
Indica as larguras do endereço, do bloco de módulo e do acumulador, incluindo o pior caso. Define o flanco de arranque, a atualização no último endereço e quando done fica ativo. Reset prepara outra operação; start não inicia nova operação no estado Concluído. O que teria de mudar se a memória só entregasse o dado um ciclo depois de receber o endereço?
Pista
O menor negativo de 32 bits não tem simétrico positivo na mesma representação. Separa a magnitude sem sinal da interpretação C2.
Solução
O contador tem 6 bits. O bloco de módulo conserva o dado positivo ou calcula o complemento para dois se for negativo, produzindo uma magnitude sem sinal de 32 bits. O módulo de é , código 0x80000000, que é válido nessa interpretação. Alarga a magnitude com zeros para a entrada do somador.
O máximo da soma é . Precisas de 38 bits sem sinal, porque o máximo de 37 bits é . O somador e o acumulador têm 38 bits; um resultado com sinal exigiria mais um bit.
Em Espera, os controlos inicializam S=0 e i=0 em cada flanco; start=1 decide a passagem para Soma. Cada flanco em Soma captura S mais o módulo do dado no endereço antigo e incrementa i. Se o i antigo for 63, acrescenta essa última word, o contador volta a 0 e a máquina entra em Concluído. São 64 flancos de soma depois do arranque. done é 1 só em Concluído e o acumulador fica desabilitado nesse estado. Reset volta a Espera.
Com memória síncrona de latência de um ciclo, não podes consumir no mesmo ciclo o dado do endereço acabado de lançar. Acrescenta uma fase de pedido e outra de consumo, ou registos que conservem o endereço e a validade do dado. O novo traço tem de respeitar essa latência; não se mantém automaticamente o custo de 64 ciclos.
Confere a tua resposta:
- Dimensionei contador de 6 bits e acumulador unsigned de 38 bits.
- Tratei o módulo de −2^31 como magnitude unsigned e alarguei com zeros.
- Somei 64 posições depois do flanco de inicialização e parei depois da posição 63.
Erros frequentes
O estado seguinte é decidido pelo i antigo. Se esperares por mais um flanco para sair quando i já for 0, voltas a somar a primeira posição. Testar i=63 não deve impedir a soma da própria posição 63.