domingo, 8 de junho de 2014

Protótipo para o emulador de teclado com AVR

Definidos os componentes básicos desenhei um circuito e comecei a montagem em proto-board para seguir com o desenvolvimento do emulador de teclado.

Montagem inicial em proto-board
Inicialmente conectei apenas a alimentação e os sinais A0, /RD, /IORQ, /WAIT e M1 a fim de testar o gerador de WAIT. Como as linhas de dados ainda não estavam conectadas, o AVR foi programado via SPI.

Protótipo ligado ao TK para monitorar as formas de onda
Com o protótipo montado registrei as formas de onda abaixo:

Em primeiro lugar seguem as formas de onda originais. A ULA do TK gera um sinal de seleção para o 74LS365 que lê o teclado (e o cassete). O atraso na decodificação em relação ao sinal /IORQ é de aproximadamente 40ns

Laranja: Pino 1 do 74LS365 / Azul: /IORQ

  O tempo total entre a decodificação do sinal de leitura e a borda de descida do sinal de clock ao final do tempo T3 é de 600ns.

Laranja: Pino 1 do 74LS365 / Azul: Clock do Z80

Durante o funcionamento normal o TK faz a leitura das 8 linhas do teclado. A linha azul na forma de onda abaixo já é a decodificação externa usando o 74HC138.

Laranja: Pino 1 do 74LS365 / Azul: /ULARD
O tempo gasto na decodificação do sinal /ULARD é de apenas 25ns, um pouco menos do que a ULA.

Laranja: /ULARD / Azul: /IORQ

O tempo que se ganhou na decodificação também pode ser visto na forma de onda abaixo, onde o tempo entre a descida do sinal /ULARD e a borda de descida do ciclo T3 aumentou de 600 para 630ns.
Laranja: Pino /ULARD / Azul: Clock do Z80
Aforma de onda abaixo mostra os tês sinais juntos
Laranja: /ULARD / Azul: /IORQ / Cinza: Clock Z80

O AVR foi programado para atender à interrupção gerada pelo sinal /ULARD e enviar um pulso negativo ao gerador de WAIT. O AVR estava rodando a 20MHz mas por se tratar de prova de conceito nenhuma otimização foi utilizada ainda.

ISR(INT0_vect)
{
release();   
}

A figura abaixo contém a superposição de vários sinais com a mesma referência a fim de resumir o funcionamento do circuito.

Se tomarmos como referência a forma de onda WAIT (OUT) é possível notar que o AVR está demorando por volta de 2,5us para atender a interrupção (5 divisões de 500ns). Como a velocidade de clock é de 20MHz, dá pra se notar que o AVR está executando 50 instruções (50 x 50ns = 2500ns), o que nem é tanto assim. O sinal de WAIT gerado é aplicado ao Z80 através de um diodo (só é possível forçar o nível zero na linha). Por isso a linha demora um pouco a subir. Mas note que quando ela sóbe só acontece mais um ciclo de clock, que é exatamente o ciclo T3. Logo em seguida o Z80 libera as linhas de endereço e de controle e com isso o sinal /ULARD retorna a nível alto e o Z80 já começa a buscar a próxima instrução.

Ciclo de funcionamento do circuito com o gerador de WAIT

A título de comparação eis as mesmas formas de onda, porém sem WAIT gerado pelo circuito.










Nenhum comentário: