Forum: FPGA, VHDL & Co. pipeline


von paul (Gast)


Lesenswert?

hallo,
kann jemandem mir Vielleich helfen,ich will in einem 16 Bit Prozessor
ganz normale und einfache pipeline dran entwicklen,können sie mir
vielleicht sagen ,was ich genau da an den prozessor ändere....

von Peter D. (peda)


Lesenswert?

Du solltest Dich vielleicht erstmal informieren, wovon Du da sprichst.

Einen CPU-Chip kannst Du nicht einfach aufschleifen und nochwas
"reinbauen".


Peter

von paul (Gast)


Lesenswert?

also ich habe eigentlich den 16 bit prozessor bis jetzt selbst weiter
entwickelt und getestet,mit vhdl .Ich arbeite in einem projekt an der
uni,ich will jetzt dass für mich statt ein befehl, 3 bis 5 befehle
gleichzeitig bearbeiten,der 16 bit pmp besteht ganz normal aus
steuerwerk ein operationwerk ein ram,wenn es ihnen weiter helft,wenn
nicht dann schreiben sie mir bitte dann kann ich ihnen noch weiter mein
16 bit beschreiben ,danke ersmal für die info peter und johannes

von Andreas Auer (Gast)


Lesenswert?

Hi.

Einen Prozessor mit einer Pipeline auszustatten ist nicht ganz so
einfach. Auch bedeutet das eigentlich nicht, dass du 3-5 Befehle
gleichzeitig abwickeln kannst.
Eine Pipeline ermöglicht dir, während dein Prozessor einen Befehl
ausführt zum Beispiel den nächsten Befehl schon aus dem RAM zu holen.
Deshalb benötigt der Prozessor zum Beispiel für einen Befehl nicht 5
Clockzyklen sondern nur 1. Das bedeutet natürlich einen
Geschwindigkeitsgewinn um den Faktor 5.

Du musst praktisch deine Architektur unterteilen. Wenn du das zum
Beispiel so machst:
  * Befehl aus Programmspeicher holen
  * Daten aus RAM holen
  * Befehl ausführen

Wenn nun ein Befehl fertig aus dem Programmspeicher geholt wurde, dann
holt der nächste Befehl aus dem RAM die für den Befehl benötigten
Daten. Gleichzeitig wird aber auch schon wieder der nächste Befehl aus
dem Programmspeicher geholt! Danach folgt das Ausführen des 1. Befehls
und nebenbei wird schon der 3. Befehl und das 2. mal die Daten geholt.

Das Prinzip ist ja eigentlich relativ einfach und einleuchtet. Es gibt
aber auch einige Hindernisse auf die du aufpassen musst.
Das wären zum Beispiel, wenn dein Programm einen Sprungbefehl enthält,
dann dürfen, die 2 nachfolgenden Befehle, die sich der Prozessor schon
geholt hat, nicht mehr ausgeführt werden, da diese ja unter dem
Sprungbefehl stehen würden, und vorerst gar nicht ausgeführt werden
sollen!
Deshalb heissts aufpassen bei Sprungbefehlen, Funktionsaufrufen und
dergleichen.

mfg
Andreas

--
Student of Telematics               http://mikrocontroller.at.tt
Graz, University of Technology

von Hagen (Gast)


Lesenswert?

Es sei denn man baut in die Pipeline eine Branch-Prediction ein und
diese hat mit einer Trefferwahrscheinlichkeit von 75% den Sprung
korrekt vorrausgesagt. Also liegen in der Pipeline schon mit 75%
Wahrschenlichkeit die richtigen Daten und Befehle vor.
Damit das noch besser funktioniert besteht die Pipeline nicht nur aus
Speicherzugriff + Befehl ausführen, sondern meistens aus
- Programmcode laden
- Programmcode dekodieren zu Befehl
- Branchprediction
- Daten holen
- Befehl ausführen

So, eine Pipelin macht aberim Grunde keinen Sinn, mann sollte schon 2
Pipelines benutzen, die quasi in parallel arbeiten. Die Idee besteht
dabei das das Befehlset ja aus ganz unterschiedlichen Befehlen
bestehen. Während eine Gruppe nur Daten hin- und herschiebt, gibt es
Gruppen die aufwändige Berechnungen durchführen und eine Recheneineheit
benötigen, eine Gruppe die Sprunge ausführen und die Flags dazu
auswerten usw. usw. Nun bei mehrern Pipelinen ist es sehr sehr
wahrscheinlich das immer nur eine dieser Pipelines zb. Speicher kopiert
und die andere die Recheneinheit benötigt.

