Hallo @ all Ich benutze einen Spartan 3 XC3S400. Ich habe in einem Block Ram ein Histogramm erzeugt. Dies bedeutet wenn in Speicherzelle 500 ein Wert 50 steht, dann ist der Wert 500 50 mal vorgekommen. Jetzt möchte ich von 7 Speicherzellen den Mittelwert erzeugen. Hierzu benötige ich 7 Multiplikationen. Da die Speicherzelle 500 den Wert 500 widerspiegelt und in dieser Speicherzelle der Wert 50 steht muss ich 50*500 rechnen. Das ganze für die Speicherzelle 500 bis 506 Wie multipliziere ich mit einem FPGA? Als Eingänge habe ich std_logic_vectoren
Schleife, die die RAM-Zellen abtackert und eine Zeile, die multipliziert : tempergebnis <= std_logic_vector (unsigned (vectora) * unsigned (vectorb) + 128); -- addiere 0.5 ergebnis <= tempergebnis (XXX downto 8); -- runden auf das 8. Bit "tempergebnis" ausserhalb des getakteten Prozesses, dann rechnet er in einer Stufe. Das geht meist bis 100 MHz gut.
"tempergebnis" natürlich mindestens so gross, wie die Summe der Vektoren ergeben kann. Und kümmere Dich nicht um Optimierungen, die Synthese nimmt am Ende aller Rechungen nur die Bits, die absolut gebraucht werden. Die nicht benötigten werden abgeschnitten und der Multiplizierer passend weggekürzt. (Meist besteht er aus mehreren 9x9-Multiplieren).
Meine beiden Eingänge sind 9 Bit groß. Demnach muss das Ergebnisregister 18 Bit groß sein. Was ich nicht verstehe ist warum du da 128 auf das Ergebnis addierst und dann durch 128 teilst?
Er addiert 128 und teilt durch 256. Das ist nichts anderes als runden: Runden auf ganze Zahlen kann man, indem man erst 0,5 addiert und dann den Teil hinter dem Komma abschneidet.
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.