VHDL FPGA basierendes System

goldmomo

Ensign
Registriert
Sep. 2013
Beiträge
143
Hallo,

Da ich öfters im Computerbase Forum herumgeschaut habe und hier auch viel über Programmieren geredet wird, aber es sich meist um Hochsprachen wie C++/C#/Java handelt, möchte ich mal schnell mein Hobby-Projekt vorstellen, das eher etwas Old-School mit ‚Assembler‘ (wer kennts noch :freak:) programmiert wird.

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 verwendet.

Der CPU habe ich mir selber designt, ist ein kleiner 16Bit Core der mit 106MHz Takt läuft.
Videoausgabe geht über VGA (nehm da einen Standard PC-Monitor),
die maximale Auflösung beträgt 1440x900 bei 32Bit (106MHz Takt).

Als Speicher sind SDRAM/SRAM mit je 128MByte/2MByte und ein 8MByte großer FLASH-Speicher verwendet.
Der SDRAM läuft mit 125MHz auf CL3 (da war vor einigen Jahren noch was tolles im PC :eek: ).

Zum Daten lesen/transfer, benutz ich die SD-Schnittstelle, läuft auf 25MBit *4 (mehr geht bei 3.3V nicht).

Der Rest wie 7Seg, LEDs, Switches, PS/2, LCD, EEProm, I2C , ... kann auch über die CPU angesprochen werden.

Die letzten drei Wochen habe ich an einem kleinen Spiel gearbeitet:

Sheriff 2213

Anderes Zeug auf meinen System.

Space Pilot of Death
MOD Player (Protracker 2.1 compatible)
CPU accelerated Rotozommer
Mein Emulator

Ist vielleicht mal für den einen oder anderen Interessant, besonders da heute beim Programmieren der ‚Kontakt‘ zur Hardware meist verloren gegangen ist (ist ja auch nicht immer schlimm).
 
Hast du die Engine zum Sheriff 2213 selbst geschrieben?

Was heißt du hast die dir CPU selber designt?

Da ich ein wenig vertraut bin mit VHDL, durch meine FH, würde mich besonders interessieren wie lange du benötigst hast das alles umzusetzen und wieviel vorerfahrung du hast.

Und zu guter Letzt, Daumen hoch!
 
Die Engine habe ich selber geschrieben (ok die Sprite/Tile Grafiken habe ich im Internet gefunden :rolleyes:)
Die Levelmaps habe ich mit Tiled gemacht und dann in meinen Code mit einen Converter importiert.
Hier der Sourcecode zu Sheriff 2213
Hier Dokumentationen/Emulator/Crossassembler/GFXConvert restlichen Sourcodes (nicht der VHDL Code des Systems)

Die CPU habe ich mir selber erdacht, d.h. ich habe neben Prefetch/Fetch/Registerfile mir einen eigenen Decoder überlegt (der die Opcodes zerlegt) und dazu passend meine eigen ALU gebaut.
CPU Beschreibung

Natürlich ist eine reines CPU Design nicht ausreichend, ohne Bussystem bzw. restliche Peripherie ist es nutzlos. Habe da viel Zeit investiert, besonders der SDRam-Kontroller war nervig.

Ich muss dazu sagen, ich habe schon auf eigentlich jeder CPU-Architekturen Assembler programmiert und kenne deshalb die stärken und schwächen vieler Designs (im Frontend durch die Opcodes, bzw. im Backend durch Dokmentationen).

Mit VHDL habe ich vor ca. 4 Jahren angefangen, eigentlich nur weil ich es mal ausprobieren wollte.
Bin dann irgendwie auf die Idee gekommen, mir ein eigenes System zu schreiben. Habe mehre Versuche gemacht, hatte mal eine externen 6510 angebaut, dann mehre Versuche mit VGA/Sprite etc. gemacht.

Naja, am Ende ist das jetzige System raus gekommen.
 
Zuletzt bearbeitet:
Puh das ist ja krass. Ich bin ganz schön beeindruckt.
Bin jetzt nicht dazu gekommen mir den Sourcecode anzuschauen aber ich habe gerade für meine Masterarbeit das Auslesen von CMOS Sensordaten und das weiterleiten an einen USB uC realisiert. Die Bilder werden dann im externen RAM zwischengespeichert etc und wollte eigentlich noch etwas Bildverarbeitung machen aber das finde icha lles saukompliziert.

Stelle mir das äußerst schwer vor die zwischengespeicherten Grafiken etc. irgendwo auszulesen. Und dann kommt noch die Steuerung des Spielers hinzu. Das muss ja alles synchronisiert werden :D
Hmm
Muss mir echt mal den Sourcecode wenn ich Zeit habe anschauen.
Danke aufjedenfall fürs posten! Hut ab! :)

Darf ich fragen ob du dir das selbst beigebracht hast? Studium? Arbeitest du in der FPGA-Entwicklung bzw. machst Hardwarenahe Programmierung?

Hatte überlegt nach meiner Masterarbeit weiter an sowas zu arbeiten aber glaube, dass ich in meiner Freitzeit "zu faul" sein werde ...
 
Zuletzt bearbeitet:
Ich habe vor langer Zeit auf meinen Amiga 500 angefangen zu programmieren und habe jetzt noch meinen Spaß an hardwarenaher Programmierung. Studiert habe ich Informatik und ich arbeite als SW-Entwickler (habe da eigentlich schon alles möglich gemacht), mach aber beruflich nicht direkt etwas mit FPGAs (haben aber bei uns aber auch eine FPGA Truppe).

VHDL habe ich mir selber beigebracht, meine erstes Programm war auch nur eine blinkende LED, aber VHDL ist schon etwas ganz anderes wenn man sequentielles Programmieren gewohnt ist.

Für eine Masterarbeit wäre mein Projekt etwas 'Overkill', da würde die Zeit nicht reichen.
Ein kleines System mit z.B. einer 8/16-Bit CISC CPU und ein einfaches internes Bussystem (FPGA Memory) mit einer VGA Videoausgabe (Indexed oder/und Tiled basierende Ausgabe) wären vielleicht machbar. Allerdings muss man sich einen Assembler schreiben und evtl. noch einen Emulator. Habe ja selber mal eine Diplomarbeit geschrieben und da rennt die Zeit schnell davon, man sollte also eigentlich davor schon genau wissen ob man sich nicht zeitlich übernimmt.

Die Synchronisation im Spiel ist nicht wirklich kompliziert.

Läuft im Level immer gleich ab:
-Warten auf VBlank (Sync auf 60Hz)
-Framebuffer switchen
-PS2 Tastatur auf Daten überprüfen
-Berechnen der Map-animationen, Spieler checken auf Bewegung/Hintergrundkollision)
-Zeichnen der Map
-Enemys berechnen (Position, ist Spieler im Blickfeld etc.)
-Enemys Zeichnen, Spieler Zeichnen
-Bullets berechnen und auf Kollision testen (evtl. State von Enemy,Spieler verändern)
-Bullets Zeichen
-HUD Zeichnen (Leben und Energie … )
-Teste ob Gameover oder Energie aus

Für die Musik läuft ein Timer auf 50Hz, der den MOD-Player aufruft. Ein extra IRQ hängt an den Audio OUT Fifos und Mixed dann je nach Bedarf (sind +-333Hz) sechs Kanäle auf zwei und schiebt die Daten in den FIFO.
 
Zuletzt bearbeitet:
Hallo goldmomo!

also ich bin richtig angetan, was Du da alles geleistet hast! Ich fürchte aber, dass Du hier wenig Anklang findest, Du solltest in anderen Foren mal posten (z.B. www.mikrocotroller.net), da sind viele, die eben das machen.

Früher mal habe ich auch soetwas gemacht, mittlerweile programmiere ich kaum in Assembler. Eigene Prozesorren entwickle ich auch nicht mehr :-(, es gibt einfach zu viele gute Softcores, wo die Tools schon sehr ausgereift sind.
Respekt vor Deiner Arbeit! Ich weiß, dass da drin sehr viel Fleiß drinsteckt, soetwas kann man kaum mit einer "normalen" Software vergleichen, weil da alles selbst gemacht ist

Grüße
Kest
 
kest schrieb:
überflüssiges Zitat entfernt *klick*
Ich werds mal bei www.mikrocontroller.net ins Forum schreiben.
Ich bin auch in anderen Forum aktiv, da war vor einigen Jahren noch richtig was los, es wurde viel über Konsolen/HomeComputer/Retro/Hardwarenaher-Programmierung gepostet. In den letzten Jahre ist das Interesse diesbezüglich aber fast zum Erliegen gekommen, habe es deswegen auch hier gepostet, damit vielleicht der eine oder andere etwas Lust auf hardwarenahe (bzw. Hardware) Programmierung bekommt.
 
Zuletzt bearbeitet von einem Moderator: (Fullquote entfernt.)
Zurück
Oben