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
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...
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
Das Merkwürdige sind eher nur die vielen Ausrufezeichen! :-)
>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.
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
> 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 ;-)
Hey Aus der Post Place & Route Simulation! Da ich erst ende des Monats mein FPGA bekomme muss ich mich damit erstmal abfinden! mfg-AD
> 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... :-/
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
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.
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
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)
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
Hallo Maximilian! Dir ist aber schon klar, dass deine ALU Implementierung 4 Addierer verwendet obwohl du im Prinzip nur einen Addierer brauchst. Grüße
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)
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
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
`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.
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
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...
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.