Forum: FPGA, VHDL & Co. Problem mit "Eigenbau" Pipeline ALU


von Mike G. (atom-dragon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hey

Habe vor einer Woche mit VHDL angefangen und sitze momentan an einer 
Pipeline ALU!

Soweit so gut, die Latenz beträgt 5 Takte!
Multiplikation wird über den Hardcore des FPGAs erledigt und Subtraktion 
durch 2. Komplement und Addition!
So, das Problem ist jetzt das die Latenz bei der Addition aus iwelchen 
gründen 6 Takte beträgt!
Und obwohl die Subtraktion gleich aufgebaut ist hat sie nur eine Latenz 
von 5 Takten!

Ich selbst sehe so jetzt keine Fehler die dazu führen können!
Habe den Quellcode mal angehangen und würde mich echt über Hilfe freuen!
Und auch über allgemeine konstruktive Kritik an dem Quellcode!

mfg-AD

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Warum machst du eigentlich eine Pipeline?
Du brauchst so 4*8Bit-Addierer, mit 1 Stufe wäre es 1*32-Bit Addierer, 
du hast also m.E. keine Ressourcen gewonnen. Durch die 4 Stufen brauchst 
du sogar 4 mal mehr Register, als wenn du die Operationen direkt im 1. 
Schritt ausführen würdest.

Dein Reset verdient den Namen (noch) nicht. Wenn der Reset inaktiv ist, 
machst du deine Pipe-Bearbeitung, wenn der Reset aktiv ist: Nichts. Wenn 
du also aus dem Reset wieder herauskommst, geht es einfach dort weiter, 
wo du aufgehört hast.

> Soweit so gut, die Latenz beträgt 5 Takte!
Klar 4 Stufen und 1 zum Eintakten.

> So, das Problem ist jetzt das die Latenz bei der Addition aus iwelchen
> gründen 6 Takte beträgt!
Wie hast du das festgestellt?

Insgesamt verdient diese Beschreibung den Name Pipeline-Bearbeitung nur 
teilweise, denn eigentlich solltest du für alle Operationen mit jedem 
Takt eine neue Aktion auslösen können. So, dass 4 Rechenschritte 
parallel ausgeführt werden. Spätestens bei der Multiplikation geht das 
schief, weil die schön säuberlich an der ganzen Pipeline 
vorbeischlendert...

von Atom-Dragon (Gast)


Lesenswert?

Hey

Also erst mal zum Multiplizierer, hätte erwehnen sollen das der auch 
Gepipelined ist!
So und also wenn ich den Sin einer Pipeline richtig verstanden habe ist 
das so scho richtig den eine ALU mit 32 Bit leuft bei mir mit grade mal 
30 Mhz, die jetzt so im Post Place & Route Simulator mit ca 150 Mhz!
Und ich kann jeden Takt nen neuen Befehl anlegen und bekomme 5 Takte 
später das Ergebnis!
So habe ich den Fehler auch gesehen das die Addition 6 Takte braucht!

Sry, das ich etwas merkwurdig schreibe, schreibe grade von Unterwegs!

Mfg-AD

von Gast (Gast)


Lesenswert?

Das Merkwürdige sind eher nur die vielen Ausrufezeichen!

:-)

von Frager (Gast)


Lesenswert?

>den eine ALU mit 32 Bit leuft bei mir mit grade mal
>30 Mhz, die jetzt so im Post Place & Route Simulator mit ca 150 Mhz!
Naja, die paar Adder packt er auch noch in 150MHz, tät ich mal sagen. 
Man darf auch nicht zu wenig in einen Clock reinstopfen, sonst muss er 
für manche Teilverschaltungen unbedingt raus in die nächste LE, um das 
dortige FF zu bemühen.

von Mike G. (atom-dragon) Benutzerseite


Lesenswert?

Ja man muss bedenken das dort nat. auch noch Logische Funktionen und so 
rein kommen!

Aber eine einfache Alu mit eine Case Anweisung lief bei mir mit wie 
gesagt knapp 25 Mhz!
Und das war mir einfach zu wenig und so läuft es ja eig. ganz gut bis 
auf das Problem mit der Addition!


Naja, ich schaue mal weiter wie ich das Problem lösen kann!

mfg-AD

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Aber eine einfache Alu mit eine Case Anweisung lief bei mir mit wie
> gesagt knapp 25 Mhz!
Woher hast du diese Zahl? Aus den Synthese-Ergebnissen?
(Diese Zahl ist wie die Wählerumfrage am Sonntagnachmittag ;-)

von Mike G. (atom-dragon) Benutzerseite


Lesenswert?

Hey

Aus der Post Place & Route Simulation!
Da ich erst ende des Monats mein FPGA bekomme muss ich mich damit 
erstmal abfinden!

mfg-AD

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Aus der Post Place & Route Simulation!
Was ist der kritische Pfad (Statische Timing-Analyse)?

