quarta-feira, 27 de setembro de 2006

Leitor de MMC/SD rápido: Gerador de Clock

O diagrama de blocos do gerador de Clock encontra-se abaixo. Esta parte do consiste num contador cuja entrada é o próprio Clock do Z80, que vai também para a sáida via uma porta AND. Quando a contagem atinge o valor 8, a saída é desabilitada.

Este bloco possui também uma entrada para "Resetar" o contador, ativada pelo sinal de acesso ao endereço base. Desta forma, a cada execução da instrução "IN" do Z80, o contador é zerado e um novo ciclo de transferência é realizado.


clique na imagem para ampliar

Embora simples, o gerador de Clock é a alma deste projeto, pois possibilita o ativamenteo dos registradores de deslocamento, e a transferência automática dos bits na velocidade do clock do Z80, eliminando a necessidade de se gerar por software os pulsos de clock e os deslocamentos (SHIFT) dos bits do byte a ser transmitido.


O Circuito final pode ser visto na figura abaixo:

clique na imagem para ampliar


O gerador de clock possui ainda uma entrada para Clock externo, comandada diretamente por um acesso a uma porta do Z80. Esta entrada foi acrescentada para poder gerar um sinal de, no máximo, 400KHz, necessário para a partida do cartão MMC/SD.

A fim de se economizar componentes, não tanto pelo preço sem si, mas pelo espaço ocupado pela placa, o inversor foi imlementado utilizando-se um transistor. O capacitor de 50pf em paralelo com o resistor de base, e o relativamente pequeno valor do resistor de coletor servem para acelerar as transições, que na simulação foram de aproximadamente uns 5ns.

Pelo mesmo motivo, o contador "ocioso" do 74LS393 foi transformado num flip-flop improvisado, de forma a resetar o contador quando o sinal de decodificação for desativado, ou seja, após o término da instrução "IN".

A forma de onda do sinal simulado para um clock de 8MHz pode ser vista na figura abaixo.


clique na imagem para ampliar

terça-feira, 19 de setembro de 2006

Leitor de MMC/SD rápido: Decodificador de I/O

O padrão MSX estipula que os endereços de I/O acima de 03FH são reservados (ref [1]), portanto, o nosso decodificador tem que ser capaz de decodificar endereços abaixo desse valor.

Outro fator de escolha do endereço a ser utilizado, é que muitos periféricos "consagrados" utilizam portas dentro dessa área (ref [2]). Portanto, foi escolhida uma área livre, cuja base começa em 0Ch (12) e ocupa 4 endereços, terminando portanto, em 0Fh (15).

Para decodificar um endereço de I/O do MSX, deve-se levar em conta as linhas de endreço [A0..A7] (tradicionalmente), o sinail IORQ (requisição de I/O) e também o sinal M1 (ciclo de máquina). Este último costuma ser esquecido, mas é importante para não conflitar com o processo de reconhecimento de interrupções do Z80.

A figura abaixo, retirada do Manual do Z80 (ref [3]), mostra que após o Z80 reconhecer uma interrupçãom, ele gera um ciclo M1 especial, e durante esse ciclo o sinal IORQ toma o lugar do MREQ, de forma que o periférico possa colocar seu vetor de interrupção no barramento de dados. Por isso, nossa decodificação de endereços tem que levar em conta o sinal M1 inativo (nível 1).


clique na imagem para ampliar

Mais detalhes sobre o mecanismo de interrupção são encontrados no parágrafo "Interrupt Request/Acknowledge Cycle" do manual do Z80 (ref [3]).

Além da decodificação de endereço, é necessário levar ainda em conta a operação a natureza da operação de I/O, ou se estamos fazendo uma leitura (sinal RD) ou escrita (sinal WR).

Dados os requisitos acima, temos definidos os seguintes níveis para os sinais do Z80:

clique na imagem para ampliar

Onde A0 e A1 definem o endereço de acesso:


clique na imagem para ampliar


Assim, chegamos ao seguinte diagrama:

clique na imagem para ampliar

Leitor de MMC/SD rápido: Diagrama de Blocos

Eis o diagrama de blocos do leitor de MMC/SDC:


Clique na imagem para ampliar

Os blocos principais são o decodificador de I/O, o gerador de clock e os registradores de deslocamento.

Este diagrama não possui o relógio de tempo real, por se tratar de uma função totalmente independente da leitura do cartão.

Leitor de MMC/SD rápido: PROJETO

Para projetar as várias partes do circuito de forma que estas partes, juntas, atendam aos requisitos, será necessário conhecer pelo menos os seguintes assuntos:
  • Temporização das instruções do Z80 para acesso I/O
  • Padrão MSX para acesso I/O
  • Protocolo SPI
  • Utilização de cartões MMC/SD pelo modo SPI

Leitor de MMC/SD rápido: Projeto, Implementação e Teste

Para cada requisito, o seguinte conceito vai ser utilizado:

Diagrama de blocos > Detalhamento > Simulação > Teste.

Para muitos dos requisitos, pode até não haver uma fronteira clara entre essas etapas. Alguns requisitos, como o software de apoio ao projeto e construção, vão inclusive ser construídos como teste na implementação de outros requisitos, mas o importante é, ao final, cumprir todos os requisitos.

quinta-feira, 14 de setembro de 2006

Leitor de MMC/SD rápido: Requisitos

Esta é a lista dos REQUISITOS do leitor de MMC/SD. A lista está congelada.

