Como você já entende, sua máquina de estado do controlador de semáforo é uma máquina síncrona. Ou seja, é acionado por algum relógio de tal maneira que todas as alterações na lógica combinatória acontecem e se estabelecem em valores estáveis por tempo suficiente antes do próximo limite do relógio para atender aos tempos de configuração necessários.
simular este circuito - esquemático criado usando o CircuitLab
Se os dados mudarem dentro desse tempo de configuração, a saída final não será apenas imprevisível, mas devido à metaestabilidade, ela poderá flutuar ou dançar em torno de algum valor intermediário por um tempo antes de escolher um valor final. Pode até oscilar entre a lógica um e a lógica zero em alta frequência, causando considerável fluxo de corrente e aquecimento.
Como tal, qualquer entrada assíncrona em uma máquina de estado precisa ser sincronizada em algum momento para que o sistema funcione conforme o esperado. No entanto, isso não significa necessariamente que você SEMPRE precisa adicionar outra trava ao sistema.
Se a entrada está apenas avançando para um único "próximo portão" E o estado da entrada é independente de todas as outras entradas, então realmente não importa se o sinal chega atrasado à parte. Basicamente, você precisa perguntar ... "Se perdermos a entrada de um ciclo de relógio, isso importa?"
Se, no entanto, a entrada alimentar vários portões diferentes. As próximas portas podem ver diferentes níveis lógicos e propagar um estado incorreto para a próxima trava. Basicamente, uma variedade de coisas ruins pode acontecer.
Isso pode ser ilustrado com seu exemplo simples. Observe que se a metaestabilidade no REG1 não for estabelecida antes do próximo relógio, isso poderá fazer com que o WALK e o semáforo acendam ao mesmo tempo ou nenhum dos dois possa acender.
simule este circuito
Além disso, se uma entrada assíncrona tiver um relacionamento com outra entrada assíncrona que você espera que ocorra ao mesmo tempo, a segunda entrada pode ser reconhecida, mas a primeira não.
Nos dois casos, é necessário adicionar uma trava de sincronização à entrada para alinhar o tempo do sinal com o relógio das máquinas de estado. Observe que isso adiciona um atraso no ciclo do relógio ou um atraso no meio do relógio, se você usar a outra extremidade do sinal do relógio.
No entanto, você pode estar se perguntando: "mas essa trava não sofre do mesmo problema?" e, claro, a resposta seria sim. Mas o truque aqui é permitir que essa metaestabilidade potencial ocorra em um ponto do circuito em que não importa, como destaquei acima.
Encontrar esse ponto pode ser problemático com entradas dependentes. Normalmente, uma lógica extra precisa ser adicionada para qualificar essas entradas.
No entanto, esteja ciente de que a metaestabilidade é uma coisa de probabilidade. Embora, devido às diferenças nas tolerâncias de fabricação, a maioria das travas se desvie muito rapidamente, existe a possibilidade de que ela permaneça instável por algum tempo. Quanto maior o intervalo entre os pulsos do relógio, maior a probabilidade de que ele tenha se estabelecido. Dessa forma, se o relógio do sistema estiver em alta frequência, é prudente dividi-lo para fazer a pré-trava para permitir mais tempo de acomodação. No entanto, mesmo assim, não há garantias.
Um pensamento final. Mencionei que existe a possibilidade de altas correntes e aquecimento induzidos por metaestabilidade ao sincronizar uma entrada externa aleatória. Infelizmente, há muito pouco que você pode fazer para corrigir isso e problemas de metaestabilidade além de remover circuitos de entrada assíncronos.
Um problema com projetos assíncronos é a presença de raça ou perigos. Por exemplo, neste circuito, digamos que A = 1, B = 0 e C = 1 inicialmente e, portanto, D seja estável e resolvido em 1.
Agora deixe B alterado para 1 e C alterado para 0 no mesmo momento . É óbvio que D permanecerá em 1. Mas em circuitos reais, atrasos de propagação e atrasos de fio são importantes. Portanto, é muito possível que a mudança em C atinja a porta OR mais rapidamente do que a mudança em B se propague para a porta OR, através da porta AND. O resultado é que D é puxado para 0 momentaneamente, antes de voltar ao seu estado estável 1. Isso é chamado de raça ou risco. Essa falha momentânea pode acionar qualquer circuito presente após D, e essa transição indesejada é propagada por todo o circuito. Isso causa dissipação de energia indesejada e possivelmente erro na funcionalidade.
Para evitar esses problemas, podemos registrar as entradas e saídas adicionando um D-flip-flops antes de todas as entradas A, B, C e após a saída D. Para que agora nosso circuito prenda apenas entradas estáveis nas bordas do relógio, calcula a expressão, trava D e a produz somente na próxima borda do relógio. Isso garante que nenhuma falha nas entradas ou saídas seja propagada em nosso circuito, desde que todas as entradas dos flip-flops atendam ao tempo de configuração e de espera.
Essa é a principal razão pela qual os projetos síncronos são mais preferidos, apesar da velocidade que os projetos assíncronos fornecem.
fonte