Einen Addierer (auch mit 32 Bit) sollte ein halbwegs aktuelles FPGA 
schon deutlich schneller als mit 40ns hinbekommen...  :-/

von Mike G. (atom-dragon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hey

So habe mein Konzept mal Komplet umgeworfen und eine kombinatorische ALU 
beschrieben, die höchstens 17ns für eine Operation braucht und so mit 
fast 60Mhz läuft was mir auch soweit reicht!

Die Multiplikation ist diesmal nicht mir einem Hardcore gelöst weil der 
unglaublicherweise 3 ns langsamer war ^^

Naja, habe den Code mal Angehangen, fehlt nur noch die Prüfung ob das 
Ergebnis Null war und Schiebe Operationen!

Falls es iwelche Kommentare gibt wie ich das ganze noch schneller 
bekomme währe ich echt Dankbar!

mfg-AD

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also ich bin jezt nicht so der "Profi" Aber du machst es ja so das du 
immer eine Operation auswählst (je nach Opcode) und dann das ergebnis 
ausgibst.
Häufig wird bei einer ALU aber der Ansatz verfolgt, das alle Operationen 
(ADD/OR/AND/...) parrallel durchgeführt werden und am Ende nur anhand 
des Opcodes entschieden wird (per MUX) welches Ergebnis zur Ausgabe 
gelangt. Wie man das am geschicktesten in HDL beschreibt weiß ich jezt 
nicht direkt aber vieleicht wäre das noch nen Ansatz für dich?
Hat den dein Chip Hardwaremultiplizierer? Ich kann mir ganricht 
vorstellen das das so langsam sein soll.

von Mike G. (atom-dragon) Benutzerseite


Lesenswert?

Hey

Joa, genauso wie du es beschrieben hast Synthetisiert das ISE meinen 
Code!

Ja der Spartan3E hat eig. welche aber, wie gesagt die Rechnen echt 
langsamer!
Denke das liegt am Routen aber naja mir reicht das so erstmal!

mfg-AD

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

Habe da mal was zusammengebaut so wie ich das meinte incl HW 
Multiplikation, Synthese sagt dazu für Spartan3A:

Minimum period: No path found
   Minimum input arrival time before clock: 5.905ns
   Maximum output required time after clock: 8.161ns
   Maximum combinational path delay: 13.925ns

Ist sicher verbesserungswürdig, Lothar Miller wird da sicherlich was zu 
beitragen können :)

Im Übrigen hatte dein Code noch ein Problem mit dem Carry! Dort wird 
nämlich der Vektor wohl irgenwei auf ein Bit mehr erweitert und nicht 
wie gedacht addiert (zumindest gibt es nen Entsprechendes Warning)

