Dove iniziare quando si considera di realizzare una GPU?


8

Ho visto questo video l'altro giorno e mi ha fatto pensare a come procedere e progettare qualcosa come la GPU. Dove inizieresti? Sono più interessato solo a leggere su come funzionano e non a farne uno con TTL (e comunque).

So che suona come una domanda su "come si fa a fare un linguaggio di programmazione", ma ogni punto di partenza sarebbe positivo dato che non ho idea di dove iniziare a cercare.


3
Sei interessato a "grafica 3D ad alta velocità" o "come guidare un CRT / LCD"
Toby Jaffey,

@Joby atm sta solo mostrando qualcosa su un display. Un quadrato di colore sarebbe bello.
Decano del

3
Qualcuno può spiegarmi perché ho ottenuto un voto negativo? Quindi posso risolvere eventuali problemi con la domanda.
Decano del

1
La difficoltà che vedo con questa domanda è che c'è un sacco di terreno tra la generazione di un solo display monocromatico da 80x25 caratteri, quello che una volta avrebbe potuto essere chiamato un generatore di display video e cosa si intende per "GPU". Il suggerimento che potresti voler fare "fuori dal TTL" ti avvicina molto alla vecchia fine del generatore di display 80x25.
JustJeff,

@JustJeff, Ok, non sapevo cos'altro si chiamavano, perché sono così diversi se fanno un lavoro simile?
Decano del

Risposte:


16

È un po 'come andare al tuo esame finale di collage per la lezione di scienze e avere questo come domanda: descrivi l'universo. Sii breve, ma conciso. Non è possibile rispondere a quello in modo pratico, quindi risponderò a una domanda diversa.

Quali sono i tipi di cose che devo sapere prima di provare a progettare una GPU?

In un ordine cronologico approssimativo, sono:

  1. VHDL o Verilog.
  2. FPGA (area utile per giocare con la scrittura della logica digitale).
  3. Elementi di base del percorso dati, come quelli di FIFO.
  4. Interfacce bus, come l'interfaccia PCIe e DDR2 / 3
  5. Implementazioni binarie di funzioni matematiche, incluso virgola mobile, ecc.
  6. Progettazione della CPU.
  7. Standard di interfaccia video.
  8. Materiale analogico ad alta velocità (il lato analogico del digitale ad alta velocità)
  9. PLL e altre cose di clock semi-avanzate.
  10. Progettazione PCB di circuiti ad alta velocità.
  11. Convertitore DC / DC a bassa tensione e alta corrente.
  12. Un sacco di roba software.
  13. Infine, ASIC o altri tipi di chip personalizzati.

Oserei anche dire che non farai questo genere di cose con i chip logici TTL. Dubito che potresti ottenere un'interfaccia di memoria DDR2 / 3 ragionevole che funzioni con normali chip TTL. L'uso di un grande FPGA sarebbe molto più semplice (ma non facile).

Andare al passaggio 6 sarà probabilmente "abbastanza buono da placare la sete intellettuale". Ciò potrebbe anche essere fatto entro un ragionevole lasso di tempo - circa un anno - per stabilire come obiettivo a breve termine.

EDIT: Se tutto ciò che vuoi fare è sputare un segnale video, allora è relativamente facile. In sostanza, è un pezzo di memoria che viene spostato su un display a 60 ish Hz. Il diavolo è nei dettagli, ma ecco un riassunto di come farlo:

Inizia con un po 'di RAM a doppia porta. Non deve essere vero ram a doppia porta, solo un po 'di RAM che una CPU può leggere / scrivere e che il tuo circuito video può leggere. Le dimensioni e la velocità di questa RAM dipenderanno dal tipo di display che stai guidando. Personalmente userei DDR2 SDRAM collegato all'interfaccia di memoria di un FPGA Xilinx Spartan-6. Il loro core "MIG (Memory Interface Generator) semplifica la trasformazione in RAM a doppia porta.