Ich weis nur das Intel einige seiner CPU's wieder vom Markt nehmen
musste weil damals als das Thema Pipeline aktuell wurde selbst in
fertig ausgelieferten CPU's fehler auftraten.

Gruß Hagen

von paul (Gast)


Lesenswert?

danke erstaml für die info,
aber ich brauche vielleicht noch eine richtige helfe das bedeutet,wie
funktiniert eine pipeline und was für bauteile brauche ich da also ich
habe ein steuerwerk,die frage ist brauche ich beim pipeline 2 stw?ich
habe ein systembus ......ich will genaue wissen wo soll ich komplett
änderen,vielleich konnen sie mir ein beispiel schicken?oder noch weiter
erklären wie ich es genau ändern muss.
gruß paul,

von C3PO (Gast)


Lesenswert?

Wie zuvor schon gesagt wurde, du musst deinen Core in Blöcke
unterteilen, sowie die Abarbeitung eines Befehles auch:
- Befehl aus Programmspeicher holen
- Befehl dekodieren
- Daten aus RAM holen
- Befehl ausführen
- Daten abspeichern

jeder Block bekommt jetzt Flip-Flops als Eingang, in denen die gerade
auszuführende Arbeit/Daten abgelegt werden.
Das bedeutet, dass mit jedem Clock-Impuls die Infos in den nächsten
Block geschoben werden.

Aufpassen muss man nur wie bereits erwähnt, bei:
1. Sprung-Befehlen
    hier müssen dann evtl. die bereits geholten Befehle verworfen
werden.
2. Du hast bspw. folgenden Code:
     move R0,#500
     move R1,#200
     adc  R0,R1
     move R0,R7
  Da der adc-Befehl und der nachfolgende move-Befehl "gleichzeitig"
ausgeführt werden, dass in R7 der falsche Wert abgelegt wird. Weiß
jetzt nicht mehr genau wie der Fachbegriff hierfür ist, müsste ich erst
nachschauen.

Also zusammengefasst:
Jeder Block (Alu, Codefetch, usw.) bekommen Register am Eingang, alle
Register haben einen gemeinsamen Clock-Eingang
besondere Beachtung gibt es bei Sprüngen und wie in Fall 2 beschrieben!

von paul (Gast)


Lesenswert?

Danke bis jetzt für die info,
und Wenn jemandem noch mehr weisst, und mich weiter helfen kann ,dann
wäre ich sehr dankbar dafür,
cio paul

von Hagen (Gast)


Lesenswert?

>> Da der adc-Befehl und der nachfolgende move-Befehl "gleichzeitig"
>> ausgeführt werden, dass in R7 der falsche Wert abgelegt wird. Weiß
>> jetzt nicht mehr genau wie der Fachbegriff hierfür ist, müsste ich
>> erst nachschauen.

Das ist ein Miss, und die Pipeline muss einen Waitstate einlegen um
sicherzustellen das das Register R7 auch korrekt befüllt wurde. Deshalb
gibt es auch eine U und V Pipe bei vielen Intel CPU's und nur in der U
Pipe können ganz bestimmte Befehle ausgeführt werden. Damit solche
Misses nicht zu häufig auftreten, bzw. als Optimeirungsmethode, wird in
neuen Compilern ein sogenanntes Instruction-Shuffeling durchgeführt.
Dabei werden die Befehle sequentiell so angeordnet das sie möglichst
abwechselnd in der U und dann V Pipe ausgeführt werden können, sich
also nicht gegenseitig beeinflussen oder benötigen. Nur dann würde die
CPU auch tatsächlich aus zB. 5 Takt-Befehlen diese zu 1 Takt Befehlen
ausführend können.

Ich meine gelesen zu haben das die ganze Pipline-Logik heutzutage mehr
an Raum auf den Chips verbrauchen als der Rest der CPU. Keine leichte
Aufgabe.

Gruß Hagen

von C3PO (Gast)


Lesenswert?

>Das ist ein Miss, und die Pipeline muss einen Waitstate einlegen um
sicherzustellen das das Register R7 auch korrekt befüllt wurde.
Da kann ich dir leider nicht ganz zustimmen, sicherlich ist das eine
Möglichkeit, aber es geht auch anders ! Eben so wie ich beschrieben
habe !!!


