VHDL: Bits bei einer Zuweisung abschneiden

Gast #2035707
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!
Moderator (Firma: Titel) Persönliche Seite #2035794
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...
Gast #2035843
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren