Hallo, ich glaub das ist der Richtige Ort um mein Hobby-Projekt (FPGA basierendes Gaming-System) vorzustellen. Als Hardware benutz ich ein Altera-DE2-115 FPGA Developmentboard. Das gesamte Systemdesign bis auf wenige Ausnahmen (Standards FIFOs z.B.) habe ich selbst in VHDL geschrieben (also keine IP-Cores für CPU, Bus, S/SDRAMKontroller etc. verwendet). Der CPU habe ich mir selber erdacht, ist ein kleiner 16Bit RISC - Core (Momentan 106MHz Takt (Video-Clock), eine Instruction pro Cycle). Doku unter https://www.dropbox.com/sh/2n1o8dfium4bdgi/Zf8PzjFsuw/goldmomo_endlos_daily_build/docs/ucore1_instructions.xlsx Videoausgabe geht über VGA die maximale Auflösung beträgt 1440x900 bei 32Bit (106MHz Takt). Als Speicher werden SDRAM/SRAM mit je 128MByte/2MByte und ein 8MByte großer FLASH-Speicher verwendet. Zum Daten lesen/transfer, benutz ich die SD-Schnittstelle (Datenrate frei programmierbar), läuft bei meinen Demo auf 25MBit *4. Der Rest wie 7Seg, LEDs, Switches, PS/2, LCD, EEProm, I2C , Audio (extra Datenbus <-> SRAM/SDRAM) ... kann auch über die CPU angesprochen werden. Doku unter https://www.dropbox.com/sh/2n1o8dfium4bdgi/-9QMPc2lJf/goldmomo_endlos_daily_build/docs/ucore1_ctrl_port.xlsx Die letzten drei Wochen habe ich an einem kleinen Spiel gearbeitet (die Sprites/Tiles habe ich ausm Internet ....): Sheriff 2213 http://www.youtube.com/watch?v=WcUinTuIObA Anderes Zeug auf meinen System. Space Pilot of Death http://www.youtube.com/watch?v=ctVRjXSUPnw MOD Player (Protracker 2.1 compatible) (kennen bestimmt noch einige von Amiga Zeiten) http://www.youtube.com/watch?v=W0ChHagGEAQ Mein Emulator (Habe ich in C# geschrieben um meine Assemblerprogramme zu debuggen) http://www.youtube.com/watch?v=MKoS0bCZ_38 CPU accelerated Rotozommer (spezieller load/request Befehlssatz) http://www.youtube.com/watch?v=ke_z5vKetXk Assembler Source/Emulator ... (kein VHDL Code dabei) https://www.dropbox.com/sh/2n1o8dfium4bdgi/TK_Da_o4rx/goldmomo_endlos_daily_build Ist vielleicht mal für den einen oder anderen hier interessant.
Das Ding gefällt mir! Der MOD-Player klingt cool! Kriegst Du den Videotakt auf 108MHz hoch? Dann könntest Du ein Standardformat verwenden, das ich für meine Sachen oft nutze: 1280x1024 @ 60Hz bei 108 MHz Das passt besser zu den nativen Auflösungen vieler Monitore. Die Timings und ein Beispiel sind hier gepostet: Projekt VGA Core in VHDL
:
Bearbeitet durch User
Den Takt bekomme ich bis ca. 150MHz hoch. Hatte mich für 1440x900 entschieden, weil ich einen '16 zu 10' Monitor habe. Die Spiele sind momentan auf 1/4 H/V Auflösung (360x225) getrimmt. Vielleicht bau ich mal das Videosystem um und trenne es auch vom CPU-Clock ab. Leider ist bei höheren Auflösung (1600++) der Takt zu hoch, das schafft mein Design nicht.
@ arten W. (goldmomo) >Der CPU habe ich mir selber erdacht, ist ein kleiner 16Bit RISC - Core >(Momentan 106MHz Takt (Video-Clock), eine Instruction pro Cycle). >Doku unter >https://www.dropbox.com/sh/2n1o8dfium4bdgi/Zf8PzjF... Hmmm. >Videoausgabe geht über VGA die maximale Auflösung beträgt 1440x900 bei >32Bit (106MHz Takt). Naja, das ist ja nur Datenschaufeln. >Die letzten drei Wochen habe ich an einem kleinen Spiel gearbeitet (die >Sprites/Tiles habe ich ausm Internet ....): >Sheriff 2213 >Youtube-Video "Sheriff 2213 Level1-5" Sieht mir komplett nach Chaos Engine von den Bitmap Brother aus. Komplett auf dem eigenen System mit eigenem Prozessor in drei Wochen programmiert? Selbst wenn man die Grafik + Sound komplett kopiert hat, auch den Rest der Software basteln man kaum so fix zusammen. Glaub ich irgendwie nicht. ;-)
Die Sprites und Tiles sind Rips aus Chaos Engine, die MODs sind aus einem Mod-Archiv. (Chaos Engine ist natürlich um einiges besser :-) ) Die Level habe ich mir selber mit Tiled gebaut. Ich habe für "das Spiel" programmieren drei Wochen gebraucht, den MOD-Player und Map-Drawer hatte ich davor schon fertig auch. Der Rest war nicht 'so viel' Arbeit. An den System arbeite ich schon länger (habe mich vor ca. 4 Jahren erstmals mit VHDL befasst). Ist schon klar, dass mein Core nicht besser ist als irgend ein kommerzielles Produkt, habs aber selber hinbekommen.
:
Bearbeitet durch User
@ Marten W. (goldmomo) >Die Sprites und Tiles sind Rips aus Chaos Engine, die MODs sind aus >einem Mod-Archiv. (Chaos Engine ist natürlich um einiges besser :-) ) >Die Level habe ich mir selber mit Tiled gebaut. >Ich habe für "das Spiel" programmieren drei Wochen gebraucht, den >MOD-Player und Map-Drawer hatte ich davor schon fertig auch. Der Rest >war nicht 'so viel' Arbeit. >An den System arbeite ich schon länger (habe mich vor ca. 4 Jahren >erstmals mit VHDL befasst). OK, das erklärt das schon eher. Kam aner in deinem 1. Posting etwas anders rüber. >Ist schon klar, dass mein Core nicht besser ist als irgend ein >kommerzielles Produkt, habs aber selber hinbekommen. RESPEKT!
Das sieht auf jeden Fall sehr gut aus! Kompliment! Was ich mich frage: Hast du den Compiler auch selber geschrieben? Oder hast du für die CPU einen speziellen Instruktionssatz verwendet? Ich kann da leider keinen Hinweis drauf finden...
Der Befehlssatz der CPU ist mit keiner anderen existierenden CPU kompatibel (die Opcodes bzw. den Decoder habe ich mir selber erdacht). Habe mir keinen Compiler geschrieben nur einen einfachen Assembler, der Aufwand für einen vernünftigen (optimierenden und natürlich funktionierenden) Compiler wäre zu hoch gewesen. Assembler reicht da IMHO völlig aus, da die CPU 8 GP-Register hat und der Befehlssatz recht breit gefächert ist kann man schnell und einfach etwas in Assembler programmieren.
Marten W. schrieb: > Assembler reicht da IMHO völlig aus Krass, ich kann mir gar nicht vorstellen wie man das Sheriff Spiel in Assembler programmieren kann, obwohl ich in deinen Quelltext mal überflogen habe. Ich hätte da schon mit C++ Probleme. Allerdings habe ich auch keine Erfahrung in der Spieleprogrammierung. Machst du eigentlich VHDL auch beruflich? Sowas macht man doch nicht mal eben so nach Feierabend, oder?
alpha schrieb: > Marten W. schrieb: >> Assembler reicht da IMHO völlig aus > > Krass, ich kann mir gar nicht vorstellen wie man das Sheriff Spiel in > Assembler programmieren kann, obwohl ich in deinen Quelltext mal > überflogen habe. Ich hätte da schon mit C++ Probleme. Allerdings habe > ich auch keine Erfahrung in der Spieleprogrammierung. Assembler zu programmieren ist Übungssache (wie auch bei andere Sprachen), wenn man sich an einige Regeln beim Programmieren hält, ist er auch gut lesbar/wartbar. Habe mir zum Beispiel für meinen MOD-Player die 68000 Version von Protracker angesehen, der Assembler-Code war sehr gut zu lesen (obwohl bestimmt 20Jahre alt). > > Machst du eigentlich VHDL auch beruflich? Sowas macht man doch nicht mal > eben so nach Feierabend, oder? VHDL mach ich nicht beruflich, ich will es auch ehrlich gesagt auch nicht (ich glaub das ist nicht lustig :-P ). Mich hat schon vor etlichen Jahren Assembler auf meinen Amiga 500 gereizt (direkt auf die HW zugreifen (Copper,Paula etc)). Ist halt nicht jedermanns Sache, aber ich finds toll, ich war leider nie mit der Hardware zufrieden, bis ich dann FPGAs (und natürlich die tollen Altera/Terasic Dev-Boards) entdeckt habe.
Marten W. schrieb: > Vielleicht bau ich mal das Videosystem um und trenne es auch vom > CPU-Clock ab. Leider ist bei höheren Auflösung (1600++) der Takt zu > hoch, das schafft mein Design nicht. Wie ist denn die Ankopplung an das VGA realisiert? Bei einem FlipSpeicher der alternierend beschrieben wird, ist das ja das Bequemste. 1600 x 1200 wären am Einfachsten mit 162.0 MHz realisierbar. Auf der C4 Plattform (ich habe die auch) habe ich das schon gemacht. Andererseits: Wenn Du die Spiele in Subresolution realisierst, brächte die erhöhte Auflösung auch nicht viel, es sei denn Du addierst einen Videofilter, der die Kanten glättet. Was mich noch mehr interessiert: Sind die 32 Bit Farbe Echtfarben oder Palette?
Die Videocontroller holt pro Zeile (oder alle 2,3,4,… ist einstellbar) die Daten (Anzahl/Quelle einstellbar) vom Bus (hat nur Zugriff auf SRAM/SDRAM, es werden immer 32Bit geholt). Die Daten werden in einen kleinen Zwischenspeicher (Zeilenpuffer) geschrieben und dann durch einen einfachen Filter (32 Bit Word zu X8R8G8B8 (1Pixel 24Bit) R5G6B5R5G6B5 (2Pixel 16Bit) X1R5G5B5X1R5G5B5 (2Pixel 15Bit) X4R4G4B4X4R4G4B4 (2Pixel 12Bit) ) rausgeschrieben (auf ADV7123 8Bit R 8Bit G 8Bit B). Der Zwischenspeicher (Zeilenpuffer) erspart dann unnötige Fetches bei Subauflösungen. In einem früheren Design, hatte ich auch ein indiziertes System drin (4 & 8Bit Colortable (aber keine Bitplanes wie beim Amiga) mit zusätzlichen Hardware-Sprites. Das jetzige Design ist also nur ein einfache konfigurierbarer Framebuffer, die Grafik macht nur die CPU (finde ich flexibler als statisches Zeug in HW). Bei Sheriff verwende ich X444 als Farbformat (also 4096 Farben), weil ich dann die oberen 4Bit pro Pixel für extra Daten verwenden kann (Transparents, Kollisionscodes). Dein VGA Core Projekt in VHDL habe ich mir schon angeschaut, hätte ich vor 4 Jahre schon gebraucht :-) Das Video Setup ist also recht primitiv und wird nur am Anfang initialisiert (hier bei Sheriff):
1 | ;****************************** |
2 | ;* |
3 | ;* setupVideo |
4 | ;* |
5 | |
6 | setupVideo |
7 | |
8 | |
9 | movei r0,videoDefault ;source |
10 | movei r1,UcTimer2Ctrl ;dest-1 |
11 | moveih r0,>videoDefault |
12 | moveih r1,>UcTimer2Ctrl |
13 | movei r2,26 ;27-1 |
14 | |
15 | setupVideoLoop |
16 | |
17 | rqldi r0,0 |
18 | addi r0,1 |
19 | addi r1,1 |
20 | ld r3 |
21 | subi r2,1 |
22 | brts setupVideoLoop |
23 | st r1,r3 ;delay slot |
24 | nop ;delay slot |
25 | nop ;delay slot |
26 | nop ;delay slot |
27 | |
28 | jmpi r7,0 |
29 | nop ;delay slot |
30 | nop ;delay slot |
31 | nop ;delay slot |
32 | nop ;delay slot |
33 | |
34 | ;********************************************************************* |
35 | ;* data |
36 | ;********************************************************************* |
37 | |
38 | videoDefault ;AD NAME |
39 | |
40 | word $0001 ;10 VIDEO_ON |
41 | word $0097 ;11 HSYNC (D = 11 .. 0) |
42 | word $017f ;12 HSTART (D = 11 .. 0) |
43 | word $017d ;13 HMEMSTART (D = 11 .. 0) |
44 | word $071f ;14 HSTOP (D = 11 .. 0) |
45 | word $076f ;15 HTOTAL (D = 11 .. 0) |
46 | word $0002 ;16 VSYNC (D = 10 .. 0) |
47 | word $001e ;17 VSTART (D = 10 .. 0) |
48 | word $03a2 ;18 VSTOP (D = 10 .. 0) |
49 | word $03a3 ;19 VTOTAL (D = 10 .. 0) |
50 | word $0000 ;1a LC ADDER LOW |
51 | word $0040 ;1b LC ADDER HIGH |
52 | word $0000 ;1c LC ADDER LATCH |
53 | word $0000 ;1d LC START (10 .. 0) Pixeloffset |
54 | word $0000 ;1e |
55 | word $0000 ;1f |
56 | word $0008 ;20 HLOADSTART |
57 | word $00bc ;21 HLOADSTOP |
58 | word $001e ;22 VLOADSTART |
59 | word $03a2 ;23 VLOADSTOP |
60 | word $0004 ;24 VLOADNEXT |
61 | word $0010 ;25 MEM_STARTADR_store low |
62 | word $d000 ;26 MEM_STARTADR_store high |
63 | word $0020 ;27 MEMLowINEOFFSET_store low |
64 | word $0000 ;28 MEMLowINEOFFSET_store high |
65 | word $0003 ;29 MEM_MODE_store |
66 | word $0000 ;2a LATCH MEM_STARTADR/LINEOFFSET/MODE |
Marten W. schrieb: > Dein VGA Core Projekt in VHDL habe ich mir schon angeschaut, hätte ich > vor 4 Jahre schon gebraucht :-) Hättest halt mal was gesagt. :-) Das erste Beispielprojekt gabe es auf dem S3E board schon 2006, weil mir da die Idee kam, das Farbpattern zu verwenden und mit jedem Horizontalpixel 2 Farben auszugeben. (S3E hat ja nur 1 Bit pro Farbe). Die Auflösung war 800x600, also doppeltes Amiga-Format. Ich habe das irgendwann später auch mal bei den CodeSchnippseln hier gepostet. >32 Bit D.h. Du transportierst das mit Deiner CPU primärzeilenweise in einen Puffer (BRAM, nehme ich an) und liest es per VGA-Core mehrfach aus. Das hätte ich jetzt schon per HW gemacht.
Jürgen Schuhmacher schrieb: > Marten W. schrieb: >> Dein VGA Core Projekt in VHDL habe ich mir schon angeschaut, hätte ich >> vor 4 Jahre schon gebraucht :-) > Hättest halt mal was gesagt. :-) Das erste Beispielprojekt gabe es auf > dem S3E board schon 2006, weil mir da die Idee kam, das Farbpattern zu > verwenden und mit jedem Horizontalpixel 2 Farben auszugeben. (S3E hat ja > nur 1 Bit pro Farbe). Die Auflösung war 800x600, also doppeltes > Amiga-Format. Ich habe das irgendwann später auch mal bei den > CodeSchnippseln hier gepostet. > Habs einfach damals nicht gefunden, bzw. falsch gesucht. Trotzdem tolle Arbeit von dir. (2006 wusste ich nicht mal was ein FPGA ist :-) ) >>32 Bit > D.h. Du transportierst das mit Deiner CPU primärzeilenweise in einen > Puffer (BRAM, nehme ich an) und liest es per VGA-Core mehrfach aus. Das > hätte ich jetzt schon per HW gemacht. Nein, die CPU kann direkt auf den SRAM (ab $f000000) oder den DRAM (ab $D000000) zugreifen. Reservier mir da also einen Bereich (z.b. 360x225 Worte) und schreib da meine Bilddaten rein (ganzes Frame). Dem Videocore sage ich einfach nur an der Adresse (z.B.: ab $D000000) hole die die Bilddaten, also das ganze Frame. Er puffert es dann Zeilenweise noch in einen FPGA-Blockram (Zeilenpuffer) um mehrfaches laden von Zeilen bei kleinen Auflösungen zu vermeiden (Native läuft er immer auf 1440x900, lädt aber z.B. nur jede vierte Zeile in den Zeilen Puffer und lädt auch nur z.B. alle vier Pixel aus dem Puffer. So habe ich dann 360x225). Ich fahre also immer volle Auflösung und kann über Register „scalieren“ (LC_ADDER (pixelweise), VLOADNEXT (ab wann nächste Zeile neu laden)). Bei Sheriff habe ich z.B. Doublebuffering“ benutzt.
1 | ; base d0000000 offset comment |
2 | ; bytes words |
3 | ;
|
4 | ;frame buffer 0 176400 88200 d0000000 (16+360+16)*225 |
5 | ;frame buffer 1 176400 88200 d0015888 (16+360+16)*225 |
Warte dann immer auf einen 'VBlank' (kann den aktuellen VCount aus dem Videocore lesen, bzw. einen bestimmten VCount-Hit Register einstellen und prüfen). Switch dann die Frames, und zeichne mit der CPU in den zweiten Framebuffer rum und der andere wird vom Videocore angezeigt. Also recht primitiv, wie beim PC :-)
:
Bearbeitet durch User
Hallo Marten, ich konnte einen kurzen Blick auf Deine links werfen. Die Frage, die sich mir stellt: Können / Sollen das auch weitere user verwenden?
Wenn es denn jemand benutzen will kann ich gern alle Sourcen freigeben (bis auf die VHDL Sourcen ist alles freigegeben), bzw. auch ein Tutorial schreiben (ein Framework für die wichtigsten Sachen ist schon da (Keyboard-processing, SDCard io, Audio (Sample & MOD Player),…)). Mit den Emulator kann man eigentlich auch ohne Hardware alles Testen/Debuggen. Bei der Hardware wird’s schon kritischer, leider wird es nicht so viele DE2-115 Besitzer geben (der Preis von $595 ist auch kein Schnäppchen). Naja, das ganze System braucht momentan ~9000 LE (und einige Blockrams), man könnte es also auch auf einen kleineres Devboards portieren (DE0-1 usw.). Aber Assembler ist auch nicht jedermanns Sache, und auf Registerebene ohne OS zu programmieren ist schon ein bisschen Hardcore/Oldschool , aber auch eine Herausforderung ( wer sucht so was :-) ). Für den professionelle Einsatz ist mein Core schon wegen der nicht vorhandenen Tools (C(++) Compiler/Debugger, …) eher uninteressant, da gibt es genug Softcores oder je nach FPGA auch direkt Cores in den FPGAs. Eigentlich ist meine momentane CPU auch nur als minimal-Core gedacht (deswegen 16Bit und nur eine Instruktion pro Cycle). Denke schon lange über eine zusätzliches Design nach (hoher Parallelisierungsgrad ('dynamisches' VLIW), kleine IO Latenz, Hardware Threadpools , …) (Naja ist mein Hobbyforschungsprojekt). Ich würde auch an anderen Projekten mitarbeiten, dass meiste was ich bis jetzt gesehen/gefunden habe ist wirklich teilweise grandios (z.B. Minimig ist Klasse), aber meistens auch nur ein Nachbau von System XY und nicht wirklich mal was neues.
:
Bearbeitet durch User
Das DE-115 II ist bei vielen Unis und Studies anzutreffen. Das kostet als academic nur 300 Euro.
Marten, was braucht man denn nun, um Dein System zu nutzen? Ist das überhaupt zur Publikation gedacht? Wieviel möchtest Du davon rausgeben?
Also, Hardware braucht man: - Altera (Terasic) DE2-115 - PS/2 Tastatur (kein USB to PS/2 ‚Umwandler‘ benutzen, weil das nicht funktioniert) -Eine SD-Karte (SDHC gehen auch, XC hab ich nie probiert) (Achtung: Daten werden überschrieben!) -Kopfhörer/Boxen wenn man was höhren will unter https://www.dropbox.com/sh/2n1o8dfium4bdgi/Qi7DH2-V8l/sheriff/ liegt ucore_test.sof für den FPGA (Altera-Programmer). flash.raw kann man mittels DE2-115 ControlPanel in den FLASH schreiben, ist aber nicht unbedingt notwendig (dann sieht man kein Bootbild mit Text, sondern irgendwelchen Müll, der Bootloader funktioniert aber trotzdem (SD-Karte einlegen)). Sheriff_SDCard.raw sind die Rohdaten welche auf eine SDKarte geschrieben werden müssen, dazu das Tool RawEdit.exe unter https://www.dropbox.com/sh/2n1o8dfium4bdgi/agaeGlHJoD/goldmomo_endlos_daily_build/cross_development/binaries/ benutzen. HIER ABER VORSICHT! Es wird direkt auf die SD-Karte geschrieben, alle Daten die davor drauf waren sind 'weg'. Um sie wieder mit Windows zu benutzen, muss man sie neu formatieren. GANZ WICHTIG ist es bei RawEdit unter der Combobox ‚device‘, das richtige Laufwerk für die SD-Karte auszuwählen, ansonsten bügelt ihr die Rohdaten auf das falsche Laufwerk :-) Es werden aber nur ‚removable‘ Devices angezeigt, also keine internen HDs,also nur Mut (ich übernehme keine Garantie für irgendwelche gelöschten USB-Sticks etc.!) Bei RawEdit dann Sheriff_SDCard.raw mit „Load file(s) into buffer“ laden und dann “Write from buffer“ drücken (siehe Anhang). Wie schon gesagt, die Sourcen für die Tools/Assembler/Emulator/Testprogramme/... liegen unter https://www.dropbox.com/sh/2n1o8dfium4bdgi/TK_Da_o4rx/goldmomo_endlos_daily_build Die VHDL Sourcen schicke ich jeden der sie mag per Email, ich werde sie hier nicht in Forum posten, sonst werde ich hier von den VHDL-Profis in der Luft zerrissen.
Ich dag nur, Daumen hoch! Respekt vor dieser LEistung - ich hab mir vor 20 Jahren mal versucht, ASM für Grafikdemos beizubringen (damals war das sehr cool) - ich hab verzweifelt aufgegeben. Damals gabs allerdings auch noch kein Internet in der jetzigen Form - Mit P0rnografie hätte ich es wahrscheinlich durchziehen können :) :) EDIT: lustig, der Spamfilter mag das Wort mit "P" nicht...
:
Bearbeitet durch User
Marten W. schrieb: > Die VHDL Sourcen schicke ich jeden der sie mag per Email, ich werde sie > hier nicht in Forum posten, sonst werde ich hier von den VHDL-Profis in > der Luft zerrissen. Nun das glaube ich weniger. Selbst wenn das VHDL nicht formschön oder sehr gut lesbar sein sollte, es reicht ja dass es geht. Da es ein Hobbyprojekt ist, müssen keine Standards eingehalten werden und die Komplexität des Projektes sichert Dir Respekt auch bei schlimmsten VHDL :-)
Na dann, unter https://www.dropbox.com/sh/2n1o8dfium4bdgi/TK_Da_o4rx/goldmomo_endlos_daily_build gibts jetzt ein fpga VZ. Als Toplevel-Design-Entity system/ucore_test.vhd benutzen. Unter system/ucore_test_with_hcores.vhd geht auch als 'TLDE' braucht aber lang zum compilieren, da ich hier testweise fünf von meinen 32Bit Prototype-Cores drin habe. Also alles was hcore* ist am besten ignorieren, da bin ich am rumbasteln (die nächten Wochen/Monate/...).
Ohjeh, mach das schnell wieder weg! Das sieht ja schrecklich aus ;-) Du scheinst ein Freund des Einrückens zu sein? Bekommst Du Prozente von MS für die Tab-Nutzung?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.