# [Projekt] Eigene CPU + Befehlssatz entwerfen und simulieren



## Crysis nerd (15. August 2013)

Hallo liebe Community,

gestern Nacht hat mich jemand freundlicherweise auf eine gute Idee gebracht. Und zwar geht es um ein kleines Projekt, welches ich in meinen Semesterferien bearbeiten könnte: Ich möchte eine eigene CPU entwerfen (selbstverständlich nur das gröbste) und dann dafür auch einen Befehlssatz ausarbeiten, den diese CPU verarbeiten kann. Die CPU möchte ich nur mit Hilfe von logischen Grundbausteinen aufbauen (so wie in der Schule früher toll mit AND und OR-Bausteinen ). In meinem Befehlssatz will ich später Programme schreiben können und diese auch ausführen.

Jetzt hab ich aber erstmal ein Problem: Physikalisch in der echten Welt bin ich motorisch zu unfähig etwas zusammenzulöten und habe auch nicht ansatzweise die Materialien dafür. Es ist die Frage, wie ich das virtuell aufbaue. Es gibt sicherlich tausende Programme da draußen, in denen ich mir Gatter zusammentackern kann und auch Strom anlegen usw. Ich möchte nur auch gerne eine API dazu haben.
Ich möchte später meine Programme (geschrieben in meinem Befehlssatz) als Datei speichern können, dann ein Programm schreiben (normal in C++ z.b. was zu x86 compiliert), welches meine Datei läd und ausführt auf meiner CPU. Und am besten noch so dass ich sehe, welche Lines aktiv sind und welche nicht.

Das ist ne ziemlich große Anforderung denke ich, aber eventuell gibt es ja sowas. Falls ihr also sowas kennt, wäre ich euch sehr dankbar, wenn ihr es mir verratet.

Außerdem würd mich einfach interessieren, was ihr von dem Projekt haltet. Ob ihr sowas selber schonmal gemacht habt oder so. Ich hoffe, dass ich dadurch am besten verstehe, wie genau das gemacht wird, anstatt nur darüber zu lesen.


Liebe Grüße
Lukas


----------



## AMD (15. August 2013)

Ein sehr interessantes Projekt. Ich bin momentan am überlegen ob ich sowas als Bachelorarbeit machen will 

Was  mir irgendwie ins Auge sticht: C++ und x86 compiler. Halte es schlicht  und mach lieber eine eigene kleine Sprache die Assembler ähnlich ist.
Werte in Register laden, vergleichen, sprünge, addieren, etc.
Zumindest würde ich das erstmal so ansetzen, damit man nicht gleich zu viel will.

Wenn  du dann wirklich eine CPU mit Gattern bauen willst, dann wirds übel, da  du einfach extrem (!) viele davon brauchst. Umsetzen tut man das wohl  am Besten mit NAND Gattern wobei dir vorher gut klar werden sollte: Was  soll diese CPU alles können.

Ich stell mir momentan ein 8 bit CPU  vor. Wenn du sagen wir mal 5 Register hast, jedes bit davon kommt in  ein FlipFlop => 5*8 = 40 FlipFlops. Und so ein FlipFlop bräuchte  jeweils 2 NAND Gatter, dann wären das schon 80 Gatter nur damit du 5  Register hast mit 8 bit :S
Zumal die CPU ja dann immer noch nix kann... Sowas wie Multiplexer damit du auch was auswählen kannst müsste auch noch alles integrieren und und und ...


Also wie du vllt. merkst mache ich momentan auch nur etwas Brainstorming weil einen konkreten Plan hätte ich auch nicht so schnell xD

Ich arbeite momentan viel mit Atmel CPU's (Atmega 328 etc.). Das ist vllt. nicht das selbe aber doch interessant. Gerade das programmieren in C oder auch andere Bauteile ansprechen ist eine interessante Sache. Vielleicht wäre das ja auch was für dich?


----------



## Leandros (15. August 2013)

80 Gatter. Das ist noch mit simplen Schaltungen auf annehmbarer Fläche möglich mit Handelsüblichen Bauteilen. 
Allerdings kann deine CPU dann so gut wie nichts.


----------



## Crysis nerd (15. August 2013)

Falls das mit C++ falsch rübergekommen sein sollte: Ich hab keineswegs vor, einen C++ Compiler zu schreiben, der in meine eigene Maschinensprache compiliert  Das wäre krank.
Ich meinte nur, dass ich mir generell ein Programm baue (z.B. in C++) welches dann eine Dateiläd die Befehle meines Befehlssatzes enthalten. 