Quindi, progettare un circuito che controllerà la modalità di lettura di questa RAM e sputerà questi dati su un semplice bus. Normalmente leggi la RAM in sequenza. Il "bus semplice" è proprio questo. Sono alcuni bit con il valore di pixel su di esso-- e basta. Questo circuito dovrà fare altre due cose: dovrà tornare all'inizio della RAM ogni fotogramma video e dovrà "mettere in pausa" l'output durante i periodi di ritraccia orizzontale / verticale.

Terzo: creare un circuito che emetterà i segnali di controllo video (HSync, Vsync, ecc.) E dire al circuito precedente quando mettere in pausa e riavviare. Questi circuiti sono in realtà abbastanza facili da fare. Trovare lo standard video appropriato è più difficile, imho.

E infine: collega i segnali di controllo e il bus dati pixel video a "qualcosa". Potrebbe essere un piccolo LCD a colori. Potrebbe essere un DAC video per emettere un segnale compatibile VGA. Esistono encoder NTSC / PAL che accettano questi segnali. Eccetera.

Se la risoluzione è davvero ridotta, è possibile cavarsela utilizzando la RAM interna dell'FPGA anziché una SDRAM DDR2 esterna. Dovrei avvertirti che se si utilizza DDR2 SDRAM allora probabilmente avrai bisogno di un FIFO e di altre cose, ma anche questo non è terribilmente difficile. Ma con DDR2 SDRAM puoi supportare display ad alta risoluzione. È inoltre possibile trovare schede di sviluppo FPGA con DAC VGA integrati e altre forme di uscite video.


Wow non è un compito breve quindi. Capisco che non c'era una risposta concisa. Ma mi hai dato un buon punto di partenza e dovrò farlo nel mio tempo libero molto limitato. Ma dovrebbe essere un'esperienza interessante.
Decano il

@Dean Hmmm ... Ci sono TRE cose diverse qui: CPU, GPU e qualcosa per emettere un segnale video. È facile creare qualcosa per emettere un segnale video. Una GPU è più simile a una CPU progettata per eseguire elaborazioni relative a video / grafica: grafica 3-D, accerazione grafica 2-D, ecc. Se vuoi solo qualcosa per emettere un segnale video, allora sei pronto. Se vuoi la grafica 3-D o anche la 2-D semi-avanzata, dovrai consultare la mia lista.

1
Come è facile emettere un segnale video? Penso che questo farebbe un primo passo migliore.
Decano del

@Dean Ho modificato la mia risposta per includere elementi su come emettere un segnale video.

1
Ho scritto un libro sulla computer grafica una volta (ISBN 0-471-13040-0), ma è molto introduttivo. Negli anni '90, quando ATI aveva solo i suoi chip MACH64 e voleva entrare in 3D, mi assunsero mentre un consulente insegnava loro alcuni concetti, li faceva andare avanti e aiutava con l'architettura. Il risultato sono stati i primi chip RAGE. All'epoca ero un ragazzo di grafica. Dai un'occhiata al brevetto USA 5097427 se non mi credi. Tuttavia, penso che il brevetto di interpolazione quadratica (US 5109481) fosse più importante ma meno appariscente. Potresti riconoscere alcuni altri nomi su quelli ;-)
Olin Lathrop il

8

Racing the Beam è uno sguardo dettagliato al design e al funzionamento dell'Atari VCS. Ha un trattamento completo dell'adattatore di interfaccia televisiva.

Il TIA riguarda la GPU più semplice, pratica.

Comprendere un sistema di lavoro piccolo ma completo può essere un buon modo per imparare una nuova materia.

Sono disponibili schemi completi , così come un manuale tecnico .


Atari 2600 regole! La maggior parte dei sistemi di gioco utilizza l'hardware per generare il display, ma il 2600 fa tutto per magia. Confronta qualcosa come Combat o persino Asteroids con qualcosa come Toyshop Trouble (Asteroids e Toyshop Trouble sono entrambi 8K). Il combattimento mostra due oggetti monocolore con risoluzione a 2 righe; Toyshop Trouble mostra 16 oggetti con risoluzione a riga singola e colorazione per riga (e senza sfarfallio). Nessun hardware aggiuntivo per Toyshop Problemi oltre uno switcher di banca per consentire 8k di codice. Solo un po 'di codice intelligente e un po' di magia.
supercat,