Requisitos de Hardware:
  • Deverá utilizar o espaço de endereçamento de I/O do Z80, dentro do padrão MSX (abaixo de 040h);
  • Deverá utilizar o clock do Z80 como fonte de clock;
  • Deverá suportar um clock (do Z80) de até 7,16MHz;
  • Deverá ser capaz de gerar um clock numa frequência inferior a 400KHz, para inicialização do cartão;
  • Deverá realizar a transferência de dados de forma bidirecional, conforme padrão SPI (transmite e recebe ao mesmo tempo);
  • Deverá realizar uma transferência de blocos através de instruções de I/O de bloco (INI, INIR, OUT, OTIR), tão rápido quanto possível para o Z80;
  • Deverá realizar transferência de bytes num tempo igual ao do MSX para fazer acessos consecutivos de I/O;
  • Deverá ser possível implementar a interface sem a necessidade de chips de lógica programável, utilizando apenas componentes comuns no mercado: chips TTL, resistores e capacitores de famílias padrão;
  • Deverá haver um LED indicador de acesso ao cartão.
  • Deverá haver um LED indicador de que a alimentação do cartão está ativa.
  • Deverá suportar Inserção/Remoção/troca do cartão sem necessidade de se desligar o computador.
  • Deverá possuir um conversor para alimentar o cartão MMC/SD, fornecendo uma tensão entre 2,8V e 3,6V, com capacidade de pelo menos 100mA;
  • Deverá ser projetado de forma a consumir pouca energia.
  • Todos os diagramas e "lay-outs" devem ser disponibilizados;
  • A placa de circuito impresso da versão final deve ser projetada de forma a permitir a montagem caseira (refs [1] [2] [3]);
  • Deverá possuir suporte para um relógio de tempo Real I2C;
  • Deverá possuir circuitos de teste auxiliares, montados em placa externa, para auxiliar no teste dos vários blocos que compõem o circuito, de forma a suportar a construção e teste gradual da interface;
  • Deverá possuir um guia de montagem que suporte a construção e o teste gradual da interface;

Requisitos de Software:

  • Todo o código fonte será disponibilizado sob licença GPL;
  • Deverá haver um software de testes que suporte o teste dos vários blocos que compõem o circuito, de forma a suportar a construção e teste gradual da interface;
  • Deverão ser implementadas as rotinas de baixo nível destinadas à inicialização e identificação do cartão, bem como à leitura, escrita e apagamento de blocos de memória;
  • O software deverá suportar cartões MMC e SDC;
  • Deverão ser implementadas as rotinas de baixo nível para acesso ao relógio de tempo real;

Legenda:
  • Não implementado
  • Implementado
  • Implementado e testado
  • Deletado

Leitor de MMC/SD rápido: Concepção

O OBJETIVO deste projeto é criar o um leitor de MMC/SD para o MSX que seja muito mais rapido que os atuais, cujo limite é a velocidade do endereçamento do Z80.

O ESCOPO do trabalho compreende o "Hardware" necessário para tal tarefa, juntamente com o "software" de baixo nível, ou seja, as rotinas de inicialização, identificação, leitura, apagamento e escrita de cartões de memória MMC/SD.

Leitor de MMC/SD rápido: Processo

Com a idéia do leitor em mente surgiram muitas idéias, mas pra não perder o foco, resolvi estabelecer um processo. Pode parecer chatice ou preciosismo, mas toda tarefa complexa é melhor resolvida usando um processo. E seguir o processo, qualquer que seja, é mais importante do que a abordagem utilizada para estabelecê-lo.

O processo estabelecido se baseia na seguinte linha:

CONCEITO > REQUISITO > PROJETO > IMPLEMENTÇÃO > TESTE > DOCUMENTAÇÃO

na qual as fases entre REQUISITO e TESTE são um ciclo: Caso nao se cumpra um requisito, o ciclo deve ser executado novamente. Se for necessário um complemento para vencer algum obstáculo, basta voltar à IMPLEMENTAÇÃO. Se for uma dificuldade maior, basta voltar ao PROJETO. Se for um fator impeditivo, basta voltar ao REQUISITO. Parece bobeira, mas aplicar o processo sistematicamente dá resultado. Como disse, não importa muito a sistemática. É importante apenas que HAJA uma sistematica. Isso evita, por exemplo que a gente fique mudando requisitos (sem motivo) no meio do caminho, sem ter terminado antes de implementar os atuais.

Uma figura vale mais do que mil palavras... (clique na imagem para ampliar)



Note que no final do processo está a documentação, que vai ser publicada aqui, ao longo do tempo.


quarta-feira, 13 de setembro de 2006

Leitor de MMC/SD rápido

Pesquisando na internet, dá pra achar alguns projetos de leitor de MMC para o MSX (refs [1][2]), mas todos eles têm uma taxa de transferência relativamente baixa, pois todos eles trabalham com serialização por software.

Daí surgiu a idéia de fazer um leitor diferente, que utilizasse hardware para suportar o protocolo SPI, permitindo assim trabalhar com o clock do Z80, de forma a suportar uma leitura de bloco a partir de uma simples instrução INIR.

A base desse projeto é o próprio protocolo SPI (refs [3], [4], [5]), utilizado para a comunicação com o cartão de memória MMC/SD (ref [6]). Esse protocolo permite implementar a comunicação entre dois dispositivos utlizando simples registradores de deslocamento. O "pulo do gato" consiste em manipular o 'clock' do Z80 de forma a sincronizar os acessos a um endereço de I/O com um número predeterminado de ciclos de 'clock' (no caso, 8).