Problem mit Vektorbreite in VHDL

Gast #543148
Lesenswert?

Ich möchte folgendes Berechnen:

result_temp <= std_logic_vector(512 + unsigned(phase) * 160);

später dann result_temp herunterschneiden.

phase hat nur vier bit (3 downto 0)

Damit hätte ich erwartet, daß das REsultat minestens mal 10 Bit breit 
ist. Komischerweise bemängelt Modelsim, die Bitbreite des tempvektors 
und will ihn auf 7 downto 0 haben!

Wie ist das zu verstehen ?
#543198
Lesenswert?

@ Larry

>result_temp <= std_logic_vector(512 + unsigned(phase) * 160);

Das Ergbnis muss mind. 12 Bit haben.

>später dann result_temp herunterschneiden.

???
herunterschneiden? Du meinst wohl eher die unteren Bits abschneiden?

>phase hat nur vier bit (3 downto 0)

Eben, die Zhal 160 ist eine 8 Bit Zahl, macht im Produkt 12 Bit. Die 
+512 sind da auch mit drin.

MFG
Falk
Gast #543948
Lesenswert?

Eigentlich sollte das Ergebnis nur 4 Bit haben, es werden die Funktionen 
aus numeric_std verwendet.

unsigned(phase) -> 4 bit

multiplikation unsigned(4 bit) mit natural(160) -> ergibt unsigned(4 
bit)

addition natural(512) mit unsigned(4 bit)  -> ergibt unsigned(4 bit)

cast auf std_logic_vector -> 4 bit

Grüße
Klaus
Gast #544055
Lesenswert?

Richtig - es wird numeric lib bneutzt, aber woher weisst Du das?

Egaal - ich verstehe das so oder so nicht. Ich habe sonst eigentlich 
immer den Fall, daß mir Modelsim immer die Vektorbreite angibt: Wenn ich 
z.B. einen 7-Bit-Vektor mit einem 4-Bit-Vektor multipliziere, meckert er 
solange, bis ich den temp-vektor auf die gültige Breite stelle.

Wieso sollen das nun weniger sein? Wenn ich mit 512 multipliziere, 
kommen doch mindestens 9 Bit raus!

Jetzt mal anders gefragt: Wie muss ich das formulieren, daß es stimmt 
und ich keine Bits verliere?

Muss ich Nullen voranstellen?

Ich habe nun mal einfach 12 Nullen avor gemacht und erhalte: Length 
expected = 16, actual = 32. Das ist mir schleierhaft, warum.

Wer kann mir das erklären?
#544291
Lesenswert?

> Richtig - es wird numeric lib bneutzt, aber woher weisst Du das?

Weil es die von Dir verwendeten Funktionen nur im numeric_std package 
gibt.

> Wieso sollen das nun weniger sein? Wenn ich mit 512 multipliziere,
> kommen doch mindestens 9 Bit raus!

Die Funktion "*" im package numeric_std zwischen einer natürlichen Zahl 
A (das ist eine Zahl größer 0) und unsigned B ergibt ein Ergebnis mit 
der Länge der unsigned Zahl B!! Die Funktion (oder der Compiler) schaut 
nicht nach, wie groß die Zahl A ist.
Wenn Du eine bestimmte Länge brauchst, muß Du vorher auf die Läge 
konvertieren.

std_logic_vector(to_unsigned(512,12) + unsigned(phase) * 
to_unsigned(160, 12));

Das ergibt einen 12 Bit langen Vektor.

Klaus
Gast #546486
Lesenswert?

So, nach der obigen Methode will er einen 16Bit Vektor haben und nicht 
12. Allerdings ist mir das auch wieder etwas logischer, da die 160 als 
X-Bit-Vektro mindestens mal 7 wären (128++) und der andere Faktor mit 9 
Bit ankommen. Das wäre dann 16. Ich frage mich nur, warum er das nich 
tvon alleine sieht.
Gast #546496
Lesenswert?

Mein Fehler.

Nun hat man eine Multiplikation zwischen 2 unsigned Zahlen. Das Ergebnis 
ist dabei wieder unsigned und die Länge ist die Summe der Längen (4 + 12 
= 16).

Folgendes sollte richtig sein:

std_logic_vector(to_unsigned(512,12) + unsigned(phase) *
to_unsigned(160, 8));


Klaus

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