Softcore CPU NEO430 mit GHDL simulieren

Für meine Masterarbeit beschäftige ich mich gerade mit Softcore-Prozessoren auf FPGAs. Dabei kommt für meine Arbeit der NEO430 zum Einsatz, ein sehr kleiner aber feiner Prozessor der an meinem Institut entwickelt wurde (von Stephan Nolting). Da ich aktuell noch nicht in einem Stadium bin, wo ich den Prozessor wirklich auf einem FPGA implementiere (auch wenn das der nächste Schritt ist) arbeite ich aktuell sehr viel mit Simulation, und da vor allem mit ModelSim. Ein bisschen was dazu hatte ich ja hier im Blog schon mal da zu geschrieben.

Nun hatte ich heute Abend die Idee, man könnte ja mal einen anderen Simulator ausprobieren. Mir hat es dabei GHDL angetan, vor allem, da er OpenSource ist, aber auch weil er einen interessanten Ansatz verfolgt: Der VHDL-Code wird mit einem umgebauten Compiler (GCC oder LLVM) direkt in Maschinencode kompiliert, und dieser Code dann ausgeführt. Dadurch soll der Simulator extrem schnell sein. Auf Windows ist das ganze etwas eingeschränkt, hier wird ein interner Codegenerator verwendet. Weiterlesen

Schöne Debugausgaben mit VHDL

Aktuell arbeite ich fleißig an meiner Masterabeit (einer der Gründe, warum es hier auf dem Blog so still ist…), und entwickele dafür auch ein paar Sachen in VHDL (ich entwickele also Hardware 🙂 ). Am Ende soll das ganze natürlich auf einem FPGA laufen (vielleicht sogar mal in einem echtem Chip, einem ASIC!), aber aktuell wird das ganze nur simuliert. Das ist zwar ziemlich langsam (aktuell etwa um den Faktor 1000), aber dafür kann man sich jedes Signal in seiner Schaltung ganz genau ansehen und bei Bedarf auch Debug-Ausgaben tätigen. Besonders das hat sich aktuell als sehr hilfreich dargestellt.

VHDL unterstützt das im Prinzip mit assert und report, allerdings finde ich die Ausgaben recht unübersichtlich, vor allem weil sie über mehr als eine Zeile gehen. Zudem ist alles einfarbig, so dass man schnell die Übersicht verliert. Ich habe mir als etwas überlegt, was etwas schöner aussieht (siehe Screenshot)

Weiterlesen

Einfache Sättigungsarithmetik in VHDL

Für ein Projekt an der Uni habe ich mit zwei Kommilitonen ein Malprogram („FPGArt“) auf einem FPGA implementiert. Dabei wird eine Maus per PS/2-Schnittstelle angebunden und das Bild schließlich per VGA ausgegeben. Zu dem Projekt selber später vielleicht mehr, hier jetzt nur ein kleines VHDL-Snippet das man vielleicht man gebrauchen kann.

In dem Projekt wird regelmäßig die relative Bewegung der Maus abgefragt und zu dem alten Wert addiert. Natürlich hat das Bild eine begrenze Größe und der Mauszeiger muss in diesen Grenzen von 800×600 gehalten werden. Es wird also eine sog. Sättigungsarithmetik benötigt: Sollte das Ergebnis der Addition größer als 800 (bzw. 600) sein, oder kleiner als 0 wird es auf den Grenzwert gesetzt. Das ganze ist gar nicht so einfach in Hardware zu implementieren (zumindest ist uns nichts intelligentes eingefallen…).

In jedem Fall muss es ein Zwischenergebnis geben das ausreichend groß ist, um Überläufe überhaupt zu erkennen. Die Maus kann pro Intervall Maximal um 256 bewegt werden, entsprechend muss als ein Wert von 800+256 = 1056 gespeichert werden können. Mit 11 bit kommt man auf 2048, das reicht. Hiermit kann man auch Unterläufe erkennen: 0-256 = -256 was dann 1792 entspricht. Dieser Bereich überlappt auch nicht mit den 1056 nach oben. Es ist also immer einwandfrei erkennbar, dass ein Über/Unterlauf stattgefunden hat.

Weiterlesen