por msamsoniuk » 01 Ago 2008 18:28
exceto pelo trampo extra de passar fios, nao vejo pq nao fazer 16 bits!
note que o 68EC000 no meu caso esta usando um latch para o bus de dados (8 bits), mas poderia ser perfeitamente 16 ou 32 bits (para um 68HC000 ou mesmo um 68020), com o HC908 gravando de 8 em 8 bits (2 ou 4 passos). como o 68000 faz acesso assincrono, no momento em que ele endereca algo na area da flash-virtual (mapeado por um 74F138), temos um chip-select indicando ao HC908 que o 68000 quer algo e entao o 68000 para, esperando DTACK. o HC908 pode tranquilamente puxar isso de outro lugar (flash SPI ou MMC) e gravar o byte na latch (que podem ser varias, para formar um bus de dados de 8, 16 ou 32 bits de dados). soh depois que o HC908 ativar DTACK eh que o 68000 completa o ciclo.
bom, nesse estagio tem alguns passos que requerem atencao: se o 68000 fizer dois acessos seguidos na flash-virtual, o primeiro DTACK pode ficar pendurado e gerar um falso DTACK para o segundo acesso. pior, se o latch ficar aberto no bus, pode ter acessos erroneos. para prevenir isso o 68000 controla o tri-state da latch de acordo com o chip-select dessa flash virtual gerada pelo 74F138.
o problema do falso DTACK pode ser prevenido por um flip-flop: o HC908 arma DTACK e o 68000 finaliza o ciclo corrente retirando AS e desarmando DTACK no flip-flop. como DTACK eh um sinal comum no bus, um 74F125 pode ser utilizado para deixar ele em tri-state junto com o bus de dados quando o chip-select da flash virtual nao esta ativo.
sobre a fpu 68882, creio que ela usa dynamic resizing, portanto seria perfeitamente possivel mudar a largura do bus, porem o 68HC000 nao implementa o protocolo de coprocessador on-chip e vc precisaria emular.
dependendo do caso, um 68020 poderia ser mais vantagem, pois vc poderia operar com bus de 8 a 32 bits de largura, tornando o layout simples, porem ele jah tem o protocolo de coprocessador on-chip e fica infinitamente mais eficiente (inclusive, o 68020 usa a 68881 ou 68882 indistintamente).
bom, a 68681 jah usei em uma versao on-chip no 68340 e eh bem pratica de usar, acho que vc nao vai ter problemas. o unico detalhe eh aquele referente ao uso comum do DTACK, principalmente quando se mistura devices que geram e outros que nao geram DTACK: em dispositivos q nao geram DTACK eh uma boa colocar um 74F125 para deixar o sinal em tri-state quando aquele periferico especifico nao estiver em uso no momento, para nao atrapalhar o funcionamento dos que geram DTACK, como a 68681 e 68882.
corrigindo um post anterior: o 74F74 possui reset, portando apos o reset dos processadores eh possivel fixar a montagem de modo que a cpu #0 roda as mesmas instrucoes antes da cpu #1. uma das primeiras instrucoes seria a TAS, para testar um flag e setar usando ciclo indivisivel, com isso a cpu #0 pode continuar executando o FW enquanto a cpu #1 fica presa em um loop infinito, aguardando a descarga do OS. quando o OS estiver disponivel, a cpu #0 remove o flag de bloqueio e ambas partem para a execucao paralela do OS, onde outro mecanismo similar ira escalonar processos diferentes para as diferentes cpus.
um outro lance interessante eh que eu nao leio o bus de enderecos no HC908, simplesmente jogo as instrucoes em sequencia. isso significa q eu imagino que o 68k esta em determinado ponto e jogo as instrucoes, mas por outro lado nao posso habilitar interrupcoes neste momento, pq eh dificil prever o que ele vai pedir para a area da flash. nesse caso o lance eh descarregar todo o FW p/ a sram e entao usar o truque de overlay, invertendo os mapas de memoria da flash e da sram, de modo que a tabela de vetores e todo o FW descarregado ficam em sram, onde os enderecos funcionam corretamente. o mapa da flash-virtual, nesse caso, dae fica restrita a funcoes basicas de IO (SPI e UART), com uns poucos enderecos de IO realmente mapeados.
uma outra ideia interessante q eu vi agora a pouco: quando o 68000 boota, ele puxa sucessivamente o SP e PC, entao comeca a ler instrucoes a partir do PC. a minha ideia era ir fornecendo instrucoes para o 68000 para ele mesmo gravar um FW na sram, mas vi uma ideia mais interessante: fornecer para ele o PC e SP zerados, de modo que apos isso ele comeca a rodar o PC em 0 e vai aumentando o PC de 2 em 2. se eu fornecer 128 mil NOPs para ele, isso equivale a ele fazer o PC incrementar de 0 a 262144.
a cada ciclo ele coloca o endereco no bus, deixa o bus de dados como leitura e aguarda DTACK. a jogada seria colocar o que se deseja escrever naquele endereco na sram e gerar um strobe de escrita na memoria, entao colocar um NOP no bus e responder DTACK. assim o 68000 cuida de incrementar os enderecos e o HC908 de escrever bytes na sram e gerar um NOP para ir ao proximo endereco, hehehe parece uma ideia relativamente bem eficiente!