Forum: FPGA, VHDL & Co. Pipeline MAC-Unit: Problem mit Latency


von Jens W. (jensw)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bräuchte eure Hilfe, ich komme gerade nicht weiter.
Ich spiele wieder mit meinem Evalboard herum.
Ich möchte eine MAC Einheit bauen um ein Skalarprodukt zu berechnen. Die 
Werte für die Multiplikation kommen von Input und Konstanten aus einem 
RAM. Die Eingangswerte korrekt einspeisen funktioniert richtig.

Ich verwende einen Multiplizierer und einen Addierer. Beide Cores habe 
(zugunsten höherer Durchgangsgeschwindigkeit) eine Latency von 6 Takten.
Ich habe den Multiplizierer und den Addierer hintereinander geschaltet. 
Ich versuche die Latency zu warten, bevor ich das Ergebnis an den 
Ausgang übergebe, aber durch die zeitlich verschobenen Ergebnisse ist 
das Resultat am Ausgang nicht richtig. (Richtig, das ist mein erster 
Versuch für eine Pipeline Struktur)

Die Anwendung sollte mit der Beschreibung auch klar sein, das ist für 
ein neuronales Netz.
Ich hänge euch meine Lösung mit an.
Meine Frage ist nun, wie muss ich die Pipeline für den Multiplizierer 
und den Addierer richtig machen?

Grüße, Jens

von Rolf (audiorolf)


Lesenswert?

Was ich sehe ist, dass das ready nicht benutzt wird. Du timest also 
händisch.
Das passt aber nicht nur funktionell- sondern auch technisch nicht, weil 
das keine echte pipeline ist. Irgendwie hast du da noch eine FSM drüber 
laufen die auch getaktest ist und es sieht fuer mich so aus, als ob 
damit timing -Anforderungen entstehen, d.h. es wird nach dem erwarteten 
Ende der Berechnung sofort ein Ergebnis weitergeschrieben, das noch 
nicht da ist.

So ganz werde ich aus dem Konstrukt eh nicht schlau. Eigentlich schreibt 
man einfach  ein Y = A * B und setzt genügend FFs dahinter, dass es 
technisch passt. Das Gemurkse mit Adder-Cores ist an der Stelle 
eigentlich unnötigt.

von Jens W. (jensw)


Lesenswert?

Hallo Rolf,

danke für deine Antwort.
Allerdings ist es nicht möglich einfach zu schreiben: Y = A * B. Es 
müsste heißen Y <= A * B, aber das wird trotzdem nicht funktionieren. 
Wenn du genau schaust, verwende ich die Cores, da die Berechnungen in 
Float16 laufen.
In einer Signed-Arithmetik würde ich das eh ganz anders machen.

Die FSM brauche ich, da hier die Multiplexer versteckt sind, die die 
Daten zu den richtigen Cores schieben. Durch die Latenz kann ich das 
nicht durchverdrahten, sonst kommt nur Murks raus. Außerdem fehlt noch 
die Aktivierungsfunktion und da will ich die beiden Cores nochmal 
verwenden.

Aber wenn die Pipeline bei mir nicht richtig ist, wie geht es denn 
richtig?

Grüße, Jens

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.