sábado, 7 de junho de 2014

Gerador de Wait State

Terminei de desenvolver o gerador de 'wait state', que nada mais é do que um flip-flop.

Quando o Z80 do TK90 acessa o teclado ele leva a nível zero as linhas A0, /IORQ e /RD. Como se trata de uma operação de I/O e não de um atendimento a interrupção, o sinal M1 permanece em nível alto.

Para reduzir a quantidade de chips utilizados, e ao mesmo tempo evitar o uso de componentes difíceis de serem encontrados eu procuro utilizar sempre os CIs TTL mais 'feijão com arroz', no caso a decodificação ficou por conta de um 74138 e o flip flop  escolhido foi o 7474

O 74138 usa os sinais A0, /IORQ e /RD e M1 para ativar a saída /Q0 que chamei de /ULARD. Quando o Z80 faz a leitura do teclado, esse sinal cai a nível zero.

Nos primeiros testes o sinal /ULARD foi utilizado na entrada CLEAR do flip flop, porém isso não funcionou, pois enquanto o sinal /WAIT permanece em nível zero, o Z80 mantém o último estado das linhas /RD, /IORQ, M1 e A0. O problema é que enquanto a entrada CLEAR do flip flop está em nível zero, é impossível mudar o seu estado de saída, seja pelo acionamento da entrada PRESET seja pela transferência de um dado pelo sinal de CLOCK.

A situação ideal seria utilizar a entrada de CLOCK para acionar o sinal de WAIT, porém essa entrada é sensível à borda de subida.

Usar outro decodificador que gere um nível 1 quando a entrada correspondente está ativada estava fora que questão uma vez que eu nunca vi um 74137 em minha vida e nem sei se existe isso pra vender hoje em dia. Também descartei a possibilidade de usar um inversor, pois isso significaria colocar um CI a mais no projeto.

Depois de pensar um pouco, consegui aproveitar o flip flop que estava ocioso num circuito de acionamento sequencial.


Quando o sinal /ULARD é decodificado ele ativa o CLEAR do flip flop da esquerda fazendo a saída Q (pino 5) ir a nível zero e a saída /Q (pino 6) ir a nível alto.

A mudança de estado do pino 6 faz com que o flip flop da direita transfira o nível alto presente na entrada D (pino 12) para a saída Q (pino 9). Simultaneamente a saída /Q (pino 8) vai a nível zero, ativando o sinal de /Wait, que permanece nesse estado enquanto o microcontrolador está processando a interrupção que foi gerada na borda de descida do sinal /ULARD.

Quando o microcontrolador termina de processar a interrupção ele traz abaixo a linha RELEASE que ativa o CLEAR do flip flop da direita e faz com que o pino 8 volte a nível alto, liberando o sinal de WAIT

O Z80 termina de executar a instrução IN (ciclo T3) e com isso o sinal /ULARD volta a nível alto. Como a linha de CLEAR e a de CLOCK estão interligadas, quando essa mudança de estado provoca a transferência do nível alto na entrada D (pino 2) para a saída Q (pino 5) e do nível baixo para a saída /Q (pino 6). Com isso o circuito volta a seu estado de repouso

O circuito foi testado num proto-board e funcionou como desejado.

Agora eu já consigo fazer um emulador de teclado para o TK usando qualquer família de microcontroladores.




Nenhum comentário: