Postagens mais visitadas
-
Eu tenho uma mania (que muito provavelmente herdei do meu pai) de não gostar de jogar as coisas fora, sempre tento enxergar alguma possí...
Construindo uma interface I/O para o Mega Drive - Parte 2 Decodificador de Endereços
No primeiro post dessa série a gente viu o básico sobre como o Barramento funciona e estabelecemos alguns conceitos do que é necessário para se comunicar com ele.
Nesse post então vamos dar continuidade ao tema, porem vamos entrar mais na parte teórica e técnica.
Como vimos no post passado, precisamos de um decodificador de endereços, um Gate Array para os sinais de controle e um registrador para segurar os dados. Com isso vamos conseguir construir nossa interface I/O Digital.
Começando pelo decodificador de endereços, podemos imaginar ele como uma caixa preta, onde temos na Entrada os sinais do barramento de endereços e na saída um sinal de "Chip Enable" para o registrador que vai servir de latch para a nossa interface.
O Gate Array vai "unir" esse sinal aos sinais que vem do Control Bus, para saber se queremos Ler ou Escrever no Registrador, se queremos Ler temos que ativar a saída de dados do Registrador, para que ele envie o sinais para o barramento de dados, e se queremos gravar temos que ativar a Escrita no Registrador, para que ele registre os Sinais do barramento de Dados.
Um decodificador de endereços simples pode ser descrito como apenas um conjunto de portas AND.
Imaginem que queremos um sinal 1 toda vez que o processador acessar aquele endereço, basta pegar e inserir todas as linhas do Barramento de endereços numa porta AND, sendo que as linhas que contem Zeros, devem passar por portas NOT.
Por exemplo, imaginem um Barramento de 8 Bits, se queremos decodificar o Endereço 0X4D podemos apenas pegar esse valor e converter para binário... Assim obteremos esse numero 01001101(b), então basta pegar as linhas que estão com zero, inverter e injetar na entrada da Porta AND.
Dessa maneira o Sinal CE sera 1 Sempre que acessarmos o Endereço 0X4D e para qualquer outro valor ele sera zero!
Obviamente essa solução é meramente didática, para um Barramento como o do Mega Drive que tem 23 Linhas de endereços e mais duas linhas de Data Strobe a quantidade de portas lógicas seria absurdamente alta o que inviabilizaria qualquer projeto.
Existem varias formas de reduzir o numero de portas necessárias no Decodificador de endereços, é possível otimizar expressões usando Álgebra Booleana (dependendo do endereço), também podemos mapear uma faixa de endereços, ao invés de uma posição de memoria especifica, essa solução é bem comum porem só é viável quando temos "espaço Sobrando" no Barramento..
Por exemplo, podemos omitir o Bit A7, assim precisaríamos decodificar menos linhas de endereço, porem o nosso sinal de Chip Enable seria 1 para os endereços 0x4D e 0xCD, na pratica estamos "espelhando" a memoria, o que significa que poderíamos acessar nosso registrador de qualquer um desses 2 endereços, isso não necessariamente é ruim, tudo depende do seu objetivo no projeto.
Por exemplo, a Sega espelhou o endereço do registrador de Data Port do VDP¹ do Mega Drive, para os Endereço 0XC00000 e 0XC00002, o VDP é de 16 Bits, assim como o Barramento do Mega Drive, porem como ele esta espelhado para outro endereço com 2 bytes de "distancia" ele permite a escrita de dados de 32 Bits!
Isso por que quando movemos um dado de 32 bits (lembrando que o Barramento é de 16bits) o MC68000 move 16 bits para o barramento, automaticamente incrementa o Endereço em 2 bytes e move os outros 16 bits restantes, ao fazer o incremento do endereço o novo endereço coincide exatamente com endereço espelhado do registrador de Controle, permitindo a ele receber os 32 Bits de dados sequencialmente.
Esse é um dos motivos de eu ser apaixonado pela Arquitetura Hibrida de 32 bits do Mega Drive!
Enfim.... Falando de Mega Drive, a SEGA já previu que alguém poderia precisar de uma interface para projetar algum periféricos para o Mega Drive (exatamente o que estamos fazendo aqui) e sabendo que para isso seria necessário um Decodificador de Endereços, ela já fez a maior parte do trabalho pra gente!
No Slot de cartuchos do Mega Drive temos o pino B31, ele é um pino de sinal chamado de /TIME, esse pino é acionado sempre que acessamos uma determinada faixa de memoria.
Isso significa que já temos um decodificador de Endereços embutido no próprio Mega Drive (Obrigado Sega <3) e por tanto não vamos precisar de dezenas de portas logicas para construir o nosso próprio!
Basicamente esse pino mapeia a posição de memoria de 0xA13000 até 0XA130FF, que significa que temos 256 posições de memoria mapeadas, se a nossa interface vai ter um "Data Wide" de 16 Bits, não precisamos de decodificador de endereços nenhum, podemos apenas usar os sinais provenientes do próprio Mega Drive e o nosso registrador sera "espelhado" em toda essa faixa de memoria!
Se precisarmos de mais do que 16 bits teremos que dar uma "incrementada" nesse Decodificador de Endereços, mas temos a vantagem de que a faixa de endereço mapeada é de 256 bytes, isso significa que temos apenas 8 Linhas de endereço para decodificar, o que facilita bastante a vida!
Talvez vocês estejam se perguntando: "Tá, mas pra que fazer uma interface I/O no Mega Drive?"
Bom... Uma interface I/O Digital é a maneira mais genérica de se comunicar com periféricos! Isso significa que ter uma interface dessas implementada e funcionando é o primeiro passo para integrar o Mega Drive com qualquer outro dispositivo!
Por exemplo: um Chip de Audio Customizado Stereo com 44Khz de Sample Rate e 4GB de armazenamento embutido dentro do próprio cartucho ou quem sabe uma interface ATA/LBA pra Controlar um HD! Tudo isso é possível...
Bom, por hoje é só! No próximo Post vamos ver como desenhar o Gate Array para gerenciar os sinais de Escrita, Leitura e Chip Enable e vamos usar os flip-flops para montar nosso registrador também!
Espero que tenham gostado e qualquer duvida, critica ou sugestão usem o campo dos comentários.
VDP¹: Sigla para Video Display Processor, é o nome dos dado a uma categoria de Circuitos integrados (Chips) usados na geração de sinal de video para computadores ou video games antigamente.
Assinar:
Postar comentários (Atom)
nunca tinha visto o mega por esse lado, aprendendo isso da pra ir a fundo e criar novos perifericos, ex: poderiamos criar uma interface lan para conectar o mega via ethernet. excelente artigo!
ResponderExcluir