>Damit solche Misses nicht zu häufig auftreten, bzw. als
Optimeirungsmethode, wird in
neuen Compilern ein sogenanntes Instruction-Shuffeling durchgeführt.
Richtig das kann man machen !

>Ich meine gelesen zu haben das die ganze Pipline-Logik heutzutage mehr
an Raum auf den Chips verbrauchen als der Rest der CPU. Keine leichte
Aufgabe.
Kann ich dir glaube ich mich zu erinnern nur zustimmen, aber der
Aufwand lohnt sich, wenn man einen Prozessor schneller machen möchte,
ohne den Takt zu erhöhen. Irgendwann kann man das  ja auch nicht mehr
!!!

von C3PO (Gast)


Lesenswert?

@Paul: schau dir mal die folgende Seite an:
http://www.cs.iastate.edu/~prabhu/Tutorial/title.html

@Hagen: wenn ich ne Seite gefunden habe, die das beschreibt, was ich
meine schreibe ich sie hier. Es geht, habe es selbst während des
Studiums gehört. man nimmt einfach den Pfad nach der Alu und holt ihn
direkt in Alu-Pfad (anstatt aus dem Register-File).
siehe auch
http://www.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/forward.html
funktioniert aber glaube ich nur bei einem bestimmten Proz. (DLX glaube
ich war das, müsste ich aber noch mal nachschaun, wenn ich das Zeug
finde) !!!

PS.: schaut euch doch mal die Seite genauer an, scheint ganz gut zu
sein.

von Matthias (Gast)


Lesenswert?

Hi

man kann mit langen Pipelines aber auch ganz toll auf die Schnauze
fallen wie es Intel mit seiner Netburst Architektur gerade ganz toll
vorführt. Ultralange (WIMRE um die 30 Stufen beim Prescott) Pipeline
und trotzdem miese Performance im Vergleich zu anderen Prozessoren bei
gleichem Takt. Es bringt einfach nichts ein so lange Pipeline zu bauen
die dann die Hälfte der Zeit leer läuft. Aber hauptsache der Takt ist
schön hoch.

Matthias

von paul (Gast)


Lesenswert?

Danke alle für die info,
falls noch seiten gibt oder wichtige info dann wäre ich noch sehr
dankbar.
@ C3P0 und Hagen-danke für die info,

@C3P0 wenn du noch mit pipeline gut umgehst,kannst du vielleicht mir
mehr helfen,ich kann dir mehr info geben von mein prozessor,kann sein
dass du so eine lösung für mich findest?aber wegen den Internetseite
war ein sehr gute idee,ich muss die komlett lesen und verstehen das
dauert,

gruß paul

von C3PO (Gast)


Lesenswert?

30 Stufen ist ja bekloppt, das ding besteht ja nur noch aus Registern !
Kein Wunder dass die so teuer sind. Ja ich werde mir das auch mal
anschauen.

von paul (Gast)


Lesenswert?

@C3P0 mein cpu besteht ganz normal aus opw und stw ,also opw besteht aus
ar und pc und akku und ipr und ...ganz normale register aner nur ein
systembus,ich habe schon angefangen ersmal mit diese ordnung was du mir
vorher erklärst hast,wenn du noch idee hast dann schreib es mir
cio

von C3PO (Gast)


Lesenswert?

@Paul: kannst du mal ein Bild/Zeichnung deiner CPU machen, dann kann ich
es mir besser vorstellen/ansehen.

was ist opw, stw, ar und ipr, ich weis nicht was du damit meinst !

von Thomas B. (Gast)


Lesenswert?

Hallo !!

Ich würde das Buch "Prozessorbau" von Christian Siemers empfehlen. Da
steht eigentlich alles drinnen was man für den (grundsätzlichen)
Prozessorentwurf braucht; auch Pipelineing.

Vielleicht kannst du dir das ja in (d)einer (Uni)Bibliothek ausleihen.

Schöne Grüße,
Thomas

von paul (Gast)


Lesenswert?

Kann jemandem mir noch weiter helfen,ich habe bis jetzt ein paar
schritte gemacht aber so richtig nicht,hat jemandem ein beispiel für
mich?oder ein paar tips,die mir noch weiter den weg zeigen????????
cio paul

