Forum: FPGA, VHDL & Co. Einfachen uC nachbauen (Prinzipielle Fragen)


von Thomas L. (tom)


Lesenswert?

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 :)

von FPGAküchle (Gast)


Lesenswert?

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

von FPGAküchle (Gast)


Lesenswert?

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.

von Thomas L. (tom)


Lesenswert?

@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 :)

von Matthias (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

Du kannst auch bei http://www.opencores.org/ vorbeischauen. Dort sind
einige µP-Projekte hinterlegt.

von Thomas L. (tom)


Lesenswert?

@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 :)

von TheMason (Gast)


Lesenswert?

@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

von Thomas L. (tom)


Lesenswert?

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 :)

von Andreas P. (andreas_p)


Lesenswert?

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ß

von Thomas L. (tom)


Lesenswert?

Danke, das sieht doch sehr gut aus - da ist fast schon zu viel verraten
:)

von TheMason (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.