Por onde começar quando se pensa em fazer uma GPU?

8

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.

reitor
fonte
3
Você está interessado em "alta velocidade gráficos 3D", ou "como dirigir um CRT / LCD"
Toby Jaffey
@Joby atm apenas exibindo algo em uma tela. Um quadrado de cor seria bom.
Dean
3
Alguém pode me explicar por que recebi um voto negativo? Para que eu possa resolver qualquer problema com a pergunta.
Dean
1
A dificuldade que vejo com essa pergunta é que existe muito terreno entre a geração de apenas uma exibição monocromática de 80x25 caracteres, o que poderia ter sido chamado de gerador de exibição de vídeo e o significado de 'GPU'. A dica de que você pode querer criar um 'fora do TTL' o coloca muito mais próximo do antigo objetivo do gerador de tela de 80x25.
JustJeff
@JustJeff, Ok, eu não sabia o que mais eles chamavam, por que eles são tão diferentes se fazem um trabalho semelhante?
Dean

Respostas:

16

É 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:

  1. Ou VHDL ou Verilog.
  2. FPGA's (área útil para brincar com a escrita de lógica digital).
  3. Coisas básicas do caminho de dados, como FIFO.
  4. Interfaces de barramento, como interface PCIe e DDR2 / 3
  5. Implementações binárias de funções matemáticas, incluindo ponto flutuante, etc.
  6. Design da CPU.
  7. Padrões de interface de vídeo.
  8. Material analógico de alta velocidade (o lado analógico do digital de alta velocidade)
  9. PLLs e outras coisas de relógio semi-avançado.
  10. Projeto de PCB de circuitos de alta velocidade.
  11. Projeto de conversor DC / DC de baixa tensão e alta corrente.
  12. Muitas e muitas coisas de software.
  13. E, finalmente, ASIC ou outro design do tipo de chip personalizado.

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
Uau não é uma tarefa curta então. Eu entendo que não houve resposta concisa. Mas você me deu um bom ponto de partida e terei que fazer isso no meu tempo livre muito limitado. Mas deve ser uma experiência interessante.
Dean
@ Dean Hmmm ... Há três coisas diferentes aqui: CPU, GPU e algo para cuspir um sinal de vídeo. É fácil fazer algo para cuspir um sinal de vídeo. Uma GPU é mais parecida com uma CPU projetada para processamento de vídeo / gráficos: gráficos 3-D, aceração de gráficos 2-D, etc. Se você quer algo para emitir um sinal de vídeo, está pronto. Se você quiser gráficos 3D ou até 2D semi-avançado, precisará percorrer minha lista.
1
Como é fácil emitir um sinal de vídeo? Eu acho que isso daria um primeiro passo melhor.
Dean
@ Dean Eu editei minha resposta para incluir informações sobre como cuspir um sinal de vídeo.
1
Eu escrevi um livro sobre computação gráfica uma vez (ISBN 0-471-13040-0), mas é muito introdutório. Nos anos 90, quando a ATI só tinha seus chips MACH64 e queria entrar em 3D, eles me contrataram como consultor para ensinar alguns dos conceitos, fazê-los funcionar e ajudar com a arquitetura. O resultado foram os primeiros chips RAGE. Eu era um cara gráfico naquela época. Confira a patente 5097427 dos EUA, se você não acredita em mim. No entanto, acho que a patente de interpolação quadrática (US 5109481) foi mais importante, mas menos chamativa. Você pode reconhecer alguns outros nomes daqueles ;-)
Olin Lathrop
8

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 .

Toby Jaffey
fonte
Regras do Atari 2600! A maioria dos sistemas de jogos usa hardware para gerar a tela, mas o 2600 faz tudo por mágica. Compare algo como Combat ou mesmo Asteroids a algo como Toyshop Trouble (Asteroids e Toyshop Trouble são ambos 8K). Combat mostra dois objetos de uma cor com resolução de 2 linhas; O Toyshop Trouble mostra 16 objetos com resolução de linha única e coloração por linha (e sem tremulação). Nenhum hardware extra para o Toyshop Trouble além de um comutador de banco para permitir 8k de código. Apenas algumas codificações inteligentes e um pouco de mágica.
Supercat 22/06
A programação 2600 da BTW pode ser obscura, mas um design de sobreposição de vídeo baseado em PSOC que fiz para um cliente parecia um pouco de 2600. Configure o hardware no chip para gerar algumas das temporizações e use o código para alimentar os dados com um escravo SPI para que ele possa atingir o tempo limite em pixels.
Supercat 22/06
inacreditável que todo o código do jogo teve que executar durante os tempos de retorno do feixe
JustJeff
5

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.

JustJeff
fonte
1

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.

Jon L
fonte
1

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.

  • Saída, HDMI, DVI ou VGA?
  • Transformações de vértice?
  • Texturização?
  • Sombreamento de pixel?
  • Recorte de triângulo e rasterização?
  • Alguma textura?
  • Operações de varredura?

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. :)

Joe
fonte
1
@Leon deixou um comentário? Se sim, não consigo vê-lo.
Dean
Eu deletei. Sugeri o uso de um FPGA para implementar uma CPU simples. Eu fiz isso alguns anos atrás, com um design de um livro, escrito em VHDL, que modifiquei para o meu hardware.
Leon Heller
Ahh ok então é por isso que eu posso vê-lo.
Dean
1

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.

Chris Stratton
fonte