A proposito, la programmazione 2600 può essere oscura, ma un progetto di sovrapposizione video basato su PSOC che ho fatto per un cliente sembrava piuttosto 2600 ish. Configurare l'hardware su chip per generare alcuni dei tempi e utilizzare il codice per inviare i dati a uno slave SPI in modo che possa essere sincronizzato come pixel.
supercat,

incredibile che tutto il codice di gioco doveva essere eseguito durante i tempi di ritracciamento del raggio
JustJeff

5

Se vuoi solo mettere un po 'di roba sullo schermo e pensare che potresti davvero apprezzare molto il cablaggio, potresti puntare a un sistema grafico di caratteri dei primi anni '80. Se riesci a raggiungere i tempi per RS-170A, potresti persino essere in grado di spingere il segnale in un ingresso AV di riserva su un televisore al plasma da 50 ", e di andare in grande stile.

Alcuni dei primi sistemi utilizzavano le loro CPU a 8 bit per generare direttamente il display, ad esempio il 6507 nell'Atari 2600 e lo Z-80 nel Timex Sinclair ZX-81. Puoi persino fare lo stesso tipo di cose con i moderni microcontrollori. Il vantaggio in questo modo è che l'hardware è semplice, ma il software deve generalmente essere assemblato, ed è molto esigente, e i risultati saranno davvero deludenti. Probabilmente il 2600 impiegava hardware aggiuntivo, ma il TIA non aveva gran parte di un FIFO e il 6502 (beh, 6507, in realtà) doveva scaricare byte in tempo reale. In questo approccio, non esiste una modalità video standard; ogni applicazione che utilizza il video deve essere intimamente combinata con le esigenze di mantenere il flusso dei pixel.

Se vuoi davvero costruire qualcosa con il TTL, il prossimo livello di complessità dovrebbe essere la visualizzazione del testo basata su caratteri ROM. Ciò consente di inserire uno, per esempio, 256 caratteri in una qualsiasi delle 40 colonne e 25 posizioni di riga. Ci sono un paio di modi per farlo.

Un modo: fai quello che ho fatto con il modello TRS80. Un gruppo di 74161 contatori con un assortimento di porte ha generato l'indirizzo video; tre 74157s hanno multiplexato 12 bit dell'indirizzo CPU con l'indirizzo video, per inviare un indirizzo a una RAM statica 2K. I dati RAM sono stati bufferizzati nella CPU, ma sono stati inviati senza buffer come indirizzo alla ROM del set di caratteri. Non vi è stato alcun arbitrato sul bus; se la CPU voleva la RAM video, il sistema video veniva calpestato, con conseguente effetto "neve". L'indirizzo video combinato è stato combinato con alcune linee della sezione contatore per completare gli indirizzi bassi; l'output della ROM dei caratteri è stato scaricato in un registro a scorrimento 74166. L'intera cosa è scappata dalle divisioni da un cristallo 14.31818MHz. In questo approccio, avresti esattamente una modalità video completamente implementata nell'hardware, come 40x25 o 64x16, ecc.,

Un altro modo: scavare un cosiddetto chip CRTC come un 6845. Questi hanno combinato la maggior parte della logica del contatore e della colla e hanno fornito al processore un'interfaccia di controllo-registro in modo da poter riprogrammare alcuni dei tempi. Sistemi come questo potrebbero essere resi un po 'più flessibili, ad esempio, potresti ottenere 40x25 e 80x25 dallo stesso hardware, sotto il controllo del registro. Se sei intelligente sulle frequenze di clock, potresti essere in grado di consentire alla tua CPU di avere libero accesso alla RAM video durante la metà dell'orologio e l'accesso del generatore di indirizzi video durante l'altra metà dell'orologio, ovviando così alla necessità di arbitrare il bus ed eliminando l'effetto neve.