von C3PO (Gast)


Lesenswert?

Hallo, mir ist da wieder ne gute Seite mit vielleicht Anregungen
eingefallen:
http://www.opencores.org/browse.cgi/by_category

von Tipper (Gast)


Lesenswert?

Ein Nachteil der Pipeline ist, daß es fast nicht möglich ist, anhand
abgezählter Befehlsfolgen die Zeitdauer einer Programmsequenz
zuermitteln.
Man weiss eben nie wie die Pipeline den Befehlsablauf optimiert.

Tipper

von Matthias (Gast)


Lesenswert?

Hi

Das Verhalten einer Pipeline ist 100%ig vorherzusagen. Wär ja schlimm
wenn nicht. Es ist ab einer gewissen Anzahl Stufen und der Verkopplung
mit Sprungvorhersage, Cache usw. allerdings derartig komplex das man es
als Mensch kaum noch erfassen kann.

Matthias

von Tipper (Gast)


Lesenswert?

Matthias:

Sicherlich, ein bedingter Sprung wird ausgeführt oder er wird nicht
ausgeführt. Dies ist auch eine 100%ige Vorhersage. Der praktische Wert
dieser Aussage ist, wie du selber schreibst, gleich Null.


Tipper

von Matthias (Gast)


Lesenswert?

Hi

das ändert aber nichts daran das ich zu jedem Zeitpunkt exakt
vorhersagen kann wie sich der Prozessor verhält solange die komplette
Vorgeschichte bekannt ist.

Matthias

von Hagen (Gast)


Lesenswert?

Das ist richtig, aber du kannst dies nur für eine ganz bestimmte
Befehlssequenz machen. Denn die konkreten Taktanzahlen einer Pipeline
hängen vom der aktuellen Befehlssequenz, den internen Register und
Flaginhalten ab. D.h. man muß um die Taktanzahlen auszurechnen immer
den kompletten Code analysieren. Je mehr verschiedene Befehle es gibt
je höher wird die kombinatorische Vielfalt an möglichen
Befehlssequenzen. In den meisten Fällen ist diese so groß das es eben
nicht mehr möglich sein wird eine einheitliche Vorhersage der
benötigten Taktzyklen abzugeben. D.h. theoretisch ist alles exakt
vorherzusagen, praktisch gesehen kann man bei Piplined Systemen nur
unter sehr engen vorgegebenen Bedingungen die Taktanzahl für ein
kleines Stückchen Programmcode vorrausberechnen. Kommt nun noch ein
Interrupt dazwischen verändert sich wiederum alles, sogar der Zeitpunkt
wann der IQR auftritt ist entscheidend.

Ich gebe Tipper als absolut recht wenn er sagt:

"Ein Nachteil der Pipeline ist, daß es fast nicht möglich ist, anhand
abgezählter Befehlsfolgen die Zeitdauer einer Programmsequenz
zuermitteln."

Und er damit einen Vergleich einer piplined CPU mit zB. dem AVR
unterstellt. Es ist eben NICHT mehr möglich einfach mal die Befehle
abzuzählen und in Taktzyklen umzurechnen.

Gruß Hagen

von Peter D. (peda)


Lesenswert?

Ich glaube nicht, daß eine Pipeline in einer FPGA-CPU einen Sinn macht.

Wenn es Dir auf Geschwindigkeit ankommt, dann bist Du mit einer
standard GHz-CPU besser.

Und eine effektive Pipeline wird mindestens soviel Gatter belegen, wie
die CPU, wenn nicht noch mehr. Der FPGA-Platz ist einfach zu kostbar,
um ihn mit einer Pipeline zu vergeuden.
Lieber die CPU selber aufbohren (z.B. 32 Bit), das bringt mehr.


Eine FPGA-CPU macht ja nur in Nischenanwendungen wirklich Sinn
(spezielle Hardware-Algorithmen).

Und eine Pipeline als Hobbyprojekt, nur um zu beweisen, daß es geht,
dazu wäre mir meine Arbeitszeit viel zu kostbar.
Schließlich ist ein Studium auch dazu da, effektives Arbeiten zu
lernen, d.h. die optimale Balance zwischen Fertigteil und
Selbermachen.


Peter

von Cpt (Gast)


Lesenswert?

