Forum: FPGA, VHDL & Co. VHDL: Bits bei einer Zuweisung abschneiden


von Klaus (Gast)


Lesenswert?

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!

von blub (Gast)


Lesenswert?

mean <= meanSum(18 downto 2);

von Klaus (Gast)


Lesenswert?

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.

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


Lesenswert?

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...

von Klaus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.