Eu vi este vídeo no outro dia e ele me fez pensar sobre como ir sobre e projetar algo como a GPU. Por onde você começaria? Estou mais interessado apenas em ler sobre como eles funcionam e em não criar um TTL (ainda assim).
Eu sei que isso soa como uma pergunta 'como você faz uma linguagem de programação', mas qualquer ponto de partida seria bom, pois eu não tenho ideia de por onde começar a procurar.
Respostas:
É como ir ao seu exame final de colagem para a aula de ciências e ter isso como sua pergunta: descreva o universo. Seja breve, porém conciso. Não há como responder a essa questão de maneira prática - por isso vou responder uma pergunta diferente.
Quais são os tipos de coisas que eu preciso saber antes de tentar criar uma GPU?
Em uma ordem cronológica aproximada, eles são:
Também ouso dizer que você não fará esse tipo de coisa com chips lógicos TTL. Duvido que você possa obter uma interface de memória DDR2 / 3 razoável trabalhando com chips TTL normais. Usar um grande FPGA seria muito mais fácil (mas não fácil).
Subir para o passo 6 provavelmente será "bom o suficiente para saciar sua sede intelectual". Isso também poderia ser feito dentro de um período de tempo razoável - cerca de um ano - para ser definido como uma meta de curto prazo.
EDIT: Se tudo que você quer fazer é cuspir um sinal de vídeo, é relativamente fácil. É, em essência, um pedaço de memória que é transferido para uma exibição em 60-ish Hz. O diabo está nos detalhes, mas aqui está um esboço de como fazer isso:
Comece com alguma RAM de porta dupla. Ele não precisa ser verdadeiro ram de porta dupla, apenas alguns RAM que uma CPU possa ler / gravar e que seu circuito de vídeo possa ler. O tamanho e a velocidade dessa RAM dependerão do tipo de exibição que você estiver dirigindo. Pessoalmente, eu usaria o SDRAM DDR2 conectado à interface de memória de um FPGA Xilinx Spartan-6. Seu núcleo (MIG) "memory interface generator" facilita a transformação disso em uma RAM de porta dupla.
A seguir, projete um circuito que controle como a RAM é lida e cuspa esses dados em um barramento simples. Normalmente você acabou de ler a RAM sequencialmente. O "ônibus simples" é exatamente isso. São alguns bits com o valor de pixel - e é isso. Esse circuito precisará fazer mais duas coisas: terá que voltar ao início da RAM a cada quadro de vídeo e terá que "pausar" a saída durante os períodos de retração horizontal / vertical.
Terceiro: faça um circuito que emita os sinais de controle de vídeo (HSync, Vsync, etc.) e informe ao circuito anterior quando parar e reiniciar. Esses circuitos são realmente fáceis de fazer. Encontrar o padrão de vídeo apropriado é mais difícil, imho.
E finalmente: conecte os sinais de controle e o barramento de dados de pixel de vídeo a "alguma coisa". Pode ser um pequeno LCD colorido. Pode ser para um DAC de vídeo para emitir um sinal compatível com VGA. Existem codificadores NTSC / PAL que aceitariam esses sinais. Etc.
Se a resolução for realmente pequena, você poderá usar a RAM interna do FPGA em vez de uma SDRAM DDR2 externa. Devo avisar que, se o DDR2 SDRAM for usado, você provavelmente precisará de um FIFO e outras coisas - mas isso também não é terrivelmente difícil. Mas com DDR2 SDRAM você pode suportar monitores de alta resolução. Você também pode encontrar placas de desenvolvimento FPGA com VGA DACs integrados e outras formas de saídas de vídeo.
fonte
Racing the Beam é uma visão detalhada do design e operação do Atari VCS. Ele tem um tratamento completo do adaptador de interface de televisão.
A TIA é sobre a GPU mais simples e prática.
Compreender um sistema de trabalho pequeno, mas completo, pode ser uma boa maneira de aprender um novo assunto.
Esquemas completos estão disponíveis, assim como um manual técnico .
fonte
Se você quiser apenas colocar algumas coisas na tela e pensar que pode realmente gostar de fiação, pode procurar um sistema gráfico de personagens do início dos anos 80. Se você conseguir acertar o tempo para o RS-170A, poderá até pressionar o sinal em uma entrada AV sobressalente em uma televisão de plasma de 50 "e voltar ao estilo retrô.
Alguns sistemas antigos usavam suas CPUs de 8 bits para gerar diretamente a tela, como o 6507 no Atari 2600 e o Z-80 no Timex Sinclair ZX-81. Você pode até fazer o mesmo tipo de coisa com microcontroladores modernos. A vantagem dessa maneira é que o hardware é simples, mas o software geralmente precisa estar em assembler, e é muito exato, e os resultados serão realmente impressionantes. Indiscutivelmente, os 2600 empregavam hardware extra, mas o TIA não tinha muito FIFO, e o 6502 (bem, 6507, na verdade) precisou despejar bytes em tempo real. Nesta abordagem, não há modo de vídeo padrão; todo aplicativo que usa vídeo deve ser intimamente combinado com as necessidades de manter os pixels fluindo.
Se você realmente deseja criar algo a partir do TTL, o próximo nível de complexidade seria a exibição de texto com base na ROM de caracteres. Isso permite que você coloque 256 caracteres em, por exemplo, 40 colunas e 25 posições de linha. Existem algumas maneiras de fazer isso.
Uma maneira - faça o que o modelo TRS80 que fiz. Um grupo de 74161 contadores com uma variedade de portas gerou o endereço de vídeo; três 74157s multiplexaram 12 bits do endereço da CPU com o endereço de vídeo, para alimentar um endereço com uma RAM estática de 2K. Os dados da RAM foram armazenados em buffer de volta para a CPU, mas alimentados sem buffer como endereço para a ROM do conjunto de caracteres. Não houve arbitragem de ônibus; se a CPU quisesse RAM de vídeo, o sistema de vídeo foi acionado, resultando no efeito 'neve'. O endereço de vídeo com mux foi combinado com algumas linhas da seção do contador para arredondar os endereços baixos; A saída de ROM de caracteres foi despejada em um registro de deslocamento 74166. A coisa toda saiu das divisões de um cristal de 14.31818MHz. Nessa abordagem, você teria exatamente um modo de vídeo completamente implementado em hardware, como 40x25 ou 64x16 etc.,
Outra maneira - desenterrar um chip chamado CRTC como um 6845. Eles combinaram a maior parte da lógica de contador e cola e forneceram ao processador uma interface de controle-registro para que você pudesse reprogramar parte do tempo. Sistemas como esse podem se tornar um pouco mais flexíveis, por exemplo, você pode obter 40x25 e 80x25 do mesmo hardware, sob controle de registro. Se você ficar esperto sobre as frequências do relógio, poderá permitir que sua CPU tenha acesso gratuito à RAM de vídeo durante metade do relógio e ao gerador de endereço de vídeo durante a outra metade do relógio, evitando assim a necessidade de arbitragem de barramento. e eliminando o efeito de neve.
Se você quiser usar modos gráficos reais, rapidamente descobrirá que fazer o seu próprio é problemático. O Apple 2 original conseguiu, mas esse sistema tinha algo como 110 chips MSI TTL, e mesmo assim havia algumas coisas engraçadas para lidar, como mapeamento não linear do buffer de vídeo para a tela e paletas de cores extremamente limitadas , para citar dois. E Woz é geralmente reconhecido como tendo uma pista. Quando o '2e' apareceu, a Apple já estava colocando o sistema de vídeo em um chip personalizado. O C-64, na mesma época, devia seus recursos gráficos a chips personalizados.
Então .. eu diria lá sobre duas maneiras de fazer isso. Uma maneira - leve seu balde de TTL antigo e aspire a uma tela de texto de uma cor de 80x25; por outro lado - arranje uma boa placa de avaliação de FPGA, faça tudo em VHDL e comece com uma exibição de texto de 80x25.
fonte
Você precisaria começar com alguns fundamentos da arquitetura do computador e, paralelamente, começar com o design básico do ASIC usando VHDL ou outra linguagem de descrição.
Depois de aprender o básico da arquitetura de computadores, eu recomendaria se aventurar na computação gráfica, talvez começando com alguns projetos simples do OpenGL. A principal vantagem aqui seria ter uma idéia da arquitetura de renderização do pipeline gráfico .
O próximo passo seria pensar em como esse pipeline de renderização poderia ser realizado com hardware dedicado e não com software.
Em termos de realmente construir uma GPU e conectá-la ao seu computador, não acho que isso seja viável no orçamento de um entusiasta, mas talvez exista algo muito básico que você possa experimentar com uma plataforma ARM-linux incorporada (que expõe um barramento do sistema) e um FPGA (neste caso, o FPGA é o seu GPU gravado em VHDL) com saída para uma tela VGA de baixa resolução como um projeto de união. Isso exigiria a gravação de drivers também. Se você pode fazê-lo, seria assassino em um currículo.
fonte
Veja os diagramas de blocos de alto nível das GPUs da AMD e NVidia. Você provavelmente encontrará muitas informações do pessoal de opengraphics, que está projetando hardware gráfico de código aberto, com drivers de código aberto.
Então você precisa olhar para o que deseja.
Se você não fez nenhuma programação usando os recursos da GPU, também pode ser uma boa coisa a saber.
Acho que Leon também acertou em cheio. Eu usaria o Verilog se fizesse isso.
Se você está apenas querendo um vídeo compsite, como no vídeo que você postou. Existem muitos exemplos por aí. Heck, veja a implementação do Apple II por Woz. :)
fonte
Parece que você não está procurando fazer uma GPU (no sentido de 3d e sombrear tudo isso) tanto quanto um gerador de vídeo. Muitas placas de avaliação FPGA possuem um conector para um monitor VGA ou outro tipo e exemplos de projetos do fabricante ou de outros usuários para exibir itens nesse monitor. Existem também algumas placas com LCDs construídas, mas elas tendem a ser da classe de US $ 300 ou mais, enquanto as básicas que podem dirigir um monitor padrão custam US $ 60-120.
A maioria dos FGPAs não tem memória interna suficiente para fazer mais do que uma tela pequena, mas muitas das placas possuem memórias externas com mais capacidade. Muitos deles controlam monitores VGA analógicos digitalmente, ou seja, RG e B estão totalmente ativados ou desativados, embora alguns apresentem dois níveis e você provavelmente encontre um com um DAC de vídeo ou conector para uma interface de monitor digital.
fonte