Und ja ich werde mal scharf nachdenken müssen, was er alles können solle. Ich hab mir schon ein paar Gedanken gemacht dazu.

Ich brauch ein paar Register, das ist klar. Da kann ich mir <8 Stück mit 8 Bit bauen. Dazu hätte ich gerne eine kleine APU die 8bit Zahlen addieren kann. Außerdem dann ein Befehlsdecoder der meine Maschinensprache dann umsetzt in die entsprechenden ... Naja Signale oder so.
Wie ich das mit den mehreren Befehlen mache, weiß ich noch nicht. Theoretisch müsste ich ja iwie schaffen einen virtuellen RAM zu haben und darauf zuzugreifen. 

Also kurz gefasst: Befehlsdecoder für wenige Befehle (ADD, INC, XOR, AND, ...) , ein paar 8 Bit Register sowie eine APU die addieren kann.

Das dürfte schonmal recht aufwendig sein denke ich ^^

Ich würde mir allerdings die sachen iwie zusammenklicken in einem Prorgramm. aber ich bezweifel dass ich dann später meinen eigenen Befehlssatz darauf laufen lassen kann (halbwegs einfach).
Und so einen logischen Schaltplan in einer Programmiersprache umzusetzen is auch iwie blöd. Ich bin mir da noch nicht ganz schlüssig.

Grüße


----------



## AMD (15. August 2013)

Btw. Logisim

Wenn man mal ein paar Logische Schaltungen schnell simulieren will! Zum durchtesten echt optimal und auch sehr leicht zu bedienen das Programm.


----------



## bingo88 (15. August 2013)

Über so etwas habe ich auch schon einmal nachgedacht, daher erzähle ich dir mal ein bisschen von meinen Erfahrungen (habe es nämlich aus Kosten-, Wissens- und Zeigründen gelassen):
Diskret aufbauen kannst du bei den Anforderungen vergessen, da das einfach viel zu komplex wird. Das mit dem Hochsprachencompiler kannst du eigentlich auch vergessen, solange du keinen bereits unterstützten Befehlssatz verwendest (was wiederum die Komplexität der Schaltung in die Höhe treiben würde). Du müsstest dem Compiler nämlich erstmal deinen Befehlssatz beibringen. Wie Leandros schon sagte, am besten mit einem einfachen Assembler arbeiten, da hier die Befehle 1:1 abgebildet werden können. Mehr als ein paar Rechenoperationen wirst du vermutlich auch damit nicht machen können, da du für alles andere zusätzliche Hardware benötigst (Speicher, IO, etc.). Wäre sicherlich aber trotzdem ein schönes Gefühl, wenn man so etwas mal gebaut hat. Du solltest dir halt nur darüber im Klaren sein, dass du ohne ausreichendes Wissen, Erfahrung und technische Möglichkeiten da nicht zu viel erwarten solltest.

Wenn du es "in Hardware" haben möchtest, sieh dir doch mal FPGAs an (das Zeugs ist aber nicht grade billig ). Die kann man mit Hardwarebeschreibungssprachen (Verilog, HDL, ...) programmieren und sozusagen Chips/Schaltungen emulieren. Die werden zum Teil sogar produktiv eingesetzt, da man die halt beim Kunden einfach per Update patchen kann. Du hast damit natürlich nicht die Leistung einer heutigen CPU, aber die werden meistens sowieso als ASIC entwickelt. Ich glaube für diese Hardwarebeschreibungssprachen gibt es auch Emulatoren, die das dann ohne FPGA laufen lassen können, da bin ich mir aber nicht 100%ig sicher...

Mit Logisim hatte ich auch mal herumgespielt, das ist zum Verstehen von Schaltungselementen eigentlich ganz nett.

Edit: Hier mal ein Video von einer Spielekonsole, die auf einem FPGA Entwicklerboard läuft: http://www.youtube.com/watch?v=KmNaEnPSM9o
Und noch eins: http://www.youtube.com/watch?v=niQmNYPiPw0

Wenn ich mir die Videos so ansehe, hätte ich doch wieder Bock auf solch ein Projekt ^^


----------



## Leandros (15. August 2013)

Crysis nerd schrieb:


> Falls das mit C++ falsch rübergekommen sein sollte: Ich hab keineswegs vor, einen C++ Compiler zu schreiben, der in meine eigene Maschinensprache compiliert  Das wäre krank.



Klingt jetzt dumm, aber soo extrem kompliziert ist das nicht. Die basics sind recht simpel, wenn du dann natürlich alles optimieren möchtest etc wirds schnell sehr komplex.

Würde trotzdem eher versuchen es auf Assembly auf zu bauen, weil so etwas mit z.B C++ (also einer Hochsprache) halte ich für sehr suboptimal.


@AMD: Auch wenn ATMega mikroprozzessoren ganz witzig sind (habe hier so ein paar von rum liegen), so lange du keine USB Schnittstelle hast (was wieder den purismus killt), macht das einfach kein Spass. Serial, z.B in Verbindung mit Rxtx ist zum kotzen


----------



## AMD (15. August 2013)

@bingo88: An ein FPGA dachte ich auch erst aber er will ja unbedingt auf Gatter Ebene selber bauen ^^
Ich habe bis jetzt immer mit Xilinx Boards + VHDL gearbeitet. Die Entwicklungsumgebung ist zwar nicht das gelbe vom Ei aber ok. Mit einem einfachen Starterboard (vllt. Spartan 3(AN)) sollte der Einstieg auch nicht zu teuer werden und man kann damit erstmal rumprobieren.

@Leandros: Was ist denn das Problem wenn USB fehlt?
AVR Programmer genutzt, verbinden mit MISO, MOSI und SCK und schon läufts (nagut und gnd, vcc und reset xD). Das liegt dann wohl eher am User wenn's schon daran scheitert ._.


----------



## Crysis nerd (15. August 2013)

AMD schrieb:


> ...


Danke das Programm werd ich mir erstmal angucken.



bingo88 schrieb:


> ...


Also Hardware muss nicht sein, wie schon gesagt. Kostet zu viel und geht dadurch sicher nicht besser  



Aber ich erklär nochmal eben, was genau ich vorhabe. Dazu folgende Definition: Cryn3rdProgramm steht jetzt für ein Programm, welche später auf meinem erdachten Prozessor laufen soll. Also etwas, was in meiner ausgedachten ASM-Sprache geschrieben wird. Ein NormalProgramm ist ein Programm, was ich in irgendeiner Hochsprache schreibe, um ein Cryn3rdProgramm ausführen zu können. Also NormalProgramme sind z.B. Simulatoren.

Ich schreibe in einer Textdatei ein Cryn3rdProgramm in meiner ausgedachten ASM-Sprache. Also das wird dann so aussehen, wie eine normale .asm Datei.
Dann habe ich ein NormalProgramm, welches diese Textdatei in eine "ausführbare" Datei umwandelt. Also quasi ein Assembilierer, der eine Quelldatei in eine ausführbare Datei (mit einem Format wie ELF o.ä.) umwandelt. 
Danach bau ich mir ein NormalProgramm, was ein Simulator ist. Diesem Simulator gebe ich meine ausführbare Datei, die der Assembilierer ausgespuckt habe. Der Simulierer ließt die ausführbare Datei und führt sie auf der simulierten CPU aus. 

Die Frage war jetzt, ob ich bei dem Simulator teilweise auf etwas vorhandenes zurückgreifen kann. Also z.B sowas wie Logisim. Dass ich in Logisim meinen Schalplan aufbaue. Dann hab ich in Logisim eine Reihe von Eingängen, die ich z.B. in einer Logisim internen Scriptsprache ansprechen kann. So würde die eigentliche Simulation von Logisim übernommmen werden und mein Script würde nur meine ausführbare Datei laden und "umwandeln" auf die logischen Eingänge in der LogiSim Simuklation.

Hoffe ich hab mich diesmal halbwegs gut ausgedrückt  Alternativ hab ich überlegt einfach die Simulation komplett selber zu machen. Dann hätte ich sicher keine tolle Visualisierung aber naja..


Grüße


----------



## Skysnake (17. August 2013)

Ich will dir wirklich nicht die Motivation rauben, aber was du dir da vornimmst ist ziemlich harter Tobak. Ich hab das selbst im Studium mal im Rahmen einer 4+2 Vorlesung gemacht, und die war schon ziemlich knallig vom Umfang her... Wir haben da auf Basis von einem Altera FPGA einen 16-Bit Prozessor auf Gatterebene gebaut, also das was du machen willst. Wir hatten nur schon den Aufbau vorgegeben und mussten eben "nur" noch Implementieren, wobei wir natürlich die Freiheit hatten noch "fancy shit" ein zu bauen  Das war EXTREM geil, aber als Physiker hatte ich nicht sooo viel Zeit durch die anderen Vorlesungen. Daher ist es bei mir bei einer relativ normalen Implementierung geblieben. Sie ist aber gelaufen!!! Zwar nur mit 1MHz oder so laut sim, wobei da sicherlich noch Arbeit nötig gewesen wäre um alles wirklich 100% lauffähig zu bekommen. Aber das Ding ist gelaufen! Das war mehr als bei >60% der Leute... 

Wir hatten in der Vorlesung sogar 1 oder 2 ganz harte, die haben Pipelineing eingebaut. Da lief das Ding dann sogar mit >10 MHz. Das war schon SEHR geil. Wollte ich auch machen, aber das kostet einfach SO!!! EXTREM!!! viel Zeit, das war einfach nicht drin 

Du musst dir halt vor allem auch überlegen, WAS du genau machen willst! Im Moment scheint mir das bei dir noch nicht klar zu sein.

1. Du willst eine ISA-Design entwickeln:
Das kannst du am Besten mit Stift und Papier. Einfach anfangen und dir überlegen was du denn brauchst, welche Größen soll das haben, wieviele Bits brauchst du dafür usw usw Das klingt jetzt sehr provan, aber im Detail steckt die Tücke. Was bringen dir supi viele Register, wenn du nicht in der Lage bist Sie zu addressieren? 

Also von daher mal gedanken machen:


Big/Little Endian
Anzahl Register
Adressierung Register
Welche Logikoperationen gibt es?
Wie sind die Logikoperationen codiert?
Gibt es Caches?
Gibt es "nur" Int oder auch Float?<-davon würde ich dringend abraten! Float ist ein fucking großes Fass... Du kannst in der ISA ja schonmal Platz für Flaot-Ops "reservieren", das ist "intelligent" um das Design später vergrößern zu können, aber implementieren ist ähm... ja, das willst du nicht 
Gibt es sonst noch "lustige" Sachen?
2. Du willst "einfach" nur einen Chip designen, und dich eigentlich nicht groß mit den Grundlagen aufhalten. WIE man etwas genau implementiert ist schon schwierig genug...
Wenn ja, kann ich dir nur alles rund um Sweet16 empfehlen. Den Chip hat Prof. Lindenstruth mit entwickelt und hält meines Wissens nach auch ein Patent darauf. Der Chip ist expliziet im Hinblick auf die Lehre entwickelt worden! Ich denke du kannst die Daten daher auch mit gutem Gewissen nutzen ohne Urheberrechtsverstöße befürchten zu müssen.

Es gibt dafür auch einiges an frei zugänglichem Infomaterial, was dir die Arbeit EXTREM! vereinfachen wird! Hier mal ein paar Links, die ganz brauchbar sind, und ich auf die Schnelle gefunden habe.
IEEE Xplore - The educational processor Sweet-16
SWEET16 - Wikipedia, the free encyclopedia
http://www.google.de/url?sa=t&rct=j...S1ATTF12mA2UYOHF7jYwKvg&bvm=bv.50768961,d.Yms
http://plaza.ufl.edu/caseym82/myweb/files/cisc_labs.pdf




AMD schrieb:


> @bingo88: An ein FPGA dachte ich auch erst aber er will ja unbedingt auf Gatter Ebene selber bauen ^^
> Ich habe bis jetzt immer mit Xilinx Boards + VHDL gearbeitet. Die Entwicklungsumgebung ist zwar nicht das gelbe vom Ei aber ok. Mit einem einfachen Starterboard (vllt. Spartan 3(AN)) sollte der Einstieg auch nicht zu teuer werden und man kann damit erstmal rumprobieren.


Nö, du kannst auch mit Xilinx auf Gatterbasis arbeiten, das willst du aber im Normalfall NICHT! Es gibt VHDL ja nicht zum Spaß! Du nimmst dir damit einfach unglaublich viel Arbeit ab! Das zeichnen von Gattern und Verbinden von denen ist wirklich sehr sehr aufwändig im Vergleich zu VHDL, und die VHDL Tools sind wirklich ganz gut. Wirklich runter auf Gatterebene gehst du eigentlich nur wenn du extrem kritische Pfade hast, und dann anfängst auch noch das letzte quäntchen raus zu quetschen. 

Ansonsten arbeitest du auf Gatterebene eigentlich nur in der Lehre, um den Leuten mal zu zeigen, was da eigentlich geht, damit Sie wenn Sie später VHDL usw benutzen eine bessere Vorstellung davon haben, was denn nun das was Sie da eintippen am Ende bedeutet. 

Wir haben selbst von Altera den FPGA und Software benutzt. Quartus heist die da und bietet direkt die Möglichkeit auf Gatterebene zu arbeiten! Bei Xilinx brauchste glaub nen extra Tool. Aber sooo genau hab ich mich mit den Xilinx tools noch nicht beschäftigt. 