Se vuoi provare modalità grafiche reali, però, scoprirai rapidamente che creare le tue è problematico. L'Apple 2 originale lo ha gestito, ma quel sistema aveva qualcosa come 110 chip MSI TTL, e anche così c'erano alcune cose divertenti da affrontare, come la mappatura non lineare del buffer video sul display e tavolozze di colori estremamente limitate , per citarne due. E Woz è generalmente riconosciuto come se avesse avuto un indizio. Quando arrivò il '2e', Apple stava già inserendo il sistema video in un chip personalizzato. Il C-64, all'incirca nello stesso periodo, doveva le sue capacità grafiche a chip personalizzati.

Quindi .. direi lì di due modi per farlo. In un modo: porta fuori il secchio del vecchio TTL e aspira a un display di testo monocromatico 80x25; dall'altra parte: procurati una buona scheda di valutazione FPGA, fai tutto in VHDL e inizia con un display di testo 80x25.


1

Dovresti iniziare con alcune nozioni di base sull'architettura del computer e, in parallelo, iniziare con la progettazione ASIC di base usando VHDL o altro linguaggio descrittivo.

Dopo aver appreso le basi dell'architettura del computer, consiglierei di avventurarmi nella computer grafica, magari iniziando con alcuni semplici progetti OpenGL. Il principale take-away qui sarebbe farsi un'idea dell'architettura di rendering della pipeline grafica .

Il prossimo passo sarebbe pensare ai modi in cui questa pipeline di rendering potrebbe essere realizzata con hardware dedicato anziché tramite software.

In termini di costruzione effettiva di una GPU e collegamento al tuo computer, non penso sia fattibile fare sul budget di un appassionato, ma forse c'è qualcosa di molto semplice che puoi provare con una piattaforma ARM-linux incorporata (che espone un bus di sistema) e un FPGA (l'FPGA in questo caso è la tua GPU scritta in VHDL) che trasmette a un display VGA a bassa risoluzione come un progetto vincolante. Ciò richiederebbe anche la scrittura di driver. Se riesci a farlo, sarebbe un assassino su un curriculum.


1

Guarda gli schemi a blocchi di alto livello delle GPU di AMD e NVidia. Probabilmente troverai un bel po 'di informazioni dalla gente dell'opengrafia, che sta progettando hardware grafico che è open source, con driver open source.

Quindi devi guardare quello che vuoi.

  • Uscita, HDMI, DVI o VGA?
  • Trasformazioni di vertici?
  • Texturing?
  • Pixel Shading?
  • Ritaglio e rasterizzazione del triangolo?
  • Qualsiasi trama?
  • Operazioni raster?

Se non hai eseguito alcuna programmazione utilizzando le funzionalità GPU, questa potrebbe essere una buona cosa da sapere.

Penso che anche Leon l'abbia inchiodato. Userei Verilog se lo facessi.

Se desideri solo video composito, come nel video che hai pubblicato. Ci sono molti esempi là fuori. Diamine, guarda l'implementazione di Woz dell'Apple II. :)


1
@Leon ha lasciato un commento? Se è così non riesco a vederlo.
Decano del

L'ho cancellato. Ho suggerito di utilizzare un FPGA per implementare una semplice CPU. L'ho fatto alcuni anni fa con un disegno tratto da un libro, scritto in VHDL, che ho modificato per il mio hardware.
Leon Heller,

Ahh, allora è per questo che posso vederlo.
Decano del

1

Sembra che tu non stia cercando di creare una GPU (nel senso di 3d e shading tutto ciò) quanto un generatore di video. Molte schede di valutazione FPGA hanno un connettore su di esse per un monitor VGA o di altro tipo e progetti di esempio dal produttore o da altri utenti per la visualizzazione di elementi su quel monitor. Ci sono anche alcune schede con LCD integrati ma tendono ad essere nella classe $ 300 e superiori, mentre quelle di base che possono pilotare un monitor standard vanno per $ 60-120.

La maggior parte degli FGPA non ha memoria interna sufficiente per fare più di un piccolo display, ma molte schede hanno memorie esterne con più capacità. Molti di loro guidano i monitor VGA analogici in modo digitale, vale a dire che RG e B sono completamente attivi o completamente spenti, anche se alcuni offrono due livelli e probabilmente puoi trovarne uno con un DAC video o un connettore per un'interfaccia di monitor digitale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.