Bezüglich des Sinnes einer Pipeline in einer "Software" CPU kann ich
nicht viel sagen,
(bin gerade am Anfang der Vorlesungen Embedded Systems und Modern
approaches in digital design) allerdings wurde uns das Pipeline Prinzip
an Hand des PIC16F84 nähergebracht. Und der ist schon
100%ig vorhersagbar. Allerdings handelt es sich auch nur um eine
Pipeline für (soweit ich mich gerade erinnere) 2 "Stufen" , so daß
der einzige Pipelinestall bei einer call oder goto Anweisung auftrat
... aber vielleicht kommt da ja noch mehr :-)

Ach und btw: uns wurde gesagt in den Softwareprozessoren läge die
Zukunft ... allerdings war das nicht der Prof :-)

Grüße Cpt

von C3PO (Gast)


Lesenswert?

@Paul: wenn ich mich nicht irre, dann war vor ein paar Stunden ein neuer
Thread da, wo isser denn hin ???

von C3PO (Gast)


Lesenswert?

Entweder sollte ich ne neue Brille kaufen, nen Computerkurs besuchen
oder der andere Thread ist schon wieder fort !

von paul (Gast)


Lesenswert?

hallo C3P0,
erstmal wie war dein Urlaub?
Jemand hat das gelöscht 2 mal ,eigentlich es ist komisch.
Haben sie mein mail gesehen wo ein paar zeichnung drau sind?

von C3PO (Gast)


Lesenswert?

Zunächst einmal:
Macht es überhaupt Sinn als Privatmann sich eine eigene CPU in einem
FPGA zu planen ?
Mit Sicherheit nicht,
es sei denn man will etwas lernen oder man beschäftigt sich aus
schulischen Gründen damit !
Aber nichts desto trotz ist es ein sehr interessantes Thema, das man
sich durchaus vornehmen sollte.

Danke,
der war wesentlich wärmer als er hier in Deutschland gewesen wäre !!!
Na dürfte ja nicht so viele geben, die das hier machen dürfen !!!
Vielleicht schreibt ja mal derjenige,der es war, warum er das gemacht
hat !!!
aber ich glaube es sind noch mehr Threads als deiner verschwunden !

Ja ich habe mir die Zeichnungen mal angesehen !

Um sich das Leben zu vereinfachen:
1. Trennen von Programmcode und Daten, dann hast du mein Fetch und WB
keine Probleme des gleichzeitigen Zugriffs auf den Speicher
2. du solltest einen Befehlssatz haben, der Operationen nur mit dem
Akku und einem 2. Register unterstützt (könnte bei dir das OPR-Reg.
sein)
   Transfers: nur vom MEM -> AKKU oder MEM <- AKKU oder MEM -> 2.Reg
oder MEM <- 2.Reg



Du könntest zwischen dem Fetch/Decode und Execute/MEM-Data/WB eine Pipe
einbauen
Du müsstest dazu dein Steuerwerk komplett neuschreiben !!!
Ablauf:
1. PC->AR
2. Instruction ins MAR-Reg.
3. jetzt wird der Befehl dekodiert

hier kommt die PIPE hin:
hier benutzt du ein n-Bit Flip-Flop, dass die folgenden Signale
aufnimmt:
a. alle Signale aus der Dekodiereinheit
b. die Signale die an die Akkumulatoreinheit gelegt werden sollen
c. Sonstige Signale zu Steuerzwecken
d. 1 Signal, das auskunft darüber gibt, ob sinnvolle Infos in der PIPE
sind oder ob ein STALL durchgeführt werden soll

in der 2. Stufe:
4. Ausführen des Befehls (Akkumulatoreinheit)
5. zurückschreiben des Wertes in AKKU/2.Reg


Anmerkungen:
Aufgrund deines bisher gewählten Aufbaus, wirst du wohl einiges ändern
müssen!!!
Aufpassen musst du noch bei Sprungbefehlen. hierzu ist es notwendig,
die Stall Info in der PIPE zu setzen, wenn ein Sprung ausgeführt wurde
!!! Dann wird der vorhergehende Befehl nicht ausgeführt und es geht
nach dem Sprung ganz normal weiter!!!

So ich hoffe ich habe dir ein wenig weiterhelfen können und nicht
allzuviel vergessen, aber ich denke es gibt hier einige die dann etwas
dazu schreiben werden...

wenn noch Fragen/Probleme sind als her damit

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.