Ich habe gerade das Problem, dass mich bei einer Zuweisung nur die untersten x Bits interessieren. Der Rest soll ignoriert werden. Im folgenden Beispiel sind mean und meanSum sind jeweils vom Typ unsigned. mean ist 16 Bit breit, meanSum sind 18 Bit und FILTER_SIZE ist 4; mean <= meanSum / FILTER_SIZE; <-- hier beschwert sich der Compiler, dass die Vectorlängen nicht passen. Wie kann ich hier explizit nur die untersten 16 Bit vom Ergebnis der Division verwenden? Danke!
blub schrieb: > mean <= meanSum(18 downto 2); Ja, soweit ist das klar. Aber du hast gerade die 2 im Kopf berechnet. In meinem Design habe ich nur FILTER_SIZE. Ein alternatives Problem zu dem obigen wäre also FILTER_SIZE zu logarithmieren.
Klaus schrieb:
Die untersten Bits bekommst du so:
1 | mean <= meanSum(2**FILTER_SIZE-1 downto 0); |
2 | -- oder
|
3 | mean <= meanSum(mean'range); |
Die obersten Bits gehen so:
1 | mean <= meanSum(meanSum'left downto meanSum'left-2**FILTER_SIZE); |
2 | -- oder
|
3 | mean <= meanSum(meanSum'left downto meanSum'left-mean'length); |
4 | -- oder (mit numeric_std)
|
5 | mean <= std_logic_vector(to_unsigned(to_integer(unsigned(meanSum))/FILTER_SIZE,2**FILTER_SIZE)); |
6 | -- bzw.
|
7 | mean <= std_logic_vector(to_unsigned(to_integer(unsigned(meanSum))/FILTER_SIZE,mean'lenth)); |
Ich gehe da mal davon aus, dass zwischen FILTER_SIZE=4 und mean'length=16 eine Korrelatoin besteht. Falls das nicht der Fall ist, dann funktionieren nur die Zuweisungen mit den Attributen richtig...
Ok, sorry, zur Klarstellung: Mich interessieren natürlich die obersten
Bits. Schließlich solls ne Division werden. Hab mich oben verschrieben.
Lothar Miller schrieb:
1 | mean <= std_logic_vector(to_unsigned(to_integer(unsigned(meanSum))/FILTER_SIZE,2**FILTER_SIZE)); |
Da mean und meanSum schon unsigned sind, habe ich aus der Lösung 2 Konvertierungen raus genommen. Und 2**FILTER_SIZE hab ich ersetzt durch mean'length, dann passt die Zuweisung auch immer. Damit komme ich jetzt auf folgende Lösung:
1 | mean <= to_unsigned(to_integer(meanSum / FILTER_SIZE), mean'length); |
Danke euch!
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.