# Controlador de Richards

O controlador de Richards é um método de implementação de uma máquina de estados finitos usando circuitos integrados simples e lógica combinacional. O método recebeu o nome de seu inventor, Charles L. Richards. Permite uma concepção mais fácil de máquinas de estados finitos complexas do que as técnicas tradicionais de diagramas de transição de estados, quadros de transição de estados e álgebra booleana. Usando a técnica de Richards, torna-se mais fácil implementar máquinas de estados finitos com centenas ou mesmo milhares de estados.

## História

O controlador de Richards foi desenvolvido devido à necessidade de um método mais fácil de projetar máquinas de estados finitos do que o método tradicional de diagramas de estados, tabelas de transição de estados e minimização. Naquele tempo, muitos dos softwares para minimização de circuitos que temos hoje não existiam. Assim, a minimização lógica limitou-se, na sua maior parte, à utilização de Mapas de Karnaugh e Lei de DeMorgan. Por isso Charles L. Richards inventou um método de implementação de uma máquina de estados finitos que não precisava explicitamente de uma tabela de transição de estados. Charles publicou as suas conclusões na edição de fevereiro de 1973 da Electronics. Sua implementação generalizada tornou-se popular e na década de 1980 era já considerada um método clássico. Embora seja improvável que os produtos comerciais encontrados hoje contenham um controlador de Richards clássico (uma vez que existem designs mais rápidos hoje em dia), há uma boa chance de que um controlador de Richards modificado ou um design derivado do controlador de Richards esteja sendo utilizado.$^[$

## Aplicações

Devido à capacidade do controlador de Richards de usar muitos estados facilmente, ele pode ser usado em muitas aplicações práticas.$^[$

## O fluxograma de Richards

O controlador de Richards é uma máquina de Mealy, pois sua saída depende tanto do estado atual quanto da entrada. No entanto, Richards projetou seu próprio método de representação de estados usando um fluxograma, ao invés de um diagrama de estado.
Cada estado é representado como uma condição de transferência no fluxograma. Cada condição tem dois caminhos de controle saindo dela, um SIM ou um NÃO. A condição é SIM ou NÃO (VERDADEIRO ou FALSO) com base em um único bit inserido na máquina.
Dependendo de qual é a entrada para uma condição, uma das duas funções de transferência associadas a essa condição será executada. A máquina considera a execução de uma função como definir a saída de um único pino no dispositivo, e isso pode ser usado para formar-se uma lógica combinacional.
Cada função de transferência definirá implícita ou explicitamente um novo estado para o qual a máquina mudará para. Então, após a execução de uma função de transferência, a máquina entrará em um novo estado.
Uma definição implícita de estado pode ser considerada o padrão, pois ocorrerá sem nenhum circuito adicional do designer. Se a condição for SIM, o controlador fará a transição para o próximo estado numericamente.
Por exemplo, se você estiver no estado 0 e ocorrer um SIM, você fará a transição para o estado 1. Se a condição for NÃO, a máquina permanecerá em seu estado atual. Usando deste comportamento é possível criar uma máquina com um fluxograma sequencial simples. É claro que uma máquina sequencial geralmente não é muito útil, mas felizmente existe uma maneira de fazer a transição para estados fora de ordem: Usando um salto (jump). Implementar um salto requer hardware adicional para selecionar o estado de destino. O hardware exato depende da função que está sendo executada.

## Kernel do controlador

O núcleo central do controlador de Richards pode ser resumido em quatro partes: Um contador, um multiplexador e dois decodificadores. Um controlador simples pode ser construído usando a clássica série 7400 de circuitos integrados TTL. O contador utilizado é o 74163, o multiplexador é o 74151 e os dois decodificadores são do tipo 7442.
A saída do contador seleciona qual bit da entrada do multiplexador deve ser enviado para a saída Y, (cujo inverso é enviado para a saída WN.) Se Y está no estado "alto", o contador incrementa, caso contrário, não. Da mesma forma, Y deve ser "alto" para permitir saídas "SIM", uma vez que a entrada D no decodificador está ligada à WN, enquanto Y deve ser "baixo" para permitir as saídas "NÃO", uma vez que a entrada D nesse decodificador está definida como Y. Para executar um jump, deve-se definir o bit LDN do contador e as entradas A, B, C e D. LDN diz ao contador para carregar o valor nas entradas A, B, C e D. Com o uso de uma lógica combinacional qualquer pode-se então carregar um valor no contador para certas funções (mas não outras), bem como especificar o endereço de estado a ser carregado, dada a função ativa. Fazer isso é uma simples questão de fazer uma tabela de funções e estados para os quais elas devem fazer a transição e, em seguida, encontrar a expressão de álgebra booleana para cada bit que compõe o endereço do estado de destino.