Atualmente, estou trabalhando no Super OSD - um projeto de exibição na tela. http://code.google.com/p/super-osd possui todos os detalhes.
No momento, estou usando um dsPIC MCU para fazer o trabalho. Este é um DSP muito poderoso (40 MIPS a 80 MHz, operações de ciclo único de três registros e uma unidade MAC) e, mais importante, ele vem em um pacote DIP (porque estou usando uma placa de ensaio para prototipá-lo.) estou realmente obtendo todo o desempenho da execução do OSD - o chip tem cerca de 200ns ou 10 ciclos por pixel no estágio de saída, portanto o código precisa ser muito otimizado nesta parte (por esse motivo, ele sempre será escrito em montagem.)
Agora eu estava pensando em usar um FPGA para isso porque, devido à arquitetura paralela de um chip, é possível ter um programa lógico simples executando o OSD. Coisas como desenhar linhas e código algorítmico seriam tratadas por um MCU, mas a saída real seria feita com um FPGA. E algumas coisas simples, como definir pixels ou desenhar linhas horizontais e verticais que eu gostaria de integrar ao FPGA, para melhorar a velocidade.
Eu tenho algumas questões:
- Custará significativamente mais? Os FPGA mais baratos que encontrei foram ~ 5 libras cada e o dsPIC é 3 libras cada. Então, vai custar mais, mas por quanto?
- O dsPIC se encaixa em um pacote SO28. Eu não gostaria de ir além do SO28 ou TQFP44. A maioria dos FPGAs que vi vêm em pacotes BGA ou TQFP> 100, que não são uma opção no momento, devido ao tamanho do cisalhamento e à dificuldade de soldá-los.
- Quanta corrente é usada por um FPGA? Atualmente, a solução dsPIC consome cerca de 55mA +/- 10mA, o que está bom no momento. Um FPGA consumiria mais ou menos? É variável ou é praticamente estática, como o dsPIC?
- Preciso de pelo menos 12 KB de memória gráfica para armazenar os gráficos OSD. Os FPGAs têm esse tipo de memória disponível no chip ou está disponível apenas com chips externos?
fonte
Minha inclinação seria usar algo para amortecer o tempo entre o processador e a tela. Ter um hardware que possa mostrar um quadro inteiro de vídeo sem a intervenção do processador pode ser bom, mas talvez exagere. Eu sugeriria que o melhor compromisso entre a complexidade do hardware e do software seria provavelmente fazer algo com dois ou três registros de deslocamento de 1024 bits independentes (dois bits por pixel, para permitir preto, branco, cinza ou transparente) e um meio de alternar entre eles. Faça com que o PIC carregue um registro de turno e, em seguida, o hardware comece a mudar esse registro enquanto define um sinalizador para que o PIC possa carregar o próximo. Com dois registros de turno, o PIC teria 64us entre o horário em que um registro de turno está disponível e o tempo em que todos os dados precisam ser trocados. Com três registros de turno,
Observe que, embora um FIFO de 1024 bits seja tão bom quanto dois registradores de turnos de 1024 bits, e em um CPLD, um FIFO custa apenas uma macrocélula por bit, além de alguma lógica de controle, na maioria dos outros tipos de lógica, dois bits do registrador de turnos será mais barato que um pouco de FIFO.
Uma abordagem alternativa seria conectar um CPLD a uma SRAM e criar um subsistema de vídeo simples com isso. Esteticamente, eu gosto da geração de vídeos on-the-fly, e se alguém fez bons chips de 1024 bits com registro de deslocamento barato, é a abordagem que eu preferiria, mas usar uma SRAM externa pode ser mais barato do que usar um FPGA com recursos suficientes para faça vários registros de deslocamento de 1024 bits. Para sua resolução de saída, será necessário fazer o clock dos dados em 12M pixels / s, ou 3 MBytes / s. Deve ser possível organizar coisas para permitir que os dados sejam sincronizados a uma taxa de até 10mbps sem muita dificuldade, intercalando os ciclos de memória; o maior truque seria impedir a corrupção de dados se um pulso de sincronização não surgisse no momento exato esperado.
fonte