von Mike G. (atom-dragon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hey

joa es gibt ne Warnung aber im Simulator funktionierst, ich Benutze 33 
Bit und Benutze das 33. Bit als Carry Out!

Also habe schon mal alles nachgerechnet, kommt auf jeden Fall immer das 
richtige raus!

Aber bei dir ist fals ich mich nicht verguckt habe ein Fehler drin, 
nähmlich Subtrahieren Funktioniert nicht nur durch das Carry setzen 
sonder durch die 2 Komplementäre oder wie es sich schreibt, also z.B:
A = 0111
B = 0011

A - B währe Ja 0100

Um das raus zu bekommen muss man auf B Not anwenden und eine 1 Dazu 
zählen!

Not 0011
=   1100 + 1
=   1101

Und 0111 + 1101 = 10100
Das erste Bit bedeutet wenn es 1 bleibt das man im Positiven Bereich ist 
und bei 0 das man im Negativen gekommen ist!

hmm, naja etwas komisch erklärt aber nur das Carry setzen reicht nicht 
Carry und NOT von B würde gehen!

Und habe deins mal durch die Synthese gejagt und es sieht fast gleich 
aus bis auf den Unterschied mit den Flip Flops da deins getaktet ist und 
so erklärt sich auch die Laufzeit Verkürzung bei der Synthese da die 
Flip Flops hinter den Addierern und so sitzen und danach die Multiplexer 
kommen!
Und so der Kürzeste Pfad ohne die Multiplexer ist!

Habe mir jetzt auch mal ALUs aus Projekten von Open Core angesehen und 
im großen und ganzen sind die auch nicht Schneller, sondern eher 
Langsamer!

Merkwürdig ist auch das bei der Post and Place Simulation ein deutlich 
besseres Ergebnis rauskommt als bei der Synthese normalerweise kam bei 
mir immer schlechtere Ergebnisse raus!

Hänge nochmal meinen Code an, jetzt wird auch erkannt ob das Ergebnis 
Null ist!
Nicht wundern das, das etwas komisch beschrieben ist aber so habe ich 
die besten Ergebnisse!

mfg-AD

von Mars (Gast)


Lesenswert?

Hallo Maximilian!

Dir ist aber schon klar, dass deine ALU Implementierung 4 Addierer 
verwendet obwohl du im Prinzip nur einen Addierer brauchst.

Grüße

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Die Warnung besagt aber das dein Operand 34 Bit lang ist du aber nur 33 
verwendest, klammer das mal ein (Oa+Ob) + ("0...."&Cin)

Ja das stimmt beim Subtrahieren muß man Carry setzen und den zweiten 
Operanden negieren! War auch mehr so als Hinweis gedacht das du mehr 
recource bereit stellst als eigentlich nötig sind.

z.B. Linkschieben ist ne Addition von Oa mit sich selbst, braucht also 
keinen speziellen Befehl ebenso wie XNOR, NAND, NOR, da kanst du beim 
MUX einfach ne Negation einfügen und so weiter...

Insgesamt würde ich dir auf jeden fall raten die ALU zu takten, ich sehe 
da keinen Vorteil drin in die Kombinatorisch zu lösen.

Wenn du möchtest schicke ich dir mal nen Vorlesungskript wo der Entwurf 
eines Mikroprocessors in VHDL schrittweise erklärt wird (auch wenn dort 
noch Linksschieben anstelle von Rechtschieben drinne ist der Prof wollte 
das noch ändern)

von Mike G. (atom-dragon) Benutzerseite


Lesenswert?

Hey

Sry, das ich nicht geantwortet hatte, war leider ein paar Tage im 
Krankenhaus!

Ja, denke jetzt auch das ich das ganze etwas umschreiben werde mal 
schauen wenn ich etwas dran gearbeitet habe lade ich es mal hoch!

Fände es sehr nett wenn du mir das zu kommen lassen könntest!
Kann man hier im Forum was verschicken oder soll ich dir per PN meine 
E-Mail Adresse schreiben ?

mfg-AD

von Mike G. (atom-dragon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hey

So habe eben mal etwas entwickelt und habe jetzt eine getacktete ALU mit 
Eingangs und Ausgangs Registern die mit 79 MHz laufen kann und ne Latenz 
von 2 Takten hat!

Diesmal waren die Hardware Multiplizierer auch schneller aus die in den 
LUTs.
Jetzt bräuchte ich nur noch einen schnelleren Addierer dann währe ich 
wunschlos Glücklich!

Hänge sie mal an, habe aber noch eine Frage da ich jetzt auch mal die 
Timing Constrains genutzt habe frage ich mich ob es für Kombinatorische 
Logik auch so ein Konstrukt wie für den Takt gibt, also das man nur 
einmal angeben muss wie lang der längste Pfad werden darf ?

mfg-AD

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

`Wie schnell solls denn werden? Das mit der schnelleren Addition ist ne 
Sache die ich demnächst auch mal in Angrif nehmen wollte da wird 
wirklich ziemlich viel verbraten. Genauso das XOR... wenns schnell sein 
soll würde ich versuchen mich auf gaaanz wenig Funktionen zu 
beschränken, habe selber gerade ne ALU nachprogrammiert, mit ADD, AND, 
OR, NOT + die Möglichkeit ein Eingangssignal zu invertieren (für SUB, 
NAND, NOR...) das läuft so um die 110 Mhz.
Was hast du eigentlich genau vor? Habe vor kurzem gelernt durch nen 
Hinweis von Lothar, das oft die Ausgangs/Eingangspads sehr viel Delay 
verursache, wenn man später das ganze intern noch verdrahtet wirds 
schneller, und das ist tatsächlich so.

von Mike G. (atom-dragon) Benutzerseite


Lesenswert?

Hey

Ja das mit den Ausgangs/Eingangspads hatte ich auch scho iwo gelesen!

Wie viel Bit hatte deine ALU denn ?

Wegen der schnellen Addition hatte ich letztens etwas geschrieben was 
wenigstens bis 16 Bit schneller war als nur das + Zeichen!

Ich habe Blöcke von 4 Bit genommen die einzeln ausgerechnet einmal mit 
Carry einmal ohne und am Ende ausgehen vom ersten Block entschieden 
welcher der richtige ist, ist jetzt etwas doof erklärt aber vllt. kannst 
du es dir ja Vorstellen!
Das war bis 16 Bit schneller aber 32 war dann langsamer!

mfg-AD

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Meine ALU hat 32bit.
Jupp kann ich mir vorstellen, nennt sich Carry-Select-Adder. Bei dem 
Verfahren kannst du noch etwas rausholen wenn du die blöcke nicht gleich 
groß machst sonder beim LSB anfängst mit einem 4-bit Addierer, mit dem 
Carry wählst du dann das Ergbnis er nächsten 5 -bit Addition, das Cary 
davon der nächsten 6 ... und so weiter also im Prinzip
1
2 8 7 6 5 4
2
2 8 7 6 5
Was du noch versuchen kannst ist ein sogenannter Carry-Look-Ahead 
Addierer
Ob das in nem FPGA was bringt müßte man mal probieren...

von Sina (Gast)


Lesenswert?

Jaja so ist das =)

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.