Hallo Im Zuge einer Übung soll ich einen kleinen uC nachbauen. Konkret sollte dieser nur ein paar einfache Befehle kennen. Das Ganze soll der Von Neumann Architektur folgen. Ich hab jetzt irgendwie eine kleine Denkbarriere. Wenn ich das richtig verstanden habe, habe ich bei der Von Neumann Architektur einen Speicherbereich, der sowohl Daten als auch Programmbefehle enthält. Mittels eines Program Counters zeige ich dann auf die jeweilige Stelle, deren Programmcode als nächstes ausgeführt werden soll. Ist das bis hierher korrekt? Den Programmcode dekodiere ich dann und führe anhand dessen den jeweiligen Befehl aus (Akku um eines erhöhen, mit Register B tauschen, ...). Woher weiss ich aber nun, welches der nächste Befehl ist? Habe ich da irgendeinen Denkfehler? Oder stehen meine Befehle sowieso in einer "Wurst"? Ich will keine fertigen Lösungen - ich will da selber dran rätseln, interessiert mich ja .. wüsste nur gerne ob ich mit meinen Ideen auf der richtigen Spur bin oder komplett falsch liege :) Danke schonmal :)
Hm die Lösung steckt schon im Namen: ProgrammCOUNTER -> Zähler, Also zur Dekodierungsphase gehört das inkrementieren des PC, Also PC <= PC + 1. Von dieser Adresse wird dann der nächste Befehl geholt. Und wie werden die Sprungbefehle ausgeführt? -> der PC ist ein ladbarer counter. Falls Du Lietratur zum Thema suchst, nimm mal das Detenblatt eines uC wie z.B Atmel AVR und schau Dir das Blockdiagramm an. Oder forsche in der Bibliothek nach Rechnerarchitektur. oder schau mal in dieses Selbstbauprojekt, CPU aus diskreter (kein FPGA/CPLD) Logic: http://mycpu.mikrocontroller.net/index2.htm
ach ich glaube du fragst dich wie die cpu bei neumann unterscheidet, ob das Kommando oder daten sind. Garnicht! Falls der PC auf ein datenwort zeigt, hast du Pech, doie dekosierlogic hält das für ein kommando. Daten und Kommandos zu trennen ist aufgabe des programmloaders. der lädt die daten in eine Ecke des RAM's und befehle in die andere. Und/Oder du hast sogenannte Segmentregister. Dann ist die Adresse des Befehls die summe aus Inhalt segmentregister und PC's. uC sind meistens Harvard Architecture. Hm die Frage wird immer weiter. Ist es letzlich nicht die Frage ob es getrennte datenpfade für kommandos und daten gibt? Also wie DSP? Na verwirren wir mal nicht weiter. Wichtig bei Neumann ist das nicht zw. daten und Kommandos unterschieden/getrennt werden kann.
@FpgaKüchle: Nein, du hast schon recht, das war in etwa worauf ich hinauswollte :) Nochmal kurz wiederholen: Wenn ich das also nun so implementieren will (bin noch Newb auf dem Gebiet), dann nehme ich mir einen Bereich (ich werde erstmal das Programm fix reinprogrammieren), in den das Programm kommt und einen Bereich in den die Daten kommen (sofern ich überhaupt welche habe). Dann initialisiere ich den PC mit dem ersten Befehl in diesem Bereich. Nach jedem Befehl (oder davor? müsst egal sein, is eh parallel, oder?) erhöhe ich den PC um eins und lese dann von dieser Adresse. Dann heissts aufpassen, dass ich nicht über den Speicher hinausgehe. Die Sprungbefehle zeigen dann also auf ProgrammcounterInit + Sprungdifferenz (für einen absoluten Sprung). Die Aufgabenstellung befiehlt eine Von Neumann Architektur, daher is nix mit Harvard :) Das Ganze ist eine sehr einfache Sache, muss auch nicht professionell sein, aber funktionieren sollte es halt :) Also um getrennte Datenpfade und dergl. kümmere ich mich mal nicht. Dann werd ich jetzt mal versuchen herauszufinden wie ich in VHDL einen Bereich als "Speicher" beschreiben kann. Im Prinzip wärs ein großes std_logic_vector array. Aber da gibts sicher was ... Mal stöbern gehen :) Dank dir jedenfalls mal :)
Hi Im Buch "VHDL-Synthese. Entwurf digitaler Schaltungen und Systeme" ist am Ende der Aufbau eines einfachen Prozessors in VHDL beschrieben. Vielleicht kannste dir das mal ausleihen und anschauen. Für Speicherbereich (Daten/Befehlsspeicher) solltest du bei der Implementierung in einem FPGA die integrierten Block Rams nutzen. Zur nur theoretischen Beschreibung tuts aber wirklich ein array von std_logic_vector(31 downto 0) oder ähnliches.
Du kannst auch bei http://www.opencores.org/ vorbeischauen. Dort sind einige µP-Projekte hinterlegt.
@Matthias: Danke, das ist bei unserer Bibliothek verfügbar; habe es mir mal vormerken lassen. ICh werde es derweil bei einem array belassen. Wenn das funktioniert, werde ich mir den extra hierfür verfügbaren Speicher nochmal genauer ansehen. Danke @Stefan: Danke. Ich werde mir mal den einen oder anderen uP zu Gemüte führen. Derzeit schaue ich mir den uC8051 von oregano.at an. Es ist jedoch ein bischen viel um alles auf einmal zu überblicken, aber die eine oder andere interessante Stelle konnte ich schon herauspicken :)
@thomas ich würde auch wie matthias vorgeschlagen ein BlockRAM nehmen. die sind einfach zu handhaben und mit 2 kByte Speicher (programmcode & daten) sollte man für erste zwecke auskommen. was du für einen kleinen uc brauchst sind eigentlich nur multiplexer, eine kleine alu (addition/subtraktion/logische operatoren) eine statemachine (die, die dir den nächsten befehl holt und dekodiert) und evtl. einen micro-code (so hab ich das gemacht) der wiederum die state-machine und die multiplexer (und damit die infrastruktur deiner datenwege) füttert. dann kannst du den ganzen ablauf (und damit auch die befehle die dein uC kann) durch ein stückchen speicher beschreiben (und auch beliebig ändern). hoffe ich hab dich nicht zu sehr verwirrt :-) gruß rene
Nein, nein. Verwirrt sicher nicht :) Jeder Input ist herzlich willkommen :) Eine Frage habe ich jedoch: Wozu brauche ich den Multiplexer? Bei meiner Aufgabenstellung würde mir jetzt so spontan nichts einfallen, wozu ich ihn verwenden könnte, aber vielleicht übersehe ich auch was :)
Na wenn jeder Input willkommen ist, ich habe auch noch was zum verwirren. http://users.etech.haw-hamburg.de/users/reichardt/digsys_vorl.html unter Kapitel 8 ist ein kleiner uC in beispielen teilweise erklärt. Dort sieht man im Übersichtsbild auch einen MUX. Gruß
Danke, das sieht doch sehr gut aus - da ist fast schon zu viel verraten :)
@thomas wenns zuviel verraten war dann überles es (einfach augen zu machen *gg) den (bzw. die) multiplexer brauchst du z.b. wenn du mehrere register hast und diese durch die alu jagen willst. sagen wir mal du hast 3 register und jedes soll als operand a oder b für die alu fungieren. dann brauchst du pro operand einen multiplexer (damit jedes register in der alu "laden" kann). ein anderes beispiel : wenn du ein register als zeiger auf eine speicherstelle brauchst, benötigst du ja eine umschaltung für deinen adress-bus von deinem program-counter zu deinem register (und umgekehrt natürlich). die multiplexer sind sozusagen lediglich "weichen" die deinen datenfluß bestimmen. du brauchst dann nur noch die "weichen" stellen (im wahrsten sinne des wortes :-))) und hin und wieder ein freigabe signal abzugeben. gruß rene
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.