Das Problem dabei ist, du kannst die Tools eigentlich nicht bezahlen... Wir hatten durch unseren Prof einen Deal mit Altera, das wir Quartus nutzen können. War meines Wissens nach auch die Vollversion. Das war dann schon ziemlich geil, aber die Kosten dafür kannste meines Wissens nach normal knicken. Ich weiß allerdings nicht, ob es eventuell auch Freeware Versionen gibt, die halt fast nicht können. Hab mich damit nicht beschäftigt, da wir über die Uni die Software-Lizenz eben bekommen haben. Du solltest aber auf jeden Fall einiges an Zeit einplanen um dich in die Software ein zu arbeiten... Wirklich einfach ist das nicht, und man wird ERSCHLAGEN! mit Features und Optionen...

Am Ende brauchste dann halt noch nen FPGA, und die sind nicht wirklich "billig", wobei dir sicherlich schon der kleinste ausreichen wird  Da würde ich mal schauen, ob ich etwas gebrauchtes in der Bucht finde. Hab mal geschaut. >100€ musst du auf jeden Fall einplanen! Eher was in die Richtung >200€. Du brauchst ja einen Chip+Board...

Wirklich "billig" ist das nicht. Wenn dann noch die Software dazu kommt, dann gute Nacht... 

Wenn du es dir gleich richtig "dreckig" geben willst, kannst du dich ja mal mit Cadence beschäftigen  Das ist ein tool mit dem ASICs entwickelt werden. Das wird meines Wissens nach auch von den Leuten hier am Lehrstuhl benutzt. An eine "legale" Version wirst du da aber nicht dran kommen befürchte ich. Die Lizenzen kosten UNSUMMEN! an Geld... Und nen schnellen Rechner solltest du auch haben, wenn du nicht Stunden auf das Ergebnis warten willst... Wobei das bei so nem miniding wie du machen wirst wahrscheinlich kein Thema sein wird. Minuten kann es aber eventuell doch dauern ein Design zu placen und routen.


----------



## AMD (17. August 2013)

Skysnake schrieb:


> Nö, du kannst auch mit Xilinx auf Gatterbasis arbeiten


 Das war mir schon klar nur sein Wunsch klang ja nach Steckbrett und wirklich OR, AND, etc. Bauteile raufpacken ^^


----------



## Skysnake (17. August 2013)

Naja, das wäre schon nen "bischen" Oldschool 

Für was gibts FPGAs? 

Die Dinger sind nur so schweine teuer....

Und wenn man sie hat, will man auch eigentlich VHDL usw nutzen, genau wie die ganzen Bibs von Altera und Xilinx halt. Die bieten ja z.B. fertige DDRx und PCI-E Controller in ihren Chips an, bzw haben sogar FFUs drin, die das schon implementiert haben. Da will man das dann natürlich auch nutzen.

Deswegen ist FPGA-Design auch nochmal was ganz anderes als nen ASIC-Design... Man kann so viel scheise bauen, das gibts garnicht. Wenn man mal selbst ne ASIC-Entwicklung mitbekommen hat, dann wundert man sich echt, das heutige Chips überhaupt funktionieren. Die Komplexität der Probleme kann man sich als Laie gar nicht vorstellen, und selbst wenn man prinzipiell davon Ahnung hat wie ich, ist die Realität nochmals was ganz anders und man ist eigentlich nur am mit den Ohren schlackern


----------



## marvnie1994 (5. Mai 2015)

uff.... auch wenn das thema schon etwas alt ist...
aber jetzt hab ich mich extra angemeldet um auch mal mit zu reden....

ich habe in LogiSim schon erfolgreich eine kleine 4bit-CPU gebaut....
aktuell überlege ich grade ein konzept für eine 32bit-CPU mit text-ein- und ausgabe....

LogiSim bietet den Vorteil, dass man direkt Speichermodule (RAM, ROM) einsetzen kann, welche man dann mit HEX-Code direkt aus einer Datei füttern kann bzw. dann auch wieder in eine Datei speichern kann....
Somit wäre es auch kein Problem einen eigenen kleinen Compiler zu schreiben, der dann aus deiner generierten .ASM-Datei eine .hex datei macht, die du dann in den RAM nzw ROM
deiner selbst gebastelten CPU laden kannst...

Auch kannst du in LogiSim Peripherie wie eine Console u eine Tastatureingabe einfach in deine Schaltung einfügen...

ich hoffe das mein beitrag jetzt nicht vollends in die leere geschossen ist....
außerdem hoffe ich doch sehr, dass ich helfen konnte...

MfG der Muffin (marvnie